Da Fehlermeldungen gehen oft stderr
nicht stdout
.
Ändern Sie den Aufruf in:
taskkill /im "test.exe" /f >nul 2>&1
und alles wird besser.
Das funktioniert, weil stdout
es sich um Dateideskriptor 1 und stderr
gemäß Konvention um Dateideskriptor 2 handelt. (0 ist stdin
übrigens.) Der 2>&1
kopiert den Ausgabedateideskriptor 2 vom neuen Wert 1, der gerade auf das Nullgerät umgeleitet wurde.
Diese Syntax ist (lose) von vielen Unix-Shells entlehnt, aber Sie müssen vorsichtig sein, da es subtile Unterschiede zwischen der Shell-Syntax und CMD.EXE gibt.
Update: Ich weiß , dass die OP versteht den besonderen Charakter der „Datei“ genannt NUL
Ich bin hier zu schreiben, aber ein Kommentator nicht und so lassen Sie mich auf diesen Aspekt mit ein wenig mehr Details abzuschweifen.
Zurück zu den frühesten Versionen von MSDOS wurden bestimmte Dateinamen vom Dateisystemkernel vorbelegt und verwendet, um auf Geräte zu verweisen. Die früheste Liste der Namen enthalten NUL
, PRN
, CON
, AUX
und COM1
durch COM4
. NUL
ist das Nullgerät. Es kann immer zum Lesen oder Schreiben geöffnet werden, es kann ein beliebiger Betrag darauf geschrieben werden, und Lesevorgänge sind immer erfolgreich, geben jedoch keine Daten zurück. Zu den anderen gehören der parallele Druckeranschluss, die Konsole und bis zu vier serielle Anschlüsse. Ab MSDOS 5 gab es mehrere reservierte Namen, aber die Grundkonvention war sehr gut etabliert.
Als Windows erstellt wurde, begann es als ziemlich dünne Anwendungswechselschicht über dem MSDOS-Kernel und hatte daher dieselben Dateinamenbeschränkungen. Als Windows NT als eigenständiges echtes Betriebssystem erstellt wurde, wurde angenommen , dass Namen wie NUL
und COM1
zu weit verbreitet sind, um ihre Beseitigung zu ermöglichen. Die Idee, dass neue Geräte immer Namen erhalten, die zukünftige Benutzer dieser Namen für tatsächliche Dateien blockieren, ist jedoch offensichtlich unvernünftig.
Windows NT und alle folgenden Versionen (2K, XP, 7 und jetzt 8) verwenden den viel ausgefeilteren NT-Namespace aus dem Kernel-Code und sorgfältig konstruierten und höchst nicht portierbaren Benutzerbereichscodes. In diesem Namensraum sind Gerätetreiber im \Device
Ordner sichtbar . Um die erforderliche Abwärtskompatibilität zu unterstützen, gibt es einen speziellen Mechanismus, der den \DosDevices
Ordner verwendet, der die Liste der reservierten Dateinamen in einem beliebigen Dateisystemordner implementiert. Benutzercode kann diesen internen Namensraum mithilfe einer API-Ebene unterhalb der üblichen Win32-API durchsuchen. Ein gutes Tool zum Erkunden des Kernel-Namespace ist WinObj von der SysInternals-Gruppe bei Microsoft.
Eine vollständige Beschreibung der Regeln für legale Namen von Dateien (und Geräten) in Windows finden Sie auf dieser Seite von MSDN sowohl informativ als auch entmutigend. Die Regeln sind viel komplizierter als sie sein sollten, und es ist tatsächlich unmöglich, einige einfache Fragen zu beantworten, wie z. B. "Wie lange ist der längste legale, vollständig qualifizierte Pfadname?".