目录

自定义PowerShell提示符并着色

系列 - Customize Prompt of Shell

和 Bash 类似, 要控制显示格式, 须使用 SGR 转义序列: ESC[<n>m。简单理解, 以 ESC[ 开头, 中间 <n> 处设置颜色, 以 m 结尾。

颜色代码参考微软官方文档 Text Formatting

支持以 [char]27 和 `e 表示 ESC

对于 Prompt 的多行显示支持正常。

参考 这里 设置永久配置 $PROFILE, 将下面的代码写入, 使其在打开 PowerShell 时可以被预加载。

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"
}
  • Get-Date 输出当前日期和时间, Get-Date -Format "HH:mm:ss" 指定输出格式
  • if($principal.IsInRole($adminRole) 以及 $identity, $principal, $adminRole 用于判断当前用户是否为管理员
  • Get-Location 输出当前位置

普通用户:


20:34:50 senzyo@Windows D:\Desktop
$

管理员账户:


20:34:50 admin@Windows D:\Desktop
#

支持以 [char]27 表示 ESC, 不以支持 `e 表示。

BUG

PowerShell 5.x 对于 Prompt 的多行显示支持存在 BUG, 更高版本的 PowerShell 已修复此问题。

所以下面的样式只是单行。

参考 这里 设置永久配置 $PROFILE, 将下面的代码写入, 使其在打开 PowerShell 时可以被预加载。

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"
}

普通用户:

20:34:50 senzyo@Windows D:\Desktop $

管理员账户:

20:34:50 admin@Windows D:\Desktop #

顺便一提
PowerShell 后跟启动参数 -nologo, CMD 后跟启动参数 /k, 可以取消显示顶端的版本和版权信息。