Wie kann ich einen Prozess mit hoher Priorität starten und gleichzeitig seine Standardausgabe (stdout) in eine Datei umleiten?
Das funktioniert nicht:
start /HIGH my_little_proggy.exe > output.txt
Antwort1
Das Flag /B ist das, wonach Sie suchen. Folgendes funktioniert (zumindest unter Windows 10):
start /HIGH /B my_little_proggy.exe > output.txt
Antwort2
[ EDIT #2 - wichtige Korrektur ] Wie @TarnayKálmán (der OP) in einem Kommentar anmerkte, startet die Shell untergeordnete Prozesse nicht mit ihrer eigenen Prioritätsstufe, sondern mit der standardmäßigen normalen Priorität. Auf API-Ebene scheint cmd aufzurufenProzess erstellenohne eines festzulegen PRIORITY_CLASS
( dwCreationFlags
im Gegensatz zur Übergabe eines eigenen GetPriority()
), was dazu führt, dass der untergeordnete Prozess mit der Standardeinstellung ausgeführt wird NORMAL_PRIORITY_CLASS
.
Als Folge davon start /HIGH call my_little_proggy.exe ^> output.txt
starten Befehle wie eine sekundäre cmd.exe-Shell unterhochPriorität, die wiederum die Umleitung übernimmt und ausführt my_little_proggy.exe
– aber mit normaler Priorität. Aus diesem Grund beantwortet der folgende Beitrag nicht die ursprüngliche Frage zur Umleitung der Ausgabe, wenn start /HIGH
.
Ich habe den Schalter aus meinem vorherigen Beitrag herausgeschnitten /HIGH
und den Rest unten gelassen, da die Techniken im Allgemeinen funktionieren start
und jemand dies möglicherweise nützlich findet.
So wie es geschrieben ist, >
bezieht sich die Umleitung auf den start
Befehl selbst, nicht auf den Befehl, der start
tatsächlich ausgeführt wird (in Ihrem Beispiel my_little_proggy.exe
). Dies erklärt auch, warum start /B
es funktioniert, da der untergeordnete Prozess dieselbe Konsole verwendet (vorausgesetzt, my_little_proggy.exe
es handelt sich auch um eine Konsolenanwendung).
Um die Ausgabe des start
Befehls 'ed umzuleiten, müssen Sie (a) den Befehl über eine sekundäre Shell ausführen (entweder cmd /c
oder einfach call
) und (b) das maskieren, >
damit es von der Zeile nicht als Sonder-/Umleitungszeichen interpretiert start
, sondern beibehalten und an die untergeordnete Shell weitergegeben wird, die ausführt my_little_proggy.exe
. Dies sollte mit einer der folgenden Methoden geschehen (beachten Sie das ^>
).
start call my_little_proggy.exe ^> output.txt
start cmd /c my_little_proggy.exe ^> output.txt
[ BEARBEITEN #1 ] Die
call
„oder“ cmd /c
-Anforderung wurde im obigen Absatz hinzugefügt. Der Grund dafür ist, dass die >
Ausgabeumleitung vom Befehlszeileninterpreter und nicht vom Zielprogramm selbst gehandhabt wird. Damit dies funktioniert, my_little_proggy.exe
muss das Ziel von einer Befehlsshell gestartet werden, anstatt direkt ausgeführt zu werden.