Come si acquisisce l'output di uno script se viene eseguito dall'utilità di pianificazione?


95

Utilizzando Windows Server 2008, come posso catturare l'output di uno script che viene eseguito con l'utilità di pianificazione di Windows?

Sto testando uno script batch di stampa personalizzato piuttosto lungo e, per scopi di debug, vorrei vedere tutto l'output ogni notte.


2
A volte, questo non funzionerà, ovvero non viene generato alcun file di registro. Uno scenario che può portare a questo è quando l'attività non è stata avviata affatto, perché Windows pensa erroneamente che sia ancora in esecuzione. Puoi tenerne traccia facendo riferimento alla cronologia delle attività (scheda cronologia nella proprietà dell'attività - le informazioni potrebbero richiedere alcuni secondi per essere visualizzate)
Daniel

Risposte:


83

Prova questo come stringa di comando nell'Utilità di pianificazione:

cmd /c yourscript.cmd > logall.txt

2
bello, nessun wrapper richiesto, funziona alla grande e registra anche l'output di script PowerShell figlio che vengono chiamati dal bat / cmd attivato dall'utilità di pianificazione Grazie!
Jonesome Reinstate Monica

8
Inoltre, usa cmd /c "path with spaces/command.cmd > file.txt"se hai spazi. Il 2>&1da risposta di Ivan vale anche all'interno delle virgolette.
Dinei

3
è necessario utilizzare le virgolette doppie per far funzionare il mio: stackoverflow.com/a/6378038/1747983 cmd /c ""C:\temp\My test dir\something 123\myTool.exe" > Tilo_log.txt 2>&1"
Tilo

1
So che sono passati 5 anni, ma cambiando questo nella risposta accettata per essere il modo minimalista di eseguire il compito.
Mechaflash

Ora ho una finestra di comando visualizzata durante l'esecuzione dell'attività. Come prevenirlo?
Chris

57

Con stderr (dove va a finire la maggior parte degli errori):

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

56

Per integrare la risposta di @ user2744787, ecco uno screenshot per mostrare come utilizzare cmdcon argomenti in un'attività pianificata:

Output del cmd dell'attività pianificata nel file di registro

Programma / script: cmd

Aggiungi argomenti: /c run_with_default_port.bat > IMQuantWebServices.log


5
Sembra che tu stia avviando un servizio tramite un'attività pianificata. Se questo dovrebbe essere un servizio in esecuzione in modo persistente in background, dai un'occhiata a NSSM come alternativa. Esegue qualsiasi comando come servizio Windows e gestisce il riavvio dopo un errore, ecc.
leemes

43

Il >>aggiungerà il file di log, invece di sovrascrivere ogni volta. Il 2>&1invierà anche gli errori nel file di registro.

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

39

Puoi avere un debug.cmd che chiama yourscript.cmd

yourscript.cmd > logall.txt

pianifichi debug.cmd invece di yourscript.cmd


10

Utilizzare il cmd.exe processore dei comandi per creare un nome file con data e ora per registrare l'output dell'attività pianificata

Per basarsi sulle risposte di altri qui, potrebbe essere necessario creare un file di output con la data e / o l'ora incorporate nel nome del file. Puoi usare il cmd.exeprocessore dei comandi per farlo per te.

Nota: questa tecnica prende l'output della stringa delle variabili di ambiente Windows interne e le suddivide in base alla posizione del carattere. Per questo motivo, i valori esatti forniti negli esempi seguenti potrebbero non essere corretti per l'area di Windows utilizzata. Inoltre, con alcune impostazioni internazionali, alcuni componenti della data o dell'ora possono introdurre uno spazio nel nome del file costruito quando il loro valore è inferiore a 10. Per mitigare questo problema, racchiudi il nome del tuo file tra virgolette in modo che eventuali spazi non intenzionali nel file name non interromperà la riga di comando che stai costruendo. Sperimenta e trova ciò che funziona meglio per la tua situazione.

Sii consapevole che PowerShellè più potente di cmd.exe. Un modo in cui è più potente è che può gestire diverse regioni di Windows. Ma questa risposta riguarda la risoluzione di questo problema utilizzando cmd.exe, non PowerShell, quindi continuiamo.

Utilizzando cmd.exe

È possibile accedere a diversi componenti della data e dell'ora suddividendo le variabili di ambiente interne %date%e %time%, come segue (ancora una volta, i valori di suddivisione esatti dipendono dalla regione configurata in Windows):

  • Anno (4 cifre): %date:~10,4%
  • Mese (2 cifre): %date:~4,2%
  • Giorno (2 cifre): %date:~7,2%
  • Ora (2 cifre): %time:~0,2%
  • Minuto (2 cifre): %time:~3,2%
  • Secondo (2 cifre): %time:~6,2%

Si supponga di voler assegnare un nome al file di registro utilizzando questo formato di data / ora: " Log_[yyyyMMdd]_[hhmmss].txt". Useresti quanto segue:

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

Per verificarlo, esegui la seguente riga di 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"

Mettendo tutto insieme, per reindirizzare sia stdoute stderrdal tuo script a un file di registro denominato con la data e l'ora correnti, utilizzare potrebbe utilizzare quanto segue come riga di 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

Si noti che l'uso di virgolette attorno al nome del file per gestire le istanze in cui un componente di data o ora può introdurre uno spazio.

Nel mio caso, se la data / ora corrente fosse 10/05/2017 9:05:34 AM, la riga di comando precedente produrrebbe quanto segue:

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

non c'è zero iniziale nelle ore inferiori a 10: / non sono sicuro di come risolvere ma almeno cita il nome del file
user25064

9

Puoi scrivere in un file di registro sulle righe che desideri generare in questo modo:

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

In questo modo puoi scegliere quali comandi emettere se non vuoi navigare attraverso tutto, ottieni solo ciò che ti serve vedere. Lo >visualizzerà nel file specificato (creando il file se non esiste e sovrascrivendolo se lo è). Il >>aggiungerà al file specificato (creando il file se non esiste, ma aggiungendo al contenuto se lo fa).


1

Esempio di come eseguire il programma e scrivere stdout e stderr su file con timestamp:

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 fondamentale è virgolette doppia tutta la parte dietro cmd /ce al suo interno utilizzare le virgolette doppie come al solito. Si noti inoltre che la data dipende dalle impostazioni locali, questo esempio funziona utilizzando le impostazioni internazionali statunitensi.


0

Questo frammento utilizza wmic.exe per creare la stringa della data. Non è alterato dalle impostazioni locali

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% 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.