Распознать новый терминал 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 определены аналогичным образом. Это ваше испытание.

Другие вопросы по тегам