Окно Powershell исчезает, прежде чем я могу прочитать сообщение об ошибке - PullRequest
27 голосов
/ 27 августа 2009

Когда я вызываю скрипт Powershell, как я могу удержать вызываемый скрипт от закрытия его окна команд. Я получаю сообщение об ошибке и уверен, что смогу ее исправить, если смогу просто прочитать ошибку.

У меня есть скрипт Powershell, который отправляет электронное письмо с вложением, используя классы .NET. Если я вызываю сценарий напрямую, выполняя его из командной строки или вызывая его из планировщика Windows, то он работает нормально. Если я вызываю его из другого скрипта (IronPython, если это имеет значение), то происходит сбой. Все сценарии отлично работают на моей машине для разработки. (Мне действительно нужно получить этот логотип «Работает на моей машине»!) Я получил вызов Powershell, который отображает командное окно, и я вижу мерцание красного цвета перед тем, как оно закрывается.

Извините: Powershell 1.0, IronPython 1.1

Решение: powershell -noexit d: \ script \ foo.ps1

Ключ -noexit работал нормально. Я только добавил это к аргументам, которые я передаю от IronPython. Как я и подозревал, это то, что я, вероятно, могу исправить сам (политика выполнения, хотя я временно установил неограниченный режим без эффекта, поэтому я думаю, что мне нужно посмотреть глубже). Я задам другой вопрос, если у меня возникнут проблемы с этим.

Спасибо всем за помощь. Я узнал, что мне нужно исследовать переключатели PowerShell чуть подробнее, и я вижу немало вещей, которые окажутся полезными в будущем.

Ответы [ 10 ]

45 голосов
/ 27 августа 2009

Попробуйте с помощью переключателя -noexit:

powershell -noexit d:\script\foo.ps1
22 голосов
/ 08 июля 2014

У вас есть 3 варианта запрета закрытия окна консоли PowerShell, которые я описываю более подробно в своем блоге .

  1. Одноразовое исправление: Запустите сценарий из консоли PowerShell или запустите процесс PowerShell с помощью ключа -NoExit. например PowerShell -NoExit "C:\SomeFolder\SomeScript.ps1"
  2. Исправление по сценарию: Добавьте подсказку для ввода в конец файла сценария. например Read-Host -Prompt "Press Enter to exit"
  3. Глобальное исправление: Измените раздел реестра, чтобы всегда оставлять окно консоли PowerShell открытым после завершения работы сценария.

Вот ключи реестра, которые нужно изменить для опции # 3:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Applications\powershell.exe\shell\open\command]
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -NoExit \"& \\\"%1\\\"\""

[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\0\Command]
@="\"C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe\" -NoExit \"-Command\" \"if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & \\\"%1\\\"\""

См. мой блог для получения дополнительной информации и REG-файл, который будет автоматически применять эти изменения реестра.

6 голосов
/ 27 августа 2009

Мне это раньше требовалось, и обычно я не хотел изменять скрипт (обычно для скриптов, запускаемых из планировщика заданий). Я просто хотел посмотреть, что выплюнуло на консоль.

Все, что вам нужно сделать, это просто добавить команду Read-Host после вызова скрипта, например ::

PowerShell.exe -command { .\foo.ps1; read-host "Press enter key to continue" }

Кстати, проблема с использованием Start-Transcript заключается в том, что он не захватывает вывод EXE. И любая форма попыток регистрации в V1 и даже V2 со стандартным хостом не будет захватывать потоки подробных сообщений, отладки, прогресса или предупреждений. Вы можете увидеть их, только просмотрев соответствующее окно хоста.

Один хитрый, но эффективный способ получения всех выходных данных скрипта (stdout, stderr, verbose, warning, debug) - использовать другой хост, например cmd.exe, например ::1100

cmd.exe /c powershell.exe "$pwd\foo.ps1" > foo.log
2 голосов
/ 27 августа 2009

Обычной конструкции Try ... Catch в Powershell не существует; однако вы можете перехватывать исключения и реагировать должным образом. И.Е .:

Function Example() {
   trap [Exception] { 
      write-host "We have an error!"; 
      write-error $("ERROR: " + $_.Exception.Message); 
      sleep 30;
      break; 
   }

write-host "Hello world!";
throw "Something very bad has happened!";
}

Вы также можете смоделировать Построить ... Поймать конструкцию:

Function Example2() {
 ${
   write-host "Our try clause...";
   throw "...caused an exception! It hurts!";
 }

trap [Exception] {
  write-error $_.Exception.Message;
  sleep 30;
  continue;
}

Конечно, как только вы поймаете исключение в ловушку, вы можете зарегистрировать его, перевести в спящий режим или все, что захотите, с сообщением об ошибке. Мои примеры просто спят, позволяя вам прочитать, что произошло, но гораздо лучше регистрировать все ошибки. (Самый простой способ - перенаправить их с помощью >>).

Посмотрите также на: http://huddledmasses.org/trap-exception-in-powershell/

1 голос
/ 09 ноября 2015

Мое решение было выполнить скрипт с командной строкой из окна консоли вместо , щелкнув правой кнопкой мыши файл -> выполнить с powershell .

Консоль продолжает отображать сообщения об ошибках, хотя выполнение сценария закончилось.

1 голос
/ 11 июня 2014

Быстрое и грязное решение заключается в использовании CTRL + S для остановки прокрутки дисплея и CTRL + Q возобновить его.

1 голос
/ 27 августа 2009

У вас есть три варианта:

  • Сделайте уловку в скрипте (если используете Powershell V2 )
  • Написать манекен скрипт, который ловит и перенаправляет стандартный вывод, к которому вы можете получить доступ как переменная из вашего скрипта IronPython. VBS / Wscript Intro Дополнение к это просто щедро Read-Host команды везде, и нажмите «Вернуться на страницу».
  • Вместо того, чтобы выводить что-либо в оболочку, оберните ваш скрипт powershell во второй скрипт, который перенаправляет весь вывод в файл журнала .

    PS C:> myscript.ps1 | Out-File myscript.log

0 голосов
/ 30 января 2013

Создать run_ps_script.bat файл, содержащий

@PowerShell.exe -command "try { %1 } finally { read-host 'Press ENTER...' }"

и сделать его программой по умолчанию для открытия PowerShell scrips.

0 голосов
/ 27 августа 2009

Еще пара идей ... Вы можете использовать командлет start-sleep в конце сценария, чтобы у вас было достаточно времени для просмотра ошибки.

Вы также можете использовать start-transcript для записи сеанса в текстовый файл.

0 голосов
/ 27 августа 2009

Задумывались ли вы о перенаправлении stdout и stderr в файл, например:

. / Ascript.ps1> logs 2> & 1

Примечание. Вы можете создать скрипт-оболочку в powershell, который вызывает ваш скрипт powershell со всеми необходимыми перенаправлениями.

...