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

1

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
    
por Tarnay Kálmán 06.12.2015 / 02:10

2 respostas

3

A bandeira / B é o que você está procurando. Os seguintes trabalhos (pelo menos no Windows 10):

start /HIGH /B my_little_proggy.exe > output.txt
    
por 06.12.2015 / 02:10
1

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

Como conseqüência, comandos como start /HIGH call my_little_proggy.exe ^> output.txt iniciarão um shell cmd.exe secundário com prioridade alta , que por sua vez manipulará o redirecionamento e executará my_little_proggy.exe - mas executará na prioridade normal . Por causa disso, a postagem a seguir não responde à pergunta original de redirecionar a saída quando start /HIGH .

Eu editei a opção /HIGH do meu post anterior e deixei o restante abaixo, pois as técnicas funcionam para start em geral, e alguém pode achar isso útil.

Do jeito que está escrito, o redirecionamento > se aplica ao comando start , não ao comando que start executa (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 comando start 'ed, você precisa (a) executar o comando por meio de um shell secundário ( cmd /c ou simplesmente call ) e (b) escapar do > para que ele não seja interpretado como um caractere especial / de redirecionamento pela linha start , mas seja preservado e transmitido para o shell filho que executa 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] Adicionada a exigência 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 de destino, portanto, para funcionar o destino my_little_proggy.exe deve ser iniciado por um shell de comando, ao invés de ser executado diretamente .     
por 06.12.2015 / 04:02