Сценарий PowerShell не будет выполняться как запланированная задача Windows
У меня есть сценарий PowerShell (это работает). В Windows Task Scheduler я создал новую задачу для выполнения "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
, передавая аргумент как мой сценарий PS1. Когда задача запускается, я получаю результат последнего запуска 0x1
,
Я обновил свой скрипт для записи в файл журнала, когда скрипт открывается, а этого не происходит. Это почти как задача не может даже открыть Powershell.exe.
Это звучит точно? В чем может быть проблема или как мне обойти это?
6 ответов
Если проблема, с которой вы столкнулись, связана с политикой выполнения, то вы также можете установить политику выполнения определенного вызова PowerShell. Это то, что я обычно делаю при выполнении PowerShell с помощью запланированной задачи:
powershell.exe -NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File \\path\to\script.ps1
Зачем?
-NoProfile
Это гарантирует, что вы не будете полагаться на что-либо в пользовательском профиле PowerShell, и позволит избежать накладных расходов при выполнении этого дополнительного кода.
-nologo
Это в основном не имеет значения; возможно, это так, если вы захватываете вывод своего скрипта. В основном это заставляет меня чувствовать себя лучше.
-NonInteractive
Гарантирует, что ваша задача не будет ждать бесконечно, если что-то в вашем скрипте неожиданно предложит пользователю. С этим переключателем скрипт просто выйдет; по крайней мере, у вас будет код ошибки вместо зависшего скрипта.
-ExecutionPolicy Bypass
Ты можешь использовать Unrestricted
здесь или какая политика исполнения вам нравится. Это, вероятно, тот, который вам нужен больше всего.
Почему я предпочитаю устанавливать Политику выполнения таким образом:
Потому что я не хочу, чтобы задача зависела от глобальных нестандартных настроек, которые могут иметь другие причины для изменения в будущем. Если какой-то другой процесс зависит от другой политики выполнения, тогда он не расходится с вашей задачей.
Плюс всегда приятно не менять настройки по умолчанию. Меньше запомнить / документировать / проверить.
бонус
См. Ответ JohnLBevan для некоторых дополнительных причин 0x1
результат в запланированном задании.
Существует несколько возможных причин, по которым сценарий PowerShell, вызываемый планировщиком задач, завершается с помощью кода. 0x1
:
- Политика выполнения не разрешает запуск сценария. Смотрите превосходный ответ Briantist для подробностей об этом.
- Задача не имеет
Run with highest privileges
флажок (флажок на вкладке Общие задачи) включен. - Параметры передаются в скрипт неправильно. Если использовать такой подход, как
-File ".\MyScript.ps1" -Parameter1 'Demo'
вместо этого попробуйте:-Command "& .\MyScript.ps1 -Parameter1 'Demo'"
Я делал это раньше, и у меня были похожие проблемы. Это почти всегда параметры безопасности PowerShell. Очевидно, я бы дважды проверил вашу политику выполнения (при условии, что вы ее установили).
От какого пользователя запускается задача? Этот пользователь запускал сценарий PowerShell раньше? Если я правильно помню, каждому пользователю предлагается "разрешить" запуск сценариев PowerShell (Y/N) при первом запуске сценария (независимо от политики выполнения). Это укусило меня раньше. Пытаться:
- вход в систему как этот пользователь
- проверить политику исполнения
- запустить сценарий из командной строки PowerShell
- ответьте на любые подсказки, которые следуют.
После первого запуска вам больше не придется беспокоиться об этом, и он должен нормально запускаться из планировщика задач.
В зависимости от безопасности вашего домена, вам также может потребоваться установить политику выполнения группы. Вот статья, которая подробно описывает, как это сделать, а также пару других вещей, которые нужно проверить: PowerShell Security.
Предыдущие ответы имеют большое значение. Я добавил значение ниже в поле Добавить аргументы.
-noninteractive -nologo -command "&{path\to\script.ps1}"
Не забудьте добавить амперсанд и заключить путь в фигурные скобки. Не забывайте иметь двойные кавычки перед амперсандом и после закрытия фигурных скобок.
Если у вас нет сообщений об ошибках и вы не знаете, в чем проблема - почему сценарии PowerShell не хотят запускаться из запланированной задачи, выполните следующие шаги, чтобы получить ответ:
- Запустите CMD от имени пользователя, для которого по расписанию задано выполнение сценария PowerShell.
- Перейдите в папку, где находится сценарий PowerShell
- Выполните сценарий PowerShell (удалите все операторы, которые блокируют уведомления об ошибках, если таковые имеются внутри сценария, например $ErrorActionPreference= 'silentlycontinue')
Вы должны быть в состоянии увидеть все уведомления об ошибках.
В случае с одним моим сценарием это было:
Невозможно найти тип [System.ServiceProcess.ServiceController]. Убедитесь, что сборка, содержащая этот тип, загружена.
И в этом случае мне нужно добавить дополнительную строку в начале скрипта для загрузки отсутствующей сборки:
Add-Type -AssemblyName "System.ServiceProcess"
И следующие ошибки:
Исключение вызывает "GetServices" с аргументом (ами) "1": "Не удается открыть диспетчер управления службами на компьютере". Эта операция может потребовать других привилегий ".
выберите: свойство не может быть обработано, потому что свойство "имя базы данных" уже существует
Я решил эту проблему, используя приведенный выше ответ от @briantist, но я хотел точно определить, какой переключатель решает проблему.
Это не имело ничего общего с
-ExecutionPolicy
,
-Noninteractive
,
-NoLogo
,
-NoProfile
или любая другая системная привилегия, учетная запись пользователя, запускающая скрипт и т. д.
Просто нужно было добавить -File перед путем скрипта в
Task Scheduler > Actions > Arguments
поле. Без этого переключателя PowerShell запускался и отображалась история задач.
Action Completed
, но скрипт не выполнялся.