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