Powershell script не будет выполняться как запланированная задача Windows
Вероятно, это скорее вопрос Windows Scheduler, чем Powershell, но в любом случае...
У меня есть PowerShell script (работает). В планировщике задач Windows я создал новую задачу для выполнения "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
передачи аргумента в качестве моего PS1 script. Когда задача запускается, я получаю результат последнего прогона 0x1
.
Я обновил свой script для записи в файл журнала при открытии script и этого не происходит. Это почти как задача не может даже открыть Powershell.exe.
Звучит ли это правильно? Любые идеи, что может быть проблемой или как ее обойти?
Ответы
Ответ 1
Если проблема связана с политикой выполнения, то вы также можете установить политику выполнения для конкретного вызова PowerShell. Это то, что я обычно делаю при выполнении PowerShell через запланированную задачу:
powershell.exe -NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File \\path\to\script.ps1
Почему?
-NoProfile
Это гарантирует, что вы не опираетесь ни на что в профиле пользователя PowerShell и избегаете накладных расходов на выполнение этого дополнительного кода.
-nologo
Это в основном не имеет значения; возможно, это произойдет, если вы захватите вывод своего script. В основном это заставляет меня чувствовать себя лучше.
-NonInteractive
Обеспечивает, что ваша задача не будет ждать бесконечно, если что-то из вашего script неожиданно предложит пользователю. С помощью этого переключателя script просто выйдет; по крайней мере, у вас будет код ошибки вместо висячего script.
-ExecutionPolicy Bypass
Здесь вы можете использовать Unrestricted
или какую бы политику выполнения вы ни выбрали. Это, вероятно, тот, который вам больше всего нужен.
Почему я предпочитаю устанавливать политику выполнения следующим образом:
Потому что я не хочу, чтобы задача зависела от глобальной нестандартной настройки, которая может иметь другие причины для изменения в будущем. Если какой-либо другой процесс зависит от другой политики выполнения, то это не противоречит вашей задаче таким образом.
Плюс всегда приятно не менять значения по умолчанию. Меньше, чтобы помнить/документировать/тестировать.
Bonus
См. ответ JohnLBevan для некоторых дополнительных причин 0x1
для выполнения запланированной задачи.
Ответ 2
Я сделал это раньше и имел похожие проблемы. Это почти всегда настройки безопасности Powershell. Наиболее очевидно, что я дважды проверю вашу политику выполнения (при условии, что вы ее установили).
Какой пользователь выполняет задание? Этот пользователь запускает Powershell script раньше? Если я правильно помню, каждому пользователю предлагается "разрешить" сценарии Powershell (Y/N) при запуске script в первый раз (независимо от политики выполнения). Это уже укусило меня. Попробуйте:
- вход в систему как пользователь
- проверить политику выполнения
- отправьте script из приглашения Powershell
- ответьте на следующие подсказки.
После первого запуска вам не придется беспокоиться об этом еще раз, и он должен работать с планировщиком задач просто отлично.
В зависимости от безопасности вашего домена вам также может потребоваться установить политику выполнения группы. Вот статья, которая подробно описывает, как это сделать, а также пару других вещей, которые нужно проверить: http://www.windowsecurity.com/articles/PowerShell-Security.html
Ответ 3
Существует несколько возможных причин для PowerShell script, вызываемых планировщиком задач, с кодом 0x1
:
- Политика выполнения не позволяет запустить script. См. превосходный ответ Briantist для подробностей об этом.
- В задании не установлен флаг
Run with highest privileges
(флажок на вкладке Общие задачи).
- Параметры передаются в script неправильно. Если вы используете такой подход, например
-File ".\MyScript.ps1" -Parameter1 'Demo'
, попробуйте: -Command "& .\MyScript.ps1 -Parameter1 'Demo'"
Ответ 4
Вышеуказанные предложения имеют большое значение. Я добавил значение ниже в поле Добавить аргументы
-noninteractive -nologo -command "&{path\to\script.ps1}"
Обязательно добавьте амперсанд и вставьте путь в фигурные скобки. Не забывайте иметь двойные кавычки перед apersand и после закрытия фигурных скобок.