PowerShell 命令执行状态可视化:绿色圈成功、红色圈失败(VS Code 适用)

在使用 PowerShell 时,我们经常需要执行脚本或.exe 程序,但每次都要手动输echo $?判断执行结果(True成功、False失败)很麻烦。有没有办法让命令执行后,自动用颜色标记结果?比如绿色圈代表成功,红色圈代表失败?

这篇文章就分享一个轻量方案:通过自定义 PowerShell 提示符(prompt函数),实现 “命令执行后自动显示状态标记”,同时兼容 VS Code 终端(它会启动PowerShell),还区分新老 PowerShell 版本做了适配。

一、需求场景与核心思路

1. 痛点

  • 执行./test.exe或脚本后,无法直观判断结果,需额外输入$?

  • 清屏命令(cls/clear)后若显示状态标记,会破坏清屏效果

  • 老版本 PowerShell 不支持 ANSI 颜色转义字符,直接用颜色圈会乱码

2. 核心思路

  • 利用 PowerShell 的prompt特殊函数:每次执行命令后,PowerShell 会自动调用该函数生成新提示符

  • $?变量判断命令执行状态(True成功、False失败)

  • 新老版本适配:新版本用 ANSI 颜色转义字符显示 “绿 / 红圈”,老版本用 “SUCCESS/ERROR” 文本

  • 排除清屏命令:执行cls/clear(含空格、分号变体)时不显示状态标记

二、新版本方案(支持 ANSI 颜色,VS Code/Win11 终端适用)

1. 适用场景

  • PowerShell 7+(默认支持 ANSI 颜色)

  • VS Code 终端(新版本默认启用 ANSI 颜色,无需额外配置)

  • Win11 自带 PowerShell(已支持 ANSI 颜色)

2. 完整代码

# 初始化标记变量:控制状态标记只显示一次
$script:showIndicator = $false

function prompt {
    # 1. 获取上一条命令的执行状态(转为字符串,避免布尔值判断异常)
    $lastStatus = $?.ToString()

    # 2. 获取上一条命令并清洗:处理空格、分号、大小写(兼容各种输入格式)
    $lastCommand = (Get-History | Select-Object -Last 1 -ErrorAction SilentlyContinue | ForEach-Object { 
        # 步骤:先去首尾分号 → 再去首尾空格 → 转为小写(忽略大小写)
        $_.CommandLine.Trim(';').Trim(' ').ToLower()
    })

    # 3. 排除清屏命令:执行cls/clear时不显示状态标记
    if ($lastCommand -eq "cls" -or $lastCommand -eq "clear") {
        $script:showIndicator = $false
    }

    # 4. 显示状态标记:成功绿圈、失败红圈
    if ($script:showIndicator) {
        if ($lastStatus -eq "True") {
            Write-Host "`e[32m●`e[0m"  # ANSI绿色:`e[32m`设置颜色,`e[0m`重置颜色
        } else {
            Write-Host "`e[31m●`e[0m"  # ANSI红色:同理
        }
        $script:showIndicator = $false  # 显示后重置,避免重复显示
    }
    
    # 5. 标记下一次命令需要显示状态
    $script:showIndicator = $true
    # 6. 自定义提示符(保留默认路径格式)
    "PS $($PWD.Path)>"
}

3. 关键代码解析

