PowerShell 命令执行状态可视化:绿色圈成功、红色圈失败(VS Code 适用)
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 ;(首字母大写加分号)清洗后都会变成
clear或cls,确保能正确排除。
(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跳转步骤2,True跳转步骤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 终端,都能轻松用起来,让命令执行结果 “一眼可见”。
更多推荐



所有评论(0)