Как предотвратить закрытие окна 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, которое я описываю подробнее в моем блоге.

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

это заставит окно powershell ждать, пока вы не нажмете любую клавишу:

pause

также просто и легко:

Start-Sleep 10