(1)ANSI 颜色转义字符
  • \e[32m:将后续文本设置为绿色(32是 ANSI 绿色代码)

  • \e[31m:将后续文本设置为红色(31是 ANSI 红色代码)

  • \e[0m:重置文本颜色为默认(必须加,避免后续提示符也变颜色)

(2)命令清洗逻辑

为什么要Trim(';').Trim(' ').ToLower()

为了兼容各种 “不规范” 的清屏命令输入,比如:

  • clear ;(大量空格加分号)

  • CLS (大写加空格)

  • Clear ;(首字母大写加分号)

    清洗后都会变成clearcls,确保能正确排除。

(3)状态标记控制
  • $script:showIndicator:脚本级变量(跨函数保留值),避免 “每次显示提示符都重复出标记”

  • 执行命令后设为$true,显示标记后设为$false,确保 “一个命令只显示一次标记”

三、老版本方案(不支持 ANSI 颜色,用文本标记)

1. 适用场景

  • PowerShell 5.1 及以下(默认不支持 ANSI 颜色,直接用会显示乱码)

  • 旧版 Windows 终端(如 Win10 早期版本)

2. 完整代码

# 初始化标记变量(和新版本一致)
$script:showIndicator = $false

function prompt {
    # 1. 获取执行状态(和新版本一致)
    $lastStatus = $?.ToString()

    # 2. 清洗命令(和新版本一致,兼容清屏命令)
    $lastCommand = (Get-History | Select-Object -Last 1 -ErrorAction SilentlyContinue | ForEach-Object { 
        $_.CommandLine.Trim(';').Trim(' ').ToLower()
    })

    # 3. 排除清屏命令(和新版本一致)
    if ($lastCommand -eq "cls" -or $lastCommand -eq "clear") {
        $script:showIndicator = $false
    }

    # 4. 显示文本标记:用SUCCESS/ERROR替代颜色圈
    if ($script:showIndicator) {
        if ($lastStatus -eq "True") {
            Write-Host "SUCCESS"  # 成功:显示SUCCESS
        } else {
            Write-Host "ERROR"    # 失败:显示ERROR
        }
        $script:showIndicator = $false
    }
    
    $script:showIndicator = $true
    "PS $($PWD.Path)>"
}

3. 核心差异

去掉了 ANSI 颜色转义字符,用 “SUCCESS/ERROR文本” 替代 “绿 / 红圈”,避免老版本终端乱码,功能逻辑完全一致。

四、使用步骤

打开 PowerShell,输入以下命令:

1. 首先检查配置文件是否存在:

Test-Path $PROFILE

输出False跳转步骤2True跳转步骤3

2. 如果不存在,创建配置文件:

New-Item -Path $PROFILE -Type File -Force

默认路径通常是:
C:\Users\你的用户名\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

3. 编辑配置文件,把代码复制到文件里:

notepad $PROFILE

4. 生效配置

方法 1:关闭当前 PowerShell 终端,重新打开(配置文件会自动加载)

方法 2:在当前终端输入以下命令,手动加载配置:

. $PROFILE

五、测试案例

1. 测试成功场景

执行一个肯定能成功的命令,比如查看当前目录:

PS C:\test> ls

# (显示目录文件列表)# 新版本显示绿色圈,老版本显示SUCCESS

PS C:\test>

在这里插入图片描述

2. 测试失败场景

执行一个不存在的程序:

PS C:\test> ./nonexistent.exe

# (显示错误提示:无法找到程序)# 新版本显示红色圈,老版本显示ERROR

PS C:\test>

在这里插入图片描述

3. 测试清屏场景

执行清屏命令,无论怎么输入,都不会显示标记:

PS C:\test> clear                ;  # 大量空格加分号

# (屏幕清空,无任何标记)

PS C:\test>

4. VSCode测试

在这里插入图片描述

六、常见问题解决

1. VS Code 终端不显示颜色?

新版本 VS Code 默认支持 ANSI 颜色,若不显示,按以下步骤检查:

  • 打开 VS Code 设置 → 搜索 “terminal.integrated.enableANSI” → 确保勾选 “启用 ANSI 颜色支持”
  • 检查是否启动的是 PowerShell 终端

2. 执行. $PROFILE报错 “权限不足”?

这是 PowerShell 执行策略限制,输入以下命令修改执行策略(仅当前用户生效):

Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

按提示输入Y确认,之后再执行.$PROFILE即可。

3. 刚打开终端时,第一次执行命令不显示标记?

正常现象!因为 “初始化标记变量” 设为$false,第一次执行命令后,标记才会被设为$true,从第二次命令开始就正常了。

七、总结

这个方案的核心是 “利用prompt函数自动触发状态显示”,既解决了 “手动判断执行结果” 的麻烦,又通过命令清洗兼容了各种清屏场景,还区分新老版本做了适配。无论是本地 PowerShell 还是 VS Code 终端,都能轻松用起来,让命令执行结果 “一眼可见”。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