SchTasks dando erro (0x1) no Windows 2008 R2

1

eu tenho um script powershell que cria tarefas agendadas como parte do processo de automação e minha sintaxe está seguindo;

schtasks /create /s ServerName /u $username /p $password /ru $username /rp $password /sc once /sd $StartDate /st $StartTime /tn $taskname /tr "\ServerName\c$\$TaskName\$Taskname.bat"

As tarefas são criadas com sucesso, mas quando chega a hora da execução, sempre falha com erro (0X1).

Se eu executo um arquivo batch individualmente, ele funciona perfeitamente; então minha tarefa de agendamento é criada errada.

Então eu achei que funciona quando eu forneço o caminho do diretório "start-in".

Minha pergunta é por que devo fornecer um início no caminho quando ele diz "Opcional" nas propriedades da tarefa?

Minha outra pergunta é como fornecer o caminho inicial? Tentei muitas maneiras, tudo falha, não há maneira automatizada de fazer isso? devo atualizar todas as tarefas manualmente?

    
por Darktux 18.07.2013 / 15:12

1 resposta

4

My question is why should i provide a start in path when clearly it says "Optional" in the task's properties?

Digamos, por exemplo, que eu esteja criando uma tarefa agendada que execute um script do Powershell:

Porqueissoestáerrado?Bem,primeiro,nãotemoscertezaseopowershell.exeseráresolvidocorretamenteporquenãosabemosseousuárioqueexecutaatarefaagendadatemsuasvariáveisdeambientePATHconfiguradascorretamente.Dependendodequemvocêdefiniuparaexecutaratarefa,sejaSistemaouumusuáriodedomínio,suasvariáveisPATHserãodiferentes.Àsvezes,funciona,epowershell.exeéiniciadocorretamente,masporquenãoiremfrenteetomarotrabalhodeadivinhaçãoforadeleeespecificarumnomedecaminhototalmentequalificadooexecutávelpowershell.exe.

Emsegundolugar,oscript.ps1éonde?Vocênãoespecificou.OPowershellserálançadoeseudiretóriodeinicializaçãoserá%WINDIR%\System32.Amenosquesejaondevocêarmazenouseuscript(eesperoquenãoseja),oPowershellnãoserácapazdeencontrá-lo.

Isso é melhor agora que fornecemos caminhos completos para o executável e para o script. Mas ainda não chegamos ao que é "Start in (optional)". Bem, espere, estamos chegando lá.

O conteúdo de script.ps1 é assim:

"Hello world!" | Out-File test.txt

Então, se eu fosse executar a tarefa agendada acima agora, que inicia o Powershell, que executa script.ps1, onde você acha que o test.txt será escrito?

Se você adivinhou %WINDIR%\System32 , você receberá um cookie!

Se eu quisesse que o test.txt fosse para C:\Scripts , eu digitaria C:\Scripts no campo "Iniciar em (opcional)"!

É por isso que é opcional.

Também devo salientar que você também pode contornar isso usando nomes de caminho completos em seu script para fazer as coisas irem onde quiser, sem ter que se preocupar com variáveis PATH e diretórios de trabalho.

Agora, para a segunda pergunta.

O schtasks.exe não parece ter a capacidade de adicionar o "Start in" ou "Working Directory" de uma tarefa agendada. Que pena.

Uma coisa que você pode fazer é usar as tarefas XML for Task Scheduler 2.0, que permitem definir o diretório de trabalho. Aqui está o XML da tarefa de teste que criei para essa pergunta:

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2013-07-19T09:41:27.0446696</Date>
    <Author>DOMAIN\user</Author>
  </RegistrationInfo>
  <Triggers />
  <Principals>
    <Principal id="Author">
      <UserId>DOMAIN\user</UserId>
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</Command>
      <Arguments>C:\Scripts\script.ps1</Arguments>
      <WorkingDirectory>C:\Scripts</WorkingDirectory>
    </Exec>
  </Actions>
</Task>

Você pode usar schtasks /XML para importar tarefas por meio de scripts de arquivos XML.

    
por 19.07.2013 / 17:09