SchTasks выдает ошибку (0x1) на Windows 2008 R2
У меня есть скрипт powershell, который создает запланированные задачи как часть процесса автоматизации, и мой синтаксис следующий;
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"
Задачи создаются успешно, но когда приходит время выполнения, оно всегда завершается ошибкой (0X1).
Если я запускаю командный файл по отдельности, он работает отлично; поэтому мое задание по расписанию создано неправильно.
Затем я обнаружил, что он работает, когда я предоставляю ему путь к каталогу "start-in"
Мой вопрос заключается в том, почему я должен указывать начало пути, когда в свойствах задачи четко указано "Необязательно"?
Мой другой вопрос, как обеспечить старт в пути? Перепробовал много способов, все терпит неудачу, нет ли автоматизированного способа сделать это? я должен обновить каждую задачу вручную?
2 ответа
Мой вопрос заключается в том, почему я должен указывать начало пути, когда в свойствах задачи четко указано "Необязательно"?
Допустим, например, что я создаю запланированное задание, которое будет запускать скрипт Powershell:
Почему это не так? Во-первых, мы не уверены, что powershell.exe будет разрешен правильно, потому что мы не знаем, правильно ли настроены переменные среды PATH для пользователя, выполняющего запланированное задание. В зависимости от того, для кого вы устанавливаете задачу, будь то Система или пользователь домена, их переменные PATH могут отличаться. Иногда это работает, и powershell.exe запускается должным образом, но почему бы не пойти дальше и не использовать догадки и указать полное имя пути исполняемого файла powershell.exe.
Во-вторых, script.ps1 - это где? Вы не указали. Powershell собирается запустить и его каталог запуска будет %WINDIR%\System32
, Если вы не сохранили свой сценарий (и я надеюсь, что это не так), Powershell не сможет его найти.
Теперь лучше, когда мы указали полные пути как для исполняемого файла, так и для скрипта. Но мы все еще не добрались до того, для чего "Начать (необязательно)". Ну, подожди, мы добираемся туда.
Содержание script.ps1
таким образом:
"Hello world!" | Out-File test.txt
Так что, если бы я должен был запустить вышеупомянутое запланированное задание сейчас, которое запускает Powershell, который запускает script.ps1, как вы думаете, где будет написан test.txt?
Если вы догадались %WINDIR%\System32
тогда вы получите печенье!
Если бы я хотел, чтобы test.txt пошел в C:\Scripts
вместо этого я бы набрал C:\Scripts
в поле "Начать (необязательно)"!
Вот почему это необязательно.
Я также должен отметить, что вы также можете обойти эту проблему, используя полные пути в вашем скрипте, чтобы заставить вещи идти туда, куда вы хотите, чтобы они шли, не беспокоясь о переменных PATH и рабочих каталогах.
Теперь перейдем ко второму вопросу.
Похоже, что schtasks.exe не может добавить "Начать в" или "Рабочий каталог" запланированной задачи. Облом.
Одна вещь, которую вы можете сделать, это использовать задачи XML для Task Scheduler 2.0, которые позволяют вам установить рабочий каталог. Вот XML для тестовой задачи, которую я создал для этого вопроса:
<?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>
Ты можешь использовать schtasks /XML
для скриптового импорта задач из файлов XML.
Я только что столкнулся с этим сам. В моем случае проблема была связана с ошибкой в самом скрипте, хотя ошибка была в той части скрипта, которая никогда не была бы достигнута во время выполнения.
Чтобы устранить проблему, попробуйте запустить все действие как пользователь, который будет запускать сценарий. Например, сначала откройте PowerShell в качестве целевого пользователя (если не вы):
RunAs /user:domain\serviceaccount PowerShell.exe
А затем запустите весь блок действий в PowerShell и посмотрите, нет ли в нем ошибок:
PowerShell.exe -ExecutionPolicy Bypass -File "C:\Scripts\My-Automated-Task.ps1"