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

Окно Powershell исчезает, прежде чем я смогу прочитать сообщение об ошибке

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

У меня есть Powershell script, который отправляет электронное письмо с вложением с использованием классов .NET. Если я вызываю script напрямую, выполняя его из командной строки или вызывая его из Планировщика Windows, тогда он работает нормально. Если я вызову его из другого script (IronPython, если это имеет значение), то он терпит неудачу. Все сценарии отлично работают на моей машине разработки. (Мне действительно нужно получить логотип "Works on My Machine"!). Мне позвонил Powershell, который показывает окно команд, и я вижу мерцание красного цвета перед тем, как оно закрывается.

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

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

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

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

4b9b3361

Ответ 1

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

powershell -noexit d:\script\foo.ps1

Ответ 2

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

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

Вот ключи реестра для изменения для опции № 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, который автоматически применит эти изменения реестра.

Ответ 3

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

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

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

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

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

cmd.exe /c powershell.exe "$pwd\foo.ps1" > foo.log

Ответ 4

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

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

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

Ответ 5

Нет обычной попытки... Поймать строительство в Powershell; однако вместо этого вы можете перехватывать исключения и правильно реагировать. I.E:

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!";
}

Вы также можете имитировать Try... Catch construction:

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/

Ответ 6

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

Ответ 7

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

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

Ответ 8

Вы думали о перенаправлении stdout и stderr в файл ex:

./ascript.ps1 > logs 2 > & 1

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

Ответ 9

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

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

Ответ 10

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

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

и запустите программу по умолчанию, чтобы открыть PowerShell скрипты.