Подтвердить что ты не робот

Powershell script не будет выполняться как запланированная задача Windows

Вероятно, это скорее вопрос Windows Scheduler, чем Powershell, но в любом случае...

У меня есть PowerShell script (работает). В планировщике задач Windows я создал новую задачу для выполнения "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" передачи аргумента в качестве моего PS1 script. Когда задача запускается, я получаю результат последнего прогона 0x1.

Я обновил свой script для записи в файл журнала при открытии script и этого не происходит. Это почти как задача не может даже открыть Powershell.exe.

Звучит ли это правильно? Любые идеи, что может быть проблемой или как ее обойти?

4b9b3361

Ответ 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 и после закрытия фигурных скобок.