Как предотвратить закрытие окна PowerShell, чтобы я мог видеть ошибку?
Я создаю локальный загрузчик модуля PowerShell script. Модуль и script хранятся в общем сетевом ресурсе. script вызывается с помощью:
& '\\net\DSFShare\Shared Data\Powershell Modules\Install-MyModuleManager.ps1'
Он копирует script в папку стандартных модулей профиля, затем запускает Install.ps1 из папки модуля. Install.ps1
при необходимости поднимается. Перед закрытым окном красная ошибка появляется, но окно слишком быстро закрывается, чтобы увидеть ошибку. Как узнать, что такое ошибка?
Загружающий script вызывает установщик, используя:
$installerPath = [IO.Path]::Combine($LocalModulePath, 'Install.ps1')
Write-Host "Installer path: $installerPath"
if (Test-Path $installerPath) {
Write-Host 'Install.ps1 exists. Running Install.ps1'
& $installerPath
}
Обратите внимание: если из PowerShell я заполняю $installerPath
и вызываю его с помощью & $installerPath
, я не вижу ошибки.
Я проверил журналы событий приложений, системы, Windows PowerShell и Security, и никаких ошибок, связанных с этим, нет.
Все script - это создание источника события. Если вы хотите запустить его, вы можете использовать:
Remove-EventLog -Source 'My.Module.Manager'
затем, чтобы удалить его. Здесь script:
Write-Host "Installing module..."
$eventSource = 'My.Module.Manager'
try {
$sourceExists = [System.Diagnostics.EventLog]::SourceExists($eventSource)
} catch [Security.SecurityException] {
Write-Verbose "Caught 'SecurityException': $_.Exception.Message"
}
if ($sourceExists) {
Write-Host "...installation complete..."
} else {
#region ----- Ensure-ProcessIsElevated -----
if ($Verbose) {
$VerbosePreference = "Continue"
}
if ($Debug) {
$DebugPreference = "Continue"
}
Write-Debug "Command line is ___$($MyInvocation.Line)___"
Write-Verbose "Entering script body"
if ($ScriptPath) {
Set-Location $ScriptPath
Write-Verbose "Working directory: $pwd"
}
If (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
Write-Warning "This script must be run with elevated privileges."
Write-Warning "Restarting as an elevated process."
Write-Warning "You will be prompted for authorization."
Write-Warning "You may click 'No' and re-run manually, if you prefer."
If ((Get-WmiObject Win32_OperatingSystem | select BuildNumber).BuildNumber -ge 6000) {
Write-Verbose "This is a UAC-enabled system. Elevating ..."
$CommandLine = "$($MyInvocation.Line.Replace($MyInvocation.InvocationName, $MyInvocation.MyCommand.Definition)) -ScriptPath $pwd"
Write-Verbose "CommandLine: $CommandLine"
Start-Process -FilePath PowerShell.exe -Verb Runas -ArgumentList "$CommandLine"
} else {
Write-Verbose "The system does not support UAC: an elevated process cannot be started."
Write-Warning "This script requires administrative privileges. Please re-run with administrative account."
}
Break
}
Write-Verbose "The script is now running with elevated privileges."
#endregion ----- Ensure-ProcessIsElevated -----
New-EventLog -LogName Application -Source $eventSource
Write-Host "...installation complete..."
}
Я использую PowerShell 4.0, но там нет тега.
Ответы
Ответ 1
В основном у вас есть 3 варианта запрета закрытия окна консоли PowerShell, которые я описываю более подробно в своем блоге.
- Единовременное исправление: Запустите сценарий из консоли PowerShell или запустите процесс PowerShell с помощью переключателя -NoExit. например
PowerShell -NoExit "C:\SomeFolder\SomeScript.ps1"
- Исправление для сценария: Добавьте подсказку для ввода в конец файла сценария. например
Read-Host -Prompt "Press Enter to exit"
Глобальное исправление: Измените раздел реестра, чтобы всегда оставлять окно PowerShell Console открытым после завершения работы сценария. Вот 2 раздела реестра, которые необходимо изменить:
● Открыть с помощью → Windows PowerShell
Если щелкнуть правой кнопкой мыши файл .ps1 и выбрать "Открыть с помощью
"Ключ реестра: HKEY_CLASSES_ROOT\Applications\powershell.exe\shell\open\command
Значение по умолчанию:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "%1"
Желаемое значение:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "& \"%1\""
● Запуск с PowerShell
Если щелкнуть правой кнопкой мыши файл .ps1 и выбрать Запуск с PowerShell (отображается в зависимости от того, какую ОС Windows и обновления вы установили).
Ключ реестра: HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\0\Command
Значение по умолчанию:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1'"
Желаемое значение:
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoExit "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & \"%1\""
Вы можете скачать файл .reg из моего блога, чтобы изменить ключи реестра, если вы не хотите делать это вручную.
Похоже, вы, вероятно, хотите использовать вариант № 2. Вы даже можете заключить весь скрипт в блок try и запрашивать ввод только в случае возникновения ошибки, например:
try
{
# Do your script stuff
}
catch
{
Write-Error $_.Exception.ToString()
Read-Host -Prompt "The above error occurred. Press Enter to exit."
}
Ответ 2
это заставит окно powershell ждать, пока вы не нажмете любую клавишу:
pause
Обновить один
Спасибо Стейну. это клавиша Enter, а не любая клавиша.
Ответ 3
Также простой и простой:
Start-Sleep 10