Как вернуть код завершения из скрипта Powershell только при неинтерактивном запуске - PullRequest
7 голосов
/ 08 декабря 2010

У меня есть много сценариев, которые выполняются как запланированные задачи. Таким образом, они делают $host.setshouldexit(1) при любой ошибке, которая отображается в планировщике задач как код возврата.

Я также хочу иметь возможность запускать эти сценарии в интерактивном режиме во время отладки и тестирования. Так что $host.setshouldexit() убивает мой PowerShell или сеанс ISE.

Мой вопрос: как я могу определить, что скрипт работает не в интерактивном режиме? Если это так, тогда я буду использовать setshouldexit, в противном случае будет напечатан код ошибки или что-то неразрушающее. (Обратите внимание, что я не хочу использовать [environment]::userinteractive, потому что эти сценарии не всегда выполняются в том, что ОС считает неинтерактивным сеансом.)

Имеется переключатель -нинтерактивный, который я использую для запланированных задач. Есть ли способ, как я могу запросить это у powershell?

Ответы [ 6 ]

7 голосов
/ 19 февраля 2016

Метод $Host.SetShouldExit не должен быть необходимым и на самом деле противоречив, в зависимости от того, как вы вызываете свои скрипты.Используя ключевое слово exit, вы получите свой статус выхода.

Используя powershell -F script.ps1:

  • exit - работает
  • SetShouldExit - игнорируется

Использование powershell -c '.\script.ps1':

  • exit - статус уменьшен до 0 или 1 для успешного или неудачного выполнения сценария соответственно.
  • SetShouldExit - выходит с правильным состоянием, но остальные строки в скрипте все еще выполняются.

Использование powershell -c '.\script.ps1; exit $LASTEXITCODE' [ 1 ]:

  • exit - работает
  • SetShouldExit - выходит со статусом == 0, а остальные строки в скрипте все еще выполняются.

Вызов напрямую из powershell (> .\script.ps1):

  • exit - работает
  • SetShouldExit - завершает вызов хоста powershell с указанным статусом выхода
2 голосов
/ 15 ноября 2012

Найдя ваш вопрос, я пошел дальше и нашел $MyInvocation.MyCommand.Name.Это False как в интерпретаторе команд, так и в интерпретаторе команд ISE.И когда сценарий (мой jest.ps1), содержащий только строку: Write-Host $MyInvocation.MyCommand.Name, запускается из cmd.exe при вызове powershell.exe как:

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe  -ExecutionPolicy RemoteSigned -NoExit -NonInteractive -NoProfile -File "M:\WindowsPowerShell\Jest.ps1"

Вывод просто:

Jest.ps1

2 голосов
/ 05 июня 2011

У меня была такая же проблема. У меня работает следующее:

# Exit with Return Code when NOT using PowerShell ISE
if ($psise -eq $Null)
{
    $host.SetShouldExit(1)
}
2 голосов
/ 08 декабря 2010

Почему бы просто не принять параметр «тестирование», который задает правильное поведение во время ваших тестов? У вас есть буфер истории, поэтому он больше не будет печататься.

1 голос
/ 21 января 2017

Проверьте $ Host.Name.Если ваш скрипт выполняется за пределами IDE, он вернет значение ConsoleHost.В противном случае он вернет ссылку на IDE, такую ​​как Windows PowerShell ISE Host или PowerGUIScriptEditorHost.

Я должен использовать SetShouldExit, потому что планировщик, выполняющий мои сценарии, обычно игнорирует другие методы указания сбоя.Я добавляю функцию, позволяющую SetShouldExit, когда $Host.Name равно ConsoleHost.Это экономит много сбоев IDE во время тестирования.

0 голосов
/ 12 сентября 2018

Это прямо отвечает на вопрос автора о том, можете ли вы запросить, была ли запущена консоль powershell с параметром -NonInteractive.

Function Test-IsPowerShellConsoleNonInteractive { [Boolean]([Environment]::GetCommandLineArgs() -Match '-NonInteractive') }
$IsPSConsoleNonInteractive = Test-IsPowerShellConsoleNonInteractive
If ($IsPSConsoleNonInteractive) { $Host.SetShouldExit(2) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...