Schtasks - o que há de errado com o seguinte comando

2

O script a seguir é planejado com êxito, mas, na verdade, você não irá reiniciar o servidor.

schtasks /create /tn "restart test" /ru "domain\admin" /rp supersecret /sc once /st 11:35 /tr "PowerShell -command {Restart-Computer -ComputerName server01 -force -wait Send-MailMessage -From [email protected] -To [email protected] -Subject 'Rebooted' -SmtpServer smtp.domain.com}"

Os logs de eventos do Agendador de tarefas mostram a tarefa concluída com êxito:

Task Scheduler successfully completed task "\restart test" , instance "{4a8b0e75-eb2f-4be6-918d-7b66473dd344}" , action "C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.EXE" with return code 0.

Se eu executar apenas os comandos em {...} , ele reiniciará o servidor e enviará o email de notificação.

O que estou perdendo?

EDIT: Estou executando isso de um laptop com Windows 7 com o PowerShell 3.0 para um Windows 2012 Server

    
por Kernel Panic 17.09.2013 / 19:14

2 respostas

2

OK, estou excluindo meus comentários anteriores e movendo meus comentários para uma resposta, já que no início meus comentários começaram como apenas conselhos gerais, mas eles se tornaram um claro esclarecimento com uma resposta exata.

Então eu testei com o Win7 e PS3, então estou usando a mesma plataforma que você.

Primeiramente, basta remover o -Command { ... } do seu comando e, com isso, quero dizer:

schtasks /create /tn "restart test" /ru "domain\admin" /rp supersecret /sc once /st 11:35 /tr "PowerShell Restart-Computer -ComputerName server01 -force -wait" 

Isso funciona. Mas o seu próximo problema é que você quer executar vários comandos, (1 reiniciar o computador e 2 enviar um email), e para isso eu recomendaria colocar os comandos em um arquivo de script ps1 e fazer a tarefa assim:

schtasks /create /tn "restart test" /ru "domain\admin" /rp supersecret /sc once /st 11:35 /tr "PowerShell C:\Scripts\restartAndEmail.ps1"

Eu não estou dizendo que você não poderia tecnicamente obter dois comandos do Powershell para rodar em uma única chamada ao schtasks, mas é pesado e você tem que começar a se preocupar com caracteres que precisam ser escapados a linha de comando, como o caractere | , etc., e fica mais fácil de quase todas as perspectivas apenas usar um arquivo ps1.

É importante que você especifique o caminho completo para o script. O diretório de trabalho atual da tarefa agendada provavelmente não será o mesmo que o caminho do script, portanto o caminho relativo não o cortará.

Na verdade, quando estou fazendo tarefas agendadas para scripts do Powershell, normalmente incluo o caminho completo para o exe Powershell também, só para ter certeza. Aqueles que já demonstramos aqui que você não precisa incluir o caminho totalmente qualificado para o Powershell.exe neste cenário.

    
por 17.09.2013 / 20:39
2

Parece que /tr não está analisando o comando e os argumentos corretamente e parece não haver uma maneira confiável de passar argumentos para o comando usando schtasks.exe. Em vez disso, coloque o material PowerShell -command {...} em um arquivo de lote (ou talvez um arquivo * .ps1) e chame-o da tarefa, por exemplo,

schtasks /create ... /tr "RestartAndSendEmail.cmd"
    
por 17.09.2013 / 20:38