Распознать новый терминал Windows из сценария PowerShell
Я пишу новый сценарий PowerShell и хочу использовать юникод-смайлики, которые теперь поддерживаются новым Windows Terminal Preview. Однако для пользователя, использующего "устаревшую" PowerShell, которая его не поддерживает, я не хочу показывать нераспознанные символы, а вместо этого я хотел бы показать ему какой-нибудь другой текст / знак.
Чтобы быть более простым - я хотел бы знать, когда мой скрипт PS работает в новом терминале, показать одну вещь и показать что-то другое для других терминалов PS.
Я пытался использовать $env:TERM_PROGRAM
, Если я использую это внутри PS-терминала vscode, он возвращает "vscode", но под обычным терминалом PS или новым терминалом он ничего не возвращает.
Есть идеи?
3 ответа
Терминал Windows все еще находится в зачаточном состоянии, и его не так много, чтобы идентифицировать его, но я заметил, что он добавляет переменную среды WT_SESSION, вы можете попробовать проверить это:
if ($env:WT_SESSION) {
"I am in Windows Terminal"
} else {
"Nothing to see here..."
}
В качестве альтернативы другому ответу, не зависящему от среды, вы можете проверить родительский стек процесса для исполняемого файла терминала:
$isTerminal = {
$p = Get-CimInstance -ClassName Win32_Process -Filter ProcessID=$PID
while ($p) {
($p = Get-CimInstance -ClassName Win32_Process -Filter ProcessID=$($p.ParentProcessID) -ErrorAction Ignore)
}
}.Invoke().Name -contains 'WindowsTerminal.exe'
Это метод, который я использовал, чтобы определить, нахожусь ли я в conemu.
Под CMD:
IF DEFINED ConEmuHWND ECHO This is a ConEmu console.
IF [%ConEmuANSI%]==[ON] ECHO This ConEmu console has ANSI enabled.
IF DEFINED WT_SESSION ECHO This is a Windows Terminal.
IF [%TERM_PROGRAM%]==[Tabby] ECHO This is a Tabby console.
Примечание. Обычно для Tabby всегда включен ANSI. ConEmu может отключить ANSI в настройках.
Под ЗШ:
if [[ "$ConEmuBackHWND" != "" && $TERM =~ '^xterm' ]]; then echo This is a ConEmu Xterm.; fi
У меня нет zsh ни в Windows Terminal, ни в Tabby, но я предполагаю, что переменные среды $WT_SESSION и $TERM_PROGRAM определены аналогичным образом. Это ваше испытание.