¿Cómo capturo la salida de un script si lo ejecuta el programador de tareas?


95

Con Windows Server 2008, ¿cómo puedo capturar la salida de un script que se está ejecutando con el programador de tareas de Windows?

Estoy probando un script por lotes de impresión personalizado bastante largo y, para fines de depuración, me gustaría ver todos los resultados de él todas las noches.


2
A veces, esto no funcionará, es decir, no se genera ningún archivo de registro. Un escenario que puede conducir a esto es cuando la tarea no se inició en absoluto, porque Windows piensa erróneamente que todavía se está ejecutando. Puede rastrearlo mirando el historial de tareas (pestaña de historial en la propiedad de la tarea; la información puede demorar unos segundos en aparecer)
Daniel

Respuestas:


83

Pruebe esto como la cadena de comando en el Programador de tareas:

cmd /c yourscript.cmd > logall.txt

2
agradable, no requiere envoltorio, funciona muy bien y también registra la salida de los scripts de PowerShell secundarios que se llaman desde el bat / cmd activado por el programador de tareas. ¡Gracias!
Jonesome reinstala a Monica

8
Además, use cmd /c "path with spaces/command.cmd > file.txt"si tiene espacios. La respuesta2>&1 de Ivan también va dentro de las comillas.
Dinei

3
Necesito usar comillas dobles para que la mía funcione: stackoverflow.com/a/6378038/1747983 cmd /c ""C:\temp\My test dir\something 123\myTool.exe" > Tilo_log.txt 2>&1"
Tilo

1
Sé que han pasado 5 años, pero cambiando esto a la respuesta aceptada por ser la forma minimalista de realizar la tarea.
Mechaflash

Ahora tengo una ventana de comando que aparece al ejecutar la tarea. ¿Cómo prevenir eso?
Chris

57

Con stderr (donde van la mayoría de los errores):

cmd /c yourscript.cmd > logall.txt 2>&1

56

Para complementar la respuesta de @ user2744787, aquí hay una captura de pantalla para mostrar cómo usar cmdcon argumentos en una tarea programada:

Salida de cmd de tarea programada al archivo de registro

Programa / guión: cmd

Agregue argumentos: /c run_with_default_port.bat > IMQuantWebServices.log


5
Parece que está iniciando un servicio a través de una tarea programada. Si se trata de un servicio que se ejecuta de forma persistente en segundo plano, eche un vistazo a NSSM como alternativa. Se ejecuta cualquier comando como un servicio de Windows y gestiona el reinicio después de un fallo, etc.
leemes

43

El >>agregará el archivo de registro, en lugar de sobrescribirlo cada vez. El 2>&1también enviará errores en el archivo de registro.

cmd /c YourProgram.exe >> log.txt 2>&1

39

Puede tener un debug.cmd que llame a yourscript.cmd

yourscript.cmd > logall.txt

programa debug.cmd en lugar de yourscript.cmd


10

Utilice el cmd.exeprocesador de comandos para crear un nombre de archivo con marca de tiempo para registrar la salida de su tarea programada

Para aprovechar las respuestas de otros aquí, es posible que desee crear un archivo de salida que tenga la fecha y / o la hora incrustadas en el nombre del archivo. Puede utilizar el cmd.exeprocesador de comandos para hacer esto por usted.

Nota: Esta técnica toma la salida de cadena de las variables de entorno internas de Windows y las divide en función de la posición del carácter. Debido a esto, es posible que los valores exactos proporcionados en los ejemplos siguientes no sean correctos para la región de Windows que utiliza. Además, con algunas configuraciones regionales, algunos componentes de la fecha u hora pueden introducir un espacio en el nombre del archivo construido cuando su valor es menor que 10. Para mitigar este problema, rodee el nombre del archivo con comillas para que los espacios no deseados en el archivo name no romperá la línea de comandos que está construyendo. Experimente y encuentre lo que mejor se adapte a su situación.

Tenga en cuenta que PowerShelles más poderoso que cmd.exe. Una forma en que es más poderoso es que puede tratar con diferentes regiones de Windows. Pero esta respuesta trata de resolver este problema usando cmd.exe, no PowerShell, así que continuamos.

Utilizando cmd.exe

Puede acceder a diferentes componentes de la fecha y la hora dividiendo las variables de entorno internas %date%y %time%, de la siguiente manera (nuevamente, los valores de división exactos dependen de la región configurada en Windows):

  • Año (4 dígitos): %date:~10,4%
  • Mes (2 dígitos): %date:~4,2%
  • Día (2 dígitos): %date:~7,2%
  • Hora (2 dígitos): %time:~0,2%
  • Minuto (2 dígitos): %time:~3,2%
  • Segundo (2 dígitos): %time:~6,2%

Suponga que desea que su archivo de registro reciba un nombre con este formato de fecha / hora: " Log_[yyyyMMdd]_[hhmmss].txt". Usarías lo siguiente:

Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt

Para probar esto, ejecute la siguiente línea de comando:

cmd.exe /c echo "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"

Poniéndolo todo junto, para redirigir ambos stdouty stderrdesde su secuencia de comandos a un archivo de registro con el nombre de la fecha y hora actuales, use lo siguiente como línea de comando:

cmd /c YourProgram.cmd > "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1

Tenga en cuenta el uso de comillas alrededor del nombre del archivo para manejar casos en los que un componente de fecha u hora puede introducir un carácter de espacio.

En mi caso, si la fecha / hora actual fuera 10/05/2017 9:05:34 AM, la línea de comando anterior produciría lo siguiente:

cmd /c YourProgram.cmd > "Log_20171005_ 90534.txt" 2>&1

no hay cero a la izquierda en las horas inferiores a 10: / no estoy seguro de cómo solucionarlo, pero al menos cite el nombre del archivo
user25064

9

Puede escribir en un archivo de registro en las líneas que desea generar de esta manera:

@echo off
echo Debugging started >C:\logfile.txt
echo More stuff
echo Debugging stuff >>C:\logfile.txt
echo Hope this helps! >>C:\logfile.txt

De esta manera, puede elegir qué comandos generar si no desea rastrear todo, solo obtenga lo que necesita ver. La >enviará al archivo especificado (creando el archivo si no existe y sobrescribiéndolo si existe). los>> agregará al archivo especificado (creando el archivo si no existe, pero agregando al contenido si existe).


1

Ejemplo de cómo ejecutar el programa y escribir stdout y stderr en un archivo con marca de tiempo:

cmd /c ""C:\Program Files (x86)\program.exe" -param fooo >> "c:\dir space\Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1"

La parte clave es comillas dobles la parte completa detrás cmd /cy dentro de ella use comillas dobles como de costumbre. También tenga en cuenta que la fecha depende de la configuración regional, este ejemplo funciona con la configuración regional de EE. UU.


0

Este fragmento usa wmic.exe para construir la cadena de fecha. No está alterado por la configuración regional

rem DATE as YYYY-MM-DD via WMIC.EXE
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
set RDATE=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2% 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.