Como faço para capturar a saída de um script se ele estiver sendo executado pelo agendador de tarefas?

93

Usando o Windows Server 2008, como faço para capturar a saída de um script que está sendo executado com o agendador de tarefas do Windows?

Estou testando um script de lote de impressão personalizado bastante longo e, para fins de depuração, gostaria de ver toda a saída dele todas as noites.

Mechaflash
fonte
2
Às vezes, isso não funciona, ou seja, nenhum arquivo de log é gerado. Um cenário que pode levar a isso é quando a tarefa não foi iniciada porque o Windows erroneamente pensa que ela ainda está em execução. Você pode rastrear isso acessando o histórico de tarefas (guia histórico na propriedade da tarefa - as informações podem levar alguns segundos para aparecer)
Daniel

Respostas:

82

Tente isso como a string de comando no Agendador de tarefas:

cmd /c yourscript.cmd > logall.txt
user2744787
fonte
2
bom, sem necessidade de wrapper, funciona muito bem e também registra a saída de scripts filhos do PowerShell que são chamados do bat / cmd acionado pelo agendador de tarefas Obrigado!
Jonesome Reintegrar Monica
8
Além disso, use cmd /c "path with spaces/command.cmd > file.txt"se você tiver espaços. A resposta2>&1 de Ivan também está entre aspas.
Dinei de
3
preciso usar aspas duplas para fazer o meu funcionar: stackoverflow.com/a/6378038/1747983 cmd /c ""C:\temp\My test dir\something 123\myTool.exe" > Tilo_log.txt 2>&1"
Tilo
1
Eu sei que já se passaram 5 anos, mas mudando isso para a resposta aceita por ser a forma minimalista de realizar a tarefa.
Mechaflash de
Agora eu tenho uma janela de comando aparecendo ao executar a tarefa. Como evitar isso?
Chris
57

Com stderr (para onde vão a maioria dos erros):

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

Para complementar a resposta de @ user2744787, aqui está uma captura de tela para mostrar como usar cmdcom argumentos em uma tarefa agendada:

Saída de cmd de tarefa agendada para arquivo de log

Programa / script: cmd

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

Kevinarpe
fonte
5
Parece que você está iniciando um serviço por meio de uma tarefa agendada. Se este for um serviço em execução persistente em segundo plano, dê uma olhada no NSSM como alternativa. Ele executa qualquer comando como um serviço do Windows e lida com a reinicialização após falha etc.
leemes de
43

O >>irá anexar o arquivo de log, em vez de substituí-lo todas as vezes. O 2>&1também enviará erros para seu arquivo de log.

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

Você pode ter um debug.cmd que chama yourscript.cmd

yourscript.cmd > logall.txt

você agenda debug.cmd em vez de yourscript.cmd

René
fonte
10

Use o cmd.exe processador de comando para construir um nome de arquivo com carimbo de data / hora para registrar a saída de sua tarefa agendada

Para construir sobre as respostas de outras pessoas aqui, pode ser que você queira criar um arquivo de saída que tenha a data e / ou hora embutida no nome do arquivo. Você pode usar o cmd.exeprocessador de comandos para fazer isso por você.

Nota: Essa técnica pega a saída da string de variáveis ​​de ambiente internas do Windows e as divide com base na posição do caractere. Por causa disso, os valores exatos fornecidos nos exemplos abaixo podem não ser corretos para a região do Windows que você usa. Além disso, com algumas configurações regionais, alguns componentes da data ou hora podem introduzir um espaço no nome do arquivo construído quando seu valor for menor que 10. Para atenuar esse problema, coloque o nome do arquivo entre aspas para que quaisquer espaços indesejados no arquivo name não quebrará a linha de comando que você está construindo. Experimente e descubra o que funciona melhor para sua situação.

Esteja ciente de que PowerShellé mais poderoso do que cmd.exe. Uma maneira de ser mais poderoso é que pode lidar com diferentes regiões do Windows. Mas esta resposta é sobre como resolver esse problema usando cmd.exe, não PowerShell, então continuamos.

Usando cmd.exe

Você pode acessar diferentes componentes de data e hora dividindo as variáveis ​​de ambiente internas %date%e %time%, como segue (novamente, os valores exatos de divisão dependem da região configurada no Windows):

  • Ano (4 dígitos): %date:~10,4%
  • Mês (2 dígitos): %date:~4,2%
  • Dia (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%

Suponha que você queira que seu arquivo de log seja nomeado usando este formato de data / hora: " Log_[yyyyMMdd]_[hhmmss].txt". Você usaria o seguinte:

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

Para testar isso, execute a seguinte linha 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"

Juntando tudo, para redirecionar ambos stdoute stderrde seu script para um arquivo de log nomeado com a data e hora atuais, use o seguinte como sua linha 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

Observe o uso de aspas ao redor do nome do arquivo para lidar com instâncias em que um componente de data ou hora pode introduzir um caractere de espaço.

No meu caso, se a data / hora atual fosse 05/10/2017 9:05:34, a linha de comando acima produziria o seguinte:

cmd /c YourProgram.cmd > "Log_20171005_ 90534.txt" 2>&1
STLDev
fonte
não há zero à esquerda em horas menores que 10: / não tenho certeza de como consertar, mas pelo menos cite o nome do arquivo
user25064 05 de
9

Você pode gravar em um arquivo de log nas linhas que deseja gerar assim:

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

Dessa forma, você pode escolher quais comandos enviar se não quiser vasculhar tudo, apenas obtenha o que precisa ver. O >enviará para o arquivo especificado (criando o arquivo se ele não existir e substituindo-o se existir). O >>será anexado ao arquivo especificado (criando o arquivo se ele não existir, mas anexando ao conteúdo se existir).

Bali C
fonte
1

Exemplo de como executar o programa e gravar stdout e stderr em arquivo com carimbo de data / hora:

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"

Parte fundamental é colocar aspas duplas na parte posterior cmd /ce dentro dela usar aspas duplas como de costume. Observe também que a data depende da localidade; este exemplo funciona usando a localidade dos EUA.

David Navrkal
fonte
0

Este trecho usa wmic.exe para construir a string de data. Não é mutilado pelas configurações de localidade

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 bétula
fonte