Сценарий 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 не хотят запускаться из запланированной задачи, выполните следующие шаги, чтобы получить ответ:

  1. Запустите CMD от имени пользователя, для которого по расписанию задано выполнение сценария PowerShell.
  2. Перейдите в папку, где находится сценарий PowerShell
  3. Выполните сценарий 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, но скрипт не выполнялся.

Другие вопросы по тегам