Запустить процесс с высоким приоритетом и перенаправить его stdout в Windows

Запустить процесс с высоким приоритетом и перенаправить его stdout в Windows

Как запустить процесс с высоким приоритетом и в то же время перенаправить его стандартный вывод (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 ] Добавлено требование callor cmd /cв абзаце выше. Причина в том, что >перенаправление вывода обрабатывается интерпретатором командной строки, а не самой целевой программой, поэтому для того, чтобы это сработало, цель my_little_proggy.exeдолжна быть запущена командной оболочкой, а не запущена напрямую.

Связанный контент