Comment capturer la sortie d'un script s'il est exécuté par le planificateur de tâches?

95

À l'aide de Windows Server 2008, comment puis-je capturer la sortie d'un script en cours d'exécution avec le planificateur de tâches Windows?

Je teste un script batch d'impression personnalisé assez long, et à des fins de débogage, j'aimerais voir toute la sortie de celui-ci chaque nuit.

Méchaflash
la source
2
Parfois, cela ne fonctionnera pas, c'est-à-dire qu'aucun fichier journal n'est généré. Un scénario qui peut conduire à cela est lorsque la tâche n'a pas du tout démarré, car Windows pense à tort qu'elle est toujours en cours d'exécution. Vous pouvez suivre cela en regardant l'historique des tâches (onglet historique dans la propriété de la tâche - les informations peuvent prendre quelques secondes à apparaître)
Daniel

Réponses:

83

Essayez ceci comme chaîne de commande dans le planificateur de tâches:

cmd /c yourscript.cmd > logall.txt
utilisateur2744787
la source
2
sympa, aucun wrapper requis, fonctionne très bien, et enregistre également la sortie des scripts PowerShell enfants qui sont appelés à partir du bat / cmd déclenché par le planificateur de tâches Merci!
Jonesome réintègre Monica
8
De plus, utilisez cmd /c "path with spaces/command.cmd > file.txt"si vous avez des espaces. La réponse2>&1 d' Ivan entre également dans les guillemets.
Dinei
3
besoin d'utiliser des guillemets doubles pour que le mien fonctionne: stackoverflow.com/a/6378038/1747983 cmd /c ""C:\temp\My test dir\something 123\myTool.exe" > Tilo_log.txt 2>&1"
Tilo
1
Je sais que cela fait 5 ans, mais en changeant cela en réponse acceptée pour être la façon minimaliste d'accomplir la tâche.
Mechaflash
Maintenant, j'ai une fenêtre de commande qui s'affiche lors de l'exécution de la tâche. Comment éviter cela?
Chris
57

Avec stderr (où la plupart des erreurs vont):

cmd /c yourscript.cmd > logall.txt 2>&1
Ivan
la source
56

Pour compléter la réponse de @ user2744787, voici une capture d'écran pour montrer comment utiliser cmdavec des arguments dans une tâche planifiée:

Sortie de la cmd de tâche planifiée dans le fichier journal

Programme / script: cmd

Ajouter des arguments: /c run_with_default_port.bat > IMQuantWebServices.log

kevinarpe
la source
5
Il semble que vous démarrez un service via une tâche planifiée. S'il s'agit d'un service fonctionnant de manière persistante en arrière-plan, jetez un œil à NSSM comme alternative. Il exécute n'importe quelle commande en tant que service Windows et gère le redémarrage après un échec, etc.
leemes
43

Le >>ajoutera le fichier journal, plutôt que de l'écraser à chaque fois. Le 2>&1enverra également des erreurs dans votre fichier journal.

cmd /c YourProgram.exe >> log.txt 2>&1
BlancHotLoveTiger
la source
39

Vous pouvez avoir un debug.cmd qui appelle yourscript.cmd

yourscript.cmd > logall.txt

vous planifiez debug.cmd au lieu de yourscript.cmd

rene
la source
10

Utilisez le cmd.exeprocesseur de commandes pour créer un nom de fichier horodaté afin de consigner la sortie de votre tâche planifiée

Pour construire sur les réponses d'autres personnes ici, il se peut que vous souhaitiez créer un fichier de sortie dont la date et / ou l'heure sont incorporées dans le nom du fichier. Vous pouvez utiliser le cmd.exeprocesseur de commandes pour le faire pour vous.

Remarque: Cette technique prend la sortie de chaîne des variables d'environnement Windows internes et les découpe en fonction de la position des caractères. Pour cette raison, les valeurs exactes fournies dans les exemples ci-dessous peuvent ne pas être correctes pour la région de Windows que vous utilisez. De plus, avec certains paramètres régionaux, certains composants de la date ou de l'heure peuvent introduire un espace dans le nom de fichier construit lorsque leur valeur est inférieure à 10. Pour atténuer ce problème, entourez votre nom de fichier de guillemets afin que tous les espaces non souhaités dans le fichier name ne cassera pas la ligne de commande que vous construisez. Expérimentez et trouvez ce qui fonctionne le mieux pour votre situation.

Sachez que PowerShellc'est plus puissant que cmd.exe. L'une des façons dont il est plus puissant est qu'il peut gérer différentes régions Windows. Mais cette réponse consiste à résoudre ce problème en utilisant cmd.exe, non PowerShell, alors nous continuons.

En utilisant cmd.exe

Vous pouvez accéder à différents composants de la date et de l'heure en découpant les variables d'environnement internes %date%et %time%, comme suit (encore une fois, les valeurs de découpage exactes dépendent de la région configurée dans Windows):

  • Année (4 chiffres): %date:~10,4%
  • Mois (2 chiffres): %date:~4,2%
  • Jour (2 chiffres): %date:~7,2%
  • Heure (2 chiffres): %time:~0,2%
  • Minute (2 chiffres): %time:~3,2%
  • Deuxième (2 chiffres): %time:~6,2%

Supposons que vous souhaitiez que votre fichier journal soit nommé en utilisant ce format de date / heure: " Log_[yyyyMMdd]_[hhmmss].txt". Vous utiliseriez ce qui suit:

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

Pour tester cela, exécutez la ligne de commande suivante:

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

En mettant tout cela ensemble, pour rediriger à la fois stdoutet stderrdepuis votre script vers un fichier journal nommé avec la date et l'heure actuelles, utilisez peut-être utiliser ce qui suit comme ligne de commande:

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

Notez l'utilisation de guillemets autour du nom de fichier pour gérer les instances où un composant de date ou d'heure peut introduire un caractère espace.

Dans mon cas, si la date / heure actuelle était 10/05/2017 9:05:34 AM, la ligne de commande ci-dessus produirait ce qui suit:

cmd /c YourProgram.cmd > "Log_20171005_ 90534.txt" 2>&1
STLDev
la source
il n'y a pas de zéro non significatif sur les heures de moins de 10: /
je
9

Vous pouvez écrire dans un fichier journal sur les lignes que vous souhaitez afficher comme ceci:

@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 cette façon, vous pouvez choisir les commandes à afficher si vous ne voulez pas tout parcourir, obtenez simplement ce dont vous avez besoin. Le le >sortira dans le fichier spécifié (en créant le fichier s'il n'existe pas et en l'écrasant s'il existe). Le >>ajoutera au fichier spécifié (en créant le fichier s'il n'existe pas mais en l'ajoutant au contenu s'il existe).

Bali C
la source
1

Exemple comment exécuter le programme et écrire stdout et stderr dans un fichier avec horodatage:

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 partie clé est de doubler la partie entière derrière cmd /cet à l'intérieur d'utiliser des guillemets doubles comme d'habitude. Notez également que la date dépend des paramètres régionaux, cet exemple fonctionne avec les paramètres régionaux américains.

David Navrkal
la source
0

Cet extrait de code utilise wmic.exe pour créer la chaîne de date. Il n'est pas mutilé par les paramètres régionaux

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% 
jim bouleau
la source