¿Cómo puedo iniciar un proceso con alta prioridad y aun así redirigir su salida estándar (stdout) a un archivo al mismo tiempo?
Esto no funciona:
start /HIGH my_little_proggy.exe > output.txt
Respuesta1
La bandera /B es lo que estás buscando. Lo siguiente funciona (al menos en Windows 10):
start /HIGH /B my_little_proggy.exe > output.txt
Respuesta2
[EDICIÓN #2 - corrección importante] Como señaló @TarnayKálmán (el OP) en un comentario, el Shell no inicia procesos secundarios en su propio nivel de prioridad, sino en la prioridad normal predeterminada. A nivel de API, cmd parece estar llamandoProceso de creaciónsin configurar ninguno PRIORITY_CLASS
( dwCreationFlags
en lugar de pasar el suyo propio GetPriority()
), lo que hace que el proceso secundario se ejecute de forma predeterminada NORMAL_PRIORITY_CLASS
.
Como consecuencia, comandos como start /HIGH call my_little_proggy.exe ^> output.txt
iniciarán un shell cmd.exe secundario enaltoprioridad, que a su vez manejará la redirección y se ejecutará my_little_proggy.exe
, pero lo ejecutará con prioridad normal. Por eso, la siguiente publicación no responde a la pregunta original sobre cómo redirigir la salida cuando start /HIGH
.
Edité el /HIGH
cambio de mi publicación anterior y dejé el resto a continuación, ya que las técnicas funcionan start
en general y alguien puede encontrarlas útiles.
Tal como está escrito, la >
redirección se aplica al start
comando en sí, no al comando que start
realmente se ejecuta (en su ejemplo, my_little_proggy.exe
). Esto también explica por qué start /B
funciona, ya que el proceso hijo comparte la misma consola (suponiendo que my_little_proggy.exe
también sea una aplicación de consola).
Para redirigir la salida del start
comando 'ed, necesita (a) ejecutar el comando a través de un shell secundario (ya sea cmd /c
o simplemente call
) y (b) escapar de >
modo que la línea no lo interprete como un carácter especial/de redirección start
, sino que se conserva y se pasa al shell secundario que ejecuta my_little_proggy.exe
. Cualquiera de los siguientes debería hacer eso (tenga en cuenta el ^>
).
start call my_little_proggy.exe ^> output.txt
start cmd /c my_little_proggy.exe ^> output.txt
[EDITAR #1] Se agregó el requisito
call
o cmd /c
en el párrafo anterior. La razón es que la >
redirección de salida es manejada por el intérprete de línea de comando, no por el programa de destino en sí, por lo que para que funcione, el destino my_little_proggy.exe
debe iniciarse mediante un shell de comandos, en lugar de ejecutarse directamente.