1

Как я могу запустить процесс с высоким приоритетом и одновременно перенаправить его стандартный вывод (stdout) в файл?

Это не работает:

start /HIGH my_little_proggy.exe > output.txt

2 ответа2

3

Флаг /B - это то, что вы ищете. Следующие работы (по крайней мере, в Windows 10):

start /HIGH /B my_little_proggy.exe > output.txt
1

[РЕДАКТИРОВАТЬ # 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


[EDIT # 1] Добавлено требование call или cmd /c в пункте выше. Причина в том, что перенаправление вывода > обрабатывается интерпретатором командной строки, а не самой целевой программой, поэтому для того, чтобы она работала, целевой my_little_proggy.exe должен быть запущен командной оболочкой, а не запущен напрямую.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .