Как мне предотвратить закрытие терминала Powershell при нажатии CTRL-C после его запуска из скрипта .ps1?

Вопрос или проблема

Я запускаю следующий скрипт в Powershell:

start powershell @'
    $Host.UI.RawUI.BackgroundColor = \"red\"
    $Host.UI.RawUI.ForegroundColor = \"black\"
    [console]::WindowWidth=100;
    [console]::WindowHeight=30;
    Clear-Host
    cd application1\backend
    npm run start
'@

start powershell @'
    $Host.UI.RawUI.BackgroundColor = \"blue\"
    $Host.UI.RawUI.ForegroundColor = \"white\"
    [console]::WindowWidth=100;
    [console]::WindowHeight=30;
    Clear-Host
    cd application2\backend
    npm run start
'@

start powershell @'
    $Host.UI.RawUI.BackgroundColor = \"yellow\"
    $Host.UI.RawUI.ForegroundColor = \"black\"
    [console]::WindowWidth=100;
    [console]::WindowHeight=30;
    Clear-Host
    cd application3\backend
    npm run start
'@

Это открывает 3 новых терминала Powershell и запускает 3 разные нодовские приложения (по одному на терминал).

Все работает хорошо, кроме того, что когда я завершаю выполнение нодовского приложения, нажав ctrl-c, терминал закрывается.

Как я могу сохранить терминал открытым после нажатия ctrl-c, чтобы я мог взаимодействовать с ним так же, как с обычным терминалом Powershell, который я открыл вручную?

Вот что я пробовал:

  • Добавил Read-Host в конце каждого блока скрипта. Это не сработало, потому что, пока он ожидает ввода пользователя после нажатия ctrl-c (тем самым не закрывая терминал), терминал закрывается, как только я ввожу данные.
  • Добавил [console]::TreatControlCAsInput = $true в начале каждого блока скрипта. Это полностью отключает работу ctrl-c, так что я не могу завершить выполнение нодовских приложений.
  • Добавил -NoExit после start powershell в каждом блоке скрипта, но это вызывает ошибку.

Любая помощь будет очень полезна. Спасибо!

Я на Windows 10.

Ответ или решение

Чтобы предотвратить автоматическое закрытие терминала PowerShell после нажатия комбинации клавиш CTRL-C, когда вы запускаете свои скрипты из .ps1 файла, вам следует рассмотреть несколько стратегий. Обратите внимание на то, что по умолчанию при выполнении команд в терминале PowerShell, нажатие CTRL-C прерывает выполнение текущей команды и закрывает окно терминала, если это было реализовано при запуске нового сеанса.

Пошаговое руководство по решению проблемы:

1. Использование -NoExit флага

Одним из простейших способов сохранить окно терминала открытым — это добавить флаг -NoExit. Однако, поскольку при запуске нового экземпляра PowerShell через команду Start-Process не получится использовать этот флаг напрямую, вы можете использовать альтернативное решение:

Start-Process powershell.exe -ArgumentList '-NoExit', '-Command', @'
    $Host.UI.RawUI.BackgroundColor = "red"
    $Host.UI.RawUI.ForegroundColor = "black"
    [console]::WindowWidth=100;
    [console]::WindowHeight=30;
    Clear-Host
    cd application1\backend
    npm run start
'@

2. Обработка исключений

Чтобы контролировать поведение после нажатия CTRL-C, вы можете добавить обработчик исключений в вашу команду. Если внешний процесс (например, npm) завершится, это вызовет изменение статуса для вашего PowerShell-скрипта, где вы сможете вывести сообщение и оставить терминал открытым.

try {
    npm run start
} catch {
    Write-Host "Процесс был прерван. Вы можете ввести команды."
    # Здесь можно добавить логику ожидания ввода, если необходимо
    while ($true) {
        Read-Host "Введите command для продолжения или exit для завершения" | ForEach-Object {
            if ($_ -eq 'exit') { break }
            Invoke-Expression $_
        }
    }
}

3. Использование Start-Job

Как альтернатива, вы можете использовать PowerShell Jobs для выполнения вашего npm-сервера в фоновом режиме. Это даст вам возможность управлять процессом без закрытия терминала при его завершении.

Start-Job -ScriptBlock {
    # Ваш код здесь, включая команды для изменения интерфейса
    npm run start
}

4. Использование -Command с флагом -NoExit

Команда Start-Process также может быть настроена на создание терминала, который не закроется после завершения скрипта. Пример этого:

Start-Process powershell.exe -ArgumentList '-NoExit', '-Command', @'
    $Host.UI.RawUI.BackgroundColor = "blue"
    $Host.UI.RawUI.ForegroundColor = "white"
    [console]::WindowWidth=100;
    [console]::WindowHeight=30;
    Clear-Host
    cd application2\backend
    npm run start
'@

Заключение

Эти подходы должны помочь вам избежать закрытия терминала при нажатии CTRL-C. Путем создания обработки исключений или использования фоновых процессов можно достичь большей гибкости в управлении приложениями, запущенными из PowerShell. Попробуйте предложенные методы и выберите подходящий с учетом ваших требований.

Оцените материал
Добавить комментарий

Капча загружается...