如何检测是否在新版Windows终端中运行?

8
Windows 终端预览版即将推出的一个新功能是完整的表情符号支持:

Windows Powershell running in Windows Terminal

相对于:

Windows Powershell

在Node.js中,我如何检测是否在Windows终端包装的终端中运行,而不是它的“裸”变体?是否有环境变量可以提取或同步测试可以执行?

如果你正在使用Node,process.env的输出是什么? - evolutionxbox
@evolutionxbox https://pastebin.com/t8vn2A7z - Richie Bendall
它似乎没有包含任何唯一标识PowerShell版本的内容? - evolutionxbox
@evolutionxbox 似乎是这样。 - Richie Bendall
1
@evolutionxbox 显然,检查 WT_SESSION 是当前的解决方案:https://github.com/microsoft/terminal/issues/1040 - Richie Bendall
2个回答

9
你可以检查环境变量WT_SESSION,它被设置为v4 UUID:https://github.com/microsoft/terminal/issues/1040 如果你想快速检查,可以使用以下方法:
!!process.env.WT_SESSION

你还可以使用更精细的方法,利用is-uuidis-wslprocess.platform

import isUUID from 'is-uuid';
import isWsl from 'is-wsl';

const isWindowsTerminal = (process.platform === "win32" || isWsl) && isUUID.v4(process.env.WT_SESSION);

2
注意:WT_SESSION 在 Windows 11 上并不总是设置。 - cuzi
注意事项:
  1. 如果在Windows终端中运行cmd或者运行启动另一个终端模拟器的GUI程序,该环境变量将被继承。
  2. 如果通过ssh运行,WT_SESSION将不会设置。
  3. 如果在Windows资源管理器中使用“在此处打开PowerShell”,WT_SESSION将不会设置, 因为powershell.exe是在终端应用程序之外启动的,然后稍后附加到它上面。 (来源:https://github.com/microsoft/terminal/issues/11057)
- 1j01
此外,我建议不要检查该值是否为GUID。这似乎只会让手动强制检测Windows终端变得烦人,并且在他们决定更改格式的情况下,使其不够具备未来性。我没有看到任何情况下格式的更改会减少它作为运行在Windows终端的指示器的价值,所以最好保持简单。 - 1j01
1
WT_SESSION 在使用 Visual Studio 2022 调试控制台应用时似乎未被设置。 - tig

0

我更喜欢这种方法(在PowerShell中)来自https://github.com/microsoft/terminal/issues/6269

function IsWindowsTerminal ($childProcess) {
    if (!$childProcess) {
        return $false
    } elseif ($childProcess.ProcessName -eq 'WindowsTerminal') {
        return $true
    } else {
        return IsWindowsTerminal -childProcess $childProcess.Parent
    }
}

我随后会在我的个人资料中使用它来启用例如oh-my-posh

$IsWindowsTerminal = IsWindowsTerminal -childProcess (Get-Process -Id $PID)
if($IsWindowsTerminal) {
    oh-my-posh --init --shell pwsh --config $HOME\Documents\mytheme.omp.json | Invoke-Expression
}

如果我在Windows Terminal下运行这个程序,它会返回false(Get-Process -Id $PID).ProcessName是“powershell”,而$childProcess没有Parent属性。因此,在第一次运行时它会跳到else语句,然后在第二次运行时会跳到!$childProcess语句。 - Dan Atkinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接