在 PowerShell 中,可以通过自定义 $prompt
变量来修改命令行提示符(Prompt)。以下是修改 PowerShell 提示符的一些基本方式:
简单修改:
你可以直接覆盖 $prompt
变量的内容,例如将其设为任何你想要的文字:
$prompt = "Hello, World PS> "
动态提示符:
利用 PowerShell 表达式来构造动态提示符,例如包含当前目录、时间戳或用户名等信息:
function prompt {
"$([System.Environment]::UserName) at $(Get-Location): $(Get-Date -Format 'HH:mm:ss') > "
}
颜色和样式:
使用 ANSI 转义码或 PowerShell 的 Write-Host 命令配合特殊字符来实现颜色和样式变化:
function prompt {
Write-Host -ForegroundColor Green -NoNewline "[ $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') ]"
Write-Host -ForegroundColor DarkCyan -NoNewline "($(Get-Location)) "
return ">"
}
使用 PowerShell 模块:
有一些社区开发的 PowerShell 模块,如 posh-git 和 oh-my-posh,专门用于增强和美化 PowerShell 提示符,尤其是针对 Git 用户,它们会在提示符中显示 Git 仓库的状态。
定制复杂的提示符:
你还可以根据自己的需求编写更为复杂的函数来定制提示符,它可以包含各种环境信息、快捷菜单项、甚至是图形元素(如在 Windows Terminal 应用中)。
function prompt {
$GitStatus = git status --porcelain 2>$null
$Branch = git rev-parse --abbrev-ref HEAD 2>$null
if ($LASTEXITCODE -eq 0) {
"$([char]0x1b)[32m[$Branch]$([char]0x1b)[0m$(if ($GitStatus) {' *'}) $($pwd.ProviderPath)\>"
} else {
"PS $($pwd.Path)>"
}
}
以上示例尝试获取 Git 分支信息并检查是否有未提交的更改,从而在提示符中显示 Git 相关状态。
请注意,对于不同版本的 PowerShell (尤其是跨平台的 PowerShell Core),提示符的定制可能会有所差异,需确保代码兼容对应的 PowerShell 版本。同时,为了防止与其他脚本冲突,建议在用户的配置文件(如 Microsoft.PowerShell_profile.ps1
)中进行个性化提示符的设置。
通过重写prompt来修改powershell命令行提示符的样式👺
本方案不需要第三方模块,但是需要自己编写和设计主题(可以clone或参考仓库)
文档中给出了基本信息和配置方式,这里不再赘述,而讨论许多配置效果以及可能遇到的问题
PowerShell 中的 prompt
函数是一个特殊内置函数,它负责定义命令行提示符的格式和内容。每当 PowerShell 完成一行命令的执行并准备接受下一条命令输入时,它会调用 prompt
函数来生成一个新的提示符字符串。
默认情况下,prompt
函数显示类似以下格式的提示符:
PS [当前目录]>
这里的 “PS” 是 PowerShell 的标识符,紧跟的是当前工作目录路径,然后是一个大于号(>),表示等待用户输入命令。
用户可以根据需要自定义 prompt
函数以改变提示符的行为和样式,例如添加时间戳、用户名、主机名、颜色等元素。例如,一个简单的自定义 prompt
函数可能如下所示:
function prompt {
"$([System.DateTime]::Now.ToString('yyyy-MM-dd HH:mm:ss')) $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) "
}
上述函数会让 PowerShell 提示符显示当前时间以及目录,而不是默认的格式。
通过编辑 prompt
函数,您可以完全个性化您的 PowerShell 控制台体验,使其更符合个人喜好或特定工作场景的需求。
如果机器上安装了许多软件,可能会遇到命令活别名冲突
例如我的机器上安装了MiniConda,并且配置了powershell启动Conda环境
然后发现了powershell内置的Prompt函数被覆盖了
PS>gcm prompt
CommandType Name Version Source
----------- ---- ------- ------
Function prompt 0.0 Conda
使用posh等美化工具需要比较大的开销,反映会变慢;
我们可以利用以下方法简单地修改默认地powershell提示符样式
function prompt_style
{
Set-Item -Path function:prompt -Value { 'PS ' + '🕰️' + (Get-Date -Format T) + ' ' + "[$(Get-Location)]" + ' ' }
# 显示时分秒,可以用-Format T 或 -Displayhint time
}
PS 🕰️11:45:19 [C:\repos\scripts]
日期或时间显示字段设置:Get-Date (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Learn
function Get-BatteryLevel
{
# get battery charge:
$charge = Get-CimInstance -ClassName Win32_Battery | Select-Object -ExpandProperty EstimatedChargeRemaining
return $charge
# "Current Charge:[ $charge %]."
# -replace '.*\[(.*)\].*', '$1'
}
function Set-PromptNice
{
Set-Item -Path function:prompt -Value { 'PS ' + '🕰️' + (Get-Date -Format T) + ' ' + "[$(Get-Location)]" + " 🔋$(Get-BatteryLevel)%" + '> ' }
# 显示时分秒,可以用-Format T 或 -Displayhint time
}
效果
#执行上述函数,调用之
PS C:\Users\cxxu>Set-PromptNice
#查看效果
PS 🕰️21:22:26 [C:\Users\cxxu] 🔋77%> pwd
Path
----
C:\Users\cxxu
深色主题 | 浅色主题 |
---|---|
有些用户觉得没必要,确实,通常没有必要去修改原生的shell样式
下面提到的Prompt样式虽然显示的项目不少,但是相应性能是不错的
$profile
中自动初始化的部分代码,也即是说刚启动一个新的powershell环境时,可能会有比较明显的延迟,但是加载完环境后,prompt具有良好的相应速度PS[BAT:77%][MEM:36.65% (11.62/31.70)GB][21:26:16]
# [C:\Windows]
Set-PromptVersion Balance
#目前可选的样式:
Balance Brilliant Brilliant2 Default Short short2 Simple
效果预览
PS[BAT:77%][MEM:36.64% (11.62/31.70)GB][21:24:13]
# [~\Desktop]
PS[BAT:77%][MEM:36.67% (11.63/31.70)GB][21:25:54]
# [~]
cd $env:windir
PS[BAT:77%][MEM:36.65% (11.62/31.70)GB][21:26:16]
# [C:\Windows]
这个提示符带有多个信息
配色丰富清晰(上一节的截图中查看)
具有较好的兼容性(没有花哨的字体和符号)
具有较高的相应速度
┌─PS[BAT:77%][MEM:39.84% (12.63/31.70)GB]
├─[cxxu@COLORFULCXXU][2024-04-19][21:44:35]
├─# [~\Desktop]
└─ pwd
Path
----
C:\Windows
在平衡样式的基础上进一步显示:userName@HostName
以及年月日的信息
并且用阶梯状的风格显示这个大Prompt😂
即便响应性能和平衡样式差不多,但过于花哨,容易喧宾夺主,我自己平时用的也比较少
经过实验,这几种样式响应性能都不错
如何优化
附上性能测试结果
#默认样式微调,性能是0.0001s级别的
PS [C:\repos\scripts]> test-PromptDelay
0.00019081 seconds
PS [C:\repos\scripts]> set-PromptVersion brilliant
#花哨样式,性能是0.01s级别的
┌─PS[BAT:77%][MEM:39.77% (12.61/31.70)GB]
├─[cxxu@COLORFULCXXU][2024-04-19][22:12:33]
├─# [C:\repos\scripts]
└─ test-PromptDelay
0.013235219999999997 seconds
#推荐的平衡样式性能为0.01s级别
PS[BAT:77%][MEM:39.62% (12.56/31.70)GB][22:12:44]
# [C:\repos\scripts]
test-PromptDelay
0.01090278 seconds
补充:test-PromptDelay
函数测试10次prompt刷新调用的平均耗时