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
( dwCreationFlags
em 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.txt
iniciarã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 /HIGH
opção do meu post anterior e deixei o restante abaixo, pois as técnicas funcionam start
em geral e alguém pode achar isso útil.
Da forma como está escrito, o >
redirecionamento se aplica ao start
comando em si, não ao comando que start
realmente é executado (no seu exemplo, my_little_proggy.exe
). Isso também explica por que start /B
funciona, já que o processo filho compartilha o mesmo console (supondo que my_little_proggy.exe
também seja um aplicativo de console).
Para redirecionar a saída do start
comando 'ed, você precisa (a) executar o comando por meio de um shell secundário (ou cmd /c
simplesmente call
) e (b) escapar do >
para que não seja interpretado como um caractere especial/de redirecionamento pela start
linha, 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
call
ou cmd /c
no 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.exe
deve ser iniciado por um shell de comando, em vez de ser executado diretamente.