自定义PowerShell提示符并着色
系列 - Customize Prompt of Shell
目录
1 ANSI转义字符
和 Bash 类似, 要控制显示格式, 须使用 SGR 转义序列: ESC[<n>m
。简单理解, 以 ESC[
开头, 中间 <n>
处设置颜色, 以 m
结尾。
颜色代码参考微软官方文档 Text Formatting。
2 PowerShell 7.x
支持以 [char]27
和 `e
表示 ESC
。
对于 Prompt 的多行显示支持正常。
2.1 代码
参考 这里 设置永久配置 $PROFILE
, 将下面的代码写入, 使其在打开 PowerShell 时可以被预加载。
function prompt {
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = [Security.Principal.WindowsPrincipal] $identity
$adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator
"`r`n" + "`e[97m$(Get-Date -Format "HH:mm:ss")" + " " + "`e[91m$(if($principal.IsInRole($adminRole)) { "admin" } else { "senzyo" })" + "`e[97m@" + "`e[91m$env:computername" + " " + "`e[96m$(Get-Location)" + "`r`n" + "`e[91m$(if($principal.IsInRole($adminRole)) { "#" } else { "$" }) `e[0m"
}
2.2 解释
- Get-Date 输出当前日期和时间,
Get-Date -Format "HH:mm:ss"
指定输出格式 if($principal.IsInRole($adminRole)
以及$identity
,$principal
,$adminRole
用于判断当前用户是否为管理员- Get-Location 输出当前位置
2.3 效果
普通用户:
20:34:50 senzyo@Windows D:\Desktop$
管理员账户:
20:34:50 admin@Windows D:\Desktop#
3 PowerShell 5.x
支持以 [char]27
表示 ESC
, 不以支持 `e
表示。
BUG
PowerShell 5.x 对于 Prompt 的多行显示支持存在 BUG, 更高版本的 PowerShell 已修复此问题。
所以下面的样式只是单行。
3.1 代码
参考 这里 设置永久配置 $PROFILE
, 将下面的代码写入, 使其在打开 PowerShell 时可以被预加载。
function prompt {
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = [Security.Principal.WindowsPrincipal] $identity
$adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator
$ESC = [char]27
"$ESC[97m$(Get-Date -Format "HH:mm:ss")" + " " + "$ESC[91m$(if($principal.IsInRole($adminRole)) { "admin" } else { "senzyo" })" + "$ESC[97m@" + "$ESC[91m$env:computername" + " " + "$ESC[96m$(Get-Location)" + "$ESC[91m$(if($principal.IsInRole($adminRole)) { " #" } else { " $" }) $ESC[0m"
}
3.2 效果
普通用户:
20:34:50 senzyo@Windows D:\Desktop $
管理员账户:
20:34:50 admin@Windows D:\Desktop #
顺便一提
PowerShell 后跟启动参数
-nologo
, CMD 后跟启动参数 /k
, 可以取消显示顶端的版本和版权信息。