Inicie um processo com alta prioridade e redirecione seu stdout no Windows

Inicie um processo com alta prioridade e redirecione seu stdout no Windows

Como posso iniciar um processo com alta prioridade e ainda redirecionar sua saída padrão (stdout) para um arquivo ao mesmo tempo?

Isso não funciona:

start /HIGH my_little_proggy.exe > output.txt

Responder1

O sinalizador /B é o que você está procurando. O seguinte funciona (pelo menos no Windows 10):

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

Responder2

[EDIT #2 - correção principal] Conforme apontado por @TarnayKálmán (o OP) em um comentário, o shell não inicia processos filhos em seu próprio nível de prioridade, mas sim na prioridade normal padrão. No nível da API, o cmd parece estar chamandoCriarProcessosem definir nenhum PRIORITY_CLASS( dwCreationFlagsem vez de passar o seu próprio GetPriority()), o que faz com que o processo filho seja executado no padrão NORMAL_PRIORITY_CLASS.

Como consequência, comandos como start /HIGH call my_little_proggy.exe ^> output.txtiniciarão um shell cmd.exe secundário emaltoprioridade, que por sua vez irá lidar com o redirecionamento e executar my_little_proggy.exe- mas executá-lo com prioridade normal. Por causa disso, a postagem a seguir não responde à questão original de redirecionar a saída quando start /HIGH.

Editei a /HIGHopção do meu post anterior e deixei o restante abaixo, pois as técnicas funcionam startem geral e alguém pode achar isso útil.


Da forma como está escrito, o >redirecionamento se aplica ao startcomando em si, não ao comando que startrealmente é executado (no seu exemplo, my_little_proggy.exe). Isso também explica por que start /Bfunciona, já que o processo filho compartilha o mesmo console (supondo que my_little_proggy.exetambém seja um aplicativo de console).

Para redirecionar a saída do startcomando 'ed, você precisa (a) executar o comando por meio de um shell secundário (ou cmd /csimplesmente call) e (b) escapar do >para que não seja interpretado como um caractere especial/de redirecionamento pela startlinha, mas é preservado e passado para o shell filho que executa o my_little_proggy.exe. Qualquer um dos seguintes deve fazer isso (observe o ^>).

start call my_little_proggy.exe ^> output.txt
start cmd /c my_little_proggy.exe ^> output.txt


[EDIT #1] Adicionado o requisito callou cmd /cno parágrafo acima. A razão é que o >redirecionamento de saída é tratado pelo interpretador de linha de comando, não pelo próprio programa alvo, portanto, para que funcione, o destino my_little_proggy.exedeve ser iniciado por um shell de comando, em vez de ser executado diretamente.

informação relacionada