Как я могу запустить процесс с высоким приоритетом и одновременно перенаправить его стандартный вывод (stdout) в файл?
Это не работает:
start /HIGH my_little_proggy.exe > output.txt
Флаг /B - это то, что вы ищете. Следующие работы (по крайней мере, в Windows 10):
start /HIGH /B my_little_proggy.exe > output.txt
[РЕДАКТИРОВАТЬ # 2 - серьезное исправление] Как указывает @ TarnayKálmán (OP) в комментарии, оболочка не запускает дочерние процессы с собственным уровнем приоритета, а с обычным приоритетом по умолчанию. На уровне API cmd, по-видимому, вызывает CreateProcess без установки какого-либо PRIORITY_CLASS
в dwCreationFlags
(в отличие от передачи своего собственного GetPriority()
), который заставляет дочерний процесс запускаться по умолчанию NORMAL_PRIORITY_CLASS
.
Как следствие, такие команды, как start /HIGH call my_little_proggy.exe ^> output.txt
чтобы запустить вторичную оболочку cmd.exe с высоким приоритетом, которая, в свою очередь, будет обрабатывать перенаправление и запускать my_little_proggy.exe
- но запускать ее с обычным приоритетом. Из-за этого следующий пост не отвечает на первоначальный вопрос о перенаправлении вывода при start /HIGH
.
Я отредактировал переключатель /HIGH
из моего предыдущего поста, а оставшуюся часть оставил ниже, так как в целом методы работают для start
, и кто-то может найти это полезным.
Как написано, перенаправление >
применяется к самой команде start
, а не к команде, которая start
самом деле (в вашем примере, my_little_proggy.exe
). Это также объясняет, почему start /B
работает, поскольку дочерний процесс использует одну и ту же консоль (при условии, что my_little_proggy.exe
является консольным приложением).
Чтобы перенаправить вывод команды start
'ed, вам нужно (а) запустить команду через вторичную оболочку (либо cmd /c
либо просто call
), и (b) экранировать >
чтобы она не интерпретировалась как специальный / символ перенаправления в start
строки, а точнее сохраняется и передается дочерней оболочке, которая запускает my_little_proggy.exe
. Любое из следующего должно сделать это (обратите внимание на ^>
).
start call my_little_proggy.exe ^> output.txt
start cmd /c my_little_proggy.exe ^> output.txt
call
или cmd /c
в пункте выше. Причина в том, что перенаправление вывода >
обрабатывается интерпретатором командной строки, а не самой целевой программой, поэтому для того, чтобы она работала, целевой my_little_proggy.exe
должен быть запущен командной оболочкой, а не запущен напрямую.