Вопрос или проблема
Я запускаю следующий скрипт в 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. Попробуйте предложенные методы и выберите подходящий с учетом ваших требований.