У меня есть сценарий 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».
У меня вопрос: почему я должен указывать начало пути, если в свойствах задачи четко указано «Необязательно»?
Другой мой вопрос: как обеспечить начало пути? Пробовал много способов, все терпит неудачу, нет ли автоматического способа сделать это? я должен обновлять каждую задачу вручную?
У меня вопрос: почему я должен указывать начало пути, если в свойствах задачи четко указано «Необязательно»?
Скажем, например, что я создаю запланированную задачу, которая будет запускать сценарий 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"