Как предотвратить закрытие окна PowerShell, чтобы я мог видеть ошибку?
Я создаю локальный скрипт загрузчика модуля PowerShell. Модуль и скрипт хранятся на сетевом ресурсе. Скрипт вызывает с помощью:
& 'netDSFShareShared DataPowershell ModulesInstall-MyModuleManager.ps1'
он копирует скрипт в папку стандартные модули профиля, а затем запускает установку.ps1 из папки модуля. Install.ps1
поднимает, если нужно. Перед закрытием окна с повышенными правами появляется красная ошибка, но окно закрывается слишком быстро, чтобы я мог увидеть ошибку. Как я могу узнать, что ошибка есть?
скрипт загрузчика вызывает установщик с помощью:
$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 и журналы событий безопасности, и нет никаких ошибок, связанных с этим.
все скрипт создать источник событий. Если вы хотите запустить его, вы можете использовать:
Remove-EventLog -Source 'My.Module.Manager'
затем, чтобы удалить его. Вот скрипт:
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, но для него нет тега.
3 ответов
у вас в основном есть 3 варианта, чтобы предотвратить закрытие окна консоли PowerShell, которое я описываю подробнее в моем блоге.
-
один раз: запустите сценарий с консоли PowerShell или запустите процесс PowerShell с помощью параметра-NoExit. например,
PowerShell -NoExit "C:\SomeFolder\SomeScript.ps1"
-
исправление каждого скрипта: добавьте приглашение для ввода в конец файла сценария. например.
Read-Host -Prompt "Press Enter to exit"
-
Глобальное Исправление: измените раздел реестра, чтобы всегда оставлять окно консоли PowerShell открытым после завершения работы сценария. Вот 2 раздела реестра, которые необходимо изменить:
● Откройте С Помощью → Windows PowerShell
При щелчке правой кнопкой мыши a .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
При щелчке правой кнопкой мыши a .ps1 файл и выберите запуск с помощью PowerShell (отображается в зависимости от установленной ОС Windows и обновлений).Ключ Реестра:
HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\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's stuff
}
catch
{
Write-Error $_.Exception.ToString()
Read-Host -Prompt "The above error occurred. Press Enter to exit."
}