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

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

4b9b3361

Ответ 1

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

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