惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
J
Java Code Geeks
博客园_首页
Google Online Security Blog
Google Online Security Blog
Hugging Face - Blog
Hugging Face - Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
I
Intezer
P
Palo Alto Networks Blog
V
Vulnerabilities – Threatpost
雷峰网
雷峰网
O
OpenAI News
SecWiki News
SecWiki News
小众软件
小众软件
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
N
News | PayPal Newsroom
Project Zero
Project Zero
Forbes - Security
Forbes - Security
IT之家
IT之家
A
Arctic Wolf
WordPress大学
WordPress大学
Jina AI
Jina AI
T
Tor Project blog
博客园 - 三生石上(FineUI控件)
S
Secure Thoughts
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
博客园 - 聂微东
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Privacy International News Feed
Cloudbric
Cloudbric
G
GRAHAM CLULEY
博客园 - 叶小钗
H
Hacker News: Front Page
腾讯CDC
量子位
Help Net Security
Help Net Security
人人都是产品经理
人人都是产品经理
C
Cyber Attacks, Cyber Crime and Cyber Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
宝玉的分享
宝玉的分享
爱范儿
爱范儿
L
Lohrmann on Cybersecurity
Hacker News - Newest:
Hacker News - Newest: "LLM"
Recorded Future
Recorded Future
C
CERT Recently Published Vulnerability Notes

博客园 - osoft

Sound Disable-Download-Chrome-AI-Mode Audio-Channel DAR-PAR-SAR ffmpeg-layouts Blender-Tank-Tracks Blender-Curve Bézier-curve Bézier-VS-NURBS Walking-leg-mechanism-in-Blender Blender-Armatures Blender-Rigid-Body Simulate-pendulum-motion-using-Blender Platonic-solids Differential-Gear otvinta-Bevel-Gear-Calculator Bevel-gears Epicyclic-gearing Blender-Gears Blender5-WindowUI Video-file-size Windows-Execution-Policies Windows-UAC Windows-Commands-prompt Windows-GameBar-ErrorLog Microsoft-Store-error Chrome-Gemini-Nano Windows-sfc Windows-Delivery-Optimization Windows-icacls Dism-Cleanup-image DISM-Get-cmds Windows11-GPT Generate-MAC-Address
Windows-PowerShell-prompt
osoft · 2025-12-16 · via 博客园 - osoft
1. about_Prompts
	1.1 获取 prompt 函数
	1.2 获取 prompt 脚本
	1.3 默认提示符
	1.4 内置提示符
2. 自定义当前会话的提示符
	2.1 几个简单的例子
	2.2 检测是否管理员运行
	2.3 显示历史记录ID
	2.4 随机更改颜色的提示符
3. 自定义配置文件
	3.1 about_Profiles
	3.2 配置文件类型和位置
	3.3 $PROFILE 变量
	3.4 创建配置文件
	3.5 编辑配置文件
	3.6 修改执行策略-允许本地脚本运行
	3.7 NoProfile 参数
	3.8 添加更多个性化设置
4. 转载一个不错的配置

1. about_Prompts

PowerShell 具有内置 prompt 函数。 可以在 PowerShell 配置文件脚本中定义自定义 prompt 函数。 

function prompt { <function-body> }

prompt 函数必须返回一个对象。 最佳做法是返回一个字符串或格式化为字符串的对象。 建议最大长度是 80 个字符。 

PS C:\Windows\system32> function prompt {"Hello, World > "}

Hello, World >

1.1 获取 prompt 函数

若要获取 prompt 函数,请在 Function 驱动器中使用 Get-Command cmdlet 或使用 Get-Item cmdlet。

Get-Command prompt

CommandType     Name                                               Version    Source

Function        prompt

Get-Item Function:prompt

CommandType     Name                                               Version    Source

Function        prompt

1.2 获取 prompt 脚本

若要获取设置提示符的值的脚本,请使用函数的 ScriptBlockprompt 属性。 

PS C:\Windows\system32> (Get-Command prompt).ScriptBlock

与所有函数一样,prompt 函数存储在 Function: 驱动器中。 若要显示创建当前 prompt 函数的脚本,请键入: 

PS C:\Windows\system32> (Get-Item Function:prompt).ScriptBlock

1.3 默认提示符

仅当 prompt 函数生成错误或未返回对象时,才会显示默认提示符。

默认 PowerShell 提示符为:

PS>

例如,以下命令将 prompt 函数设置为 $null,这是无效的。 因此会显示默认提示符。 

 function prompt {$null}

PS>

因为 PowerShell 附带内置提示符,所以通常不会看到默认提示符。 

1.4 内置提示符

PowerShell 包含内置 prompt 函数。 

function prompt {
  "PS $($ExecutionContext.SessionState.Path.CurrentLocation)$('>' * ($NestedPromptLevel + 1)) ";
  # .Link
  # https://go.microsoft.com/fwlink/?LinkID=225750
  # .ExternalHelp System.Management.Automation.dll-help.xml
}

该函数使用 Test-Path cmdlet 测试 $PSDebugContext 自动变量是否具有值。 

  • 如果 $PSDebugContext 具有值,则你在调试模式下运行,且 [DBG]: 已添加到提示符,如下所示: 
    • [DBG]: PS C:\ps-test>
  • 如果未填充 $PSDebugContext,则函数会将 PS 添加到提示符。 并且,该函数使用 Get-Location cmdlet 获取当前文件系统目录位置。 随后,它会添加一个右尖括号 (>)。 
    • PS C:\ps-test>
  • 如果处于嵌套提示符中,则该函数会将两个尖括号 (>>) 添加到提示符。
  • 如果 $NestedPromptLevel 自动变量的值大于 0,则处于嵌套提示符中。
  • 例如,在嵌套提示符中进行调试时,提示符类似于以下提示符:
    • [DBG] PS C:\ps-test>>>

2. 自定义当前会话的提示符

若要自定义提示符,请编写新的 prompt 函数。 该函数不受保护,因此可以覆盖它。

若要编写 prompt 函数,请键入以下内容:

function prompt { }

随后在大括号之间,输入创建提示符的命令或字符串。

2.1 几个简单的例子

例如,下面的提示符包含计算机名称:

PS C:\Windows\system32> function prompt {"PS [$Env:COMPUTERNAME]> "}

PS [TOMPC]>

下面的 prompt 函数包含当前日期和时间: 

PS [TOMPC]> function prompt {"$(Get-Date)> "}

12/11/2025 20:45:35>

路径+日期

function prompt {"$(Get-Location) $(Get-Date)> "}

格式化后的时间+路径

function prompt {"[ $(Get-Date -Format 'HH:mm:ss') ] $(Get-Location) >"}

2.2 检测是否管理员运行

还可以更改默认 prompt 函数:

例如,以下修改后的 prompt 函数在提升的会话中运行时,会将 [ADMIN]: 添加到内置的 PowerShell 提示符。

function prompt {
  $identity = [Security.Principal.WindowsIdentity]::GetCurrent()
  $principal = [Security.Principal.WindowsPrincipal] $identity
  $adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator

$(if (Test-Path Variable:/PSDebugContext) { '[DBG]: ' }
    elseif($principal.IsInRole($adminRole)) { "[ADMIN]: " }
    else { '' }
  ) + 'PS ' + $(Get-Location) +
    $(if ($NestedPromptLevel -ge 1) { '>>' }) + '> '
}

使用“以管理员身份运行”选项启动 PowerShell 时,会显示类似于以下提示符的提示符: 

[ADMIN]: PS C:\Windows\system32>

2.3 显示历史记录ID

以下 prompt 函数显示下一个命令的历史记录 ID。 若要查看命令历史记录,请使用: Get-History 

function prompt {
   # The at sign creates an array in case only one history item exists.
   $history = @(Get-History)
   if($history.Count -gt 0)
   {
      $lastItem = $history[$history.Count - 1]
      $lastId = $lastItem.Id
   }

$nextCommand = $lastId + 1
   $currentDirectory = Get-Location
   "PS: $nextCommand $currentDirectory >"
}

PS: 7 C:\Windows\system32 >

PS: 7 C:\Windows\system32> get-history

  Id CommandLine

  -- -----------

   1 (Get-Item Function:prompt).ScriptBlock

   2  Get-Location

   3 function prompt {"PS [$Env:COMPUTERNAME]> "}

   4 function prompt {"$(Get-Date)> "}

   5 function prompt {...

   6 function prompt {...

PS: 8 C:\Windows\system32 >

2.4 随机更改颜色的提示符

以下提示符使用 Write-Host 和 Get-Random cmdlet 创建随机更改颜色的提示符。 因为 Write-Host 会写入当前主机应用程序,但不会返回对象,所以此函数包含 return 语句。 如果没有该语句,则 PowerShell 会使用默认提示符 PS>。 

function prompt {
    $color = Get-Random -Min 1 -Max 16
    Write-Host ("PS " + $(Get-Location) +">") -NoNewline -ForegroundColor $Color
    return " "
}

PS C:\Windows\system32>

3. 自定义配置文件

3.1 about_Profiles

与任何函数一样,prompt 函数仅存在于当前会话中。如前一章的例子。

PowerShell 配置文件是在 PowerShell 启动时运行的脚本。

  • 可以使用配置文件作为启动脚本来自定义环境。
  • 可以将如前一章的例子都添加到配置文件中。
  • 可以添加命令、别名、函数、变量、模块、PowerShell 驱动器等。
  • 还可以将其他特定于会话的元素添加到配置文件中,以便在每个会话中都可用,而无需导入或重新创建它们。

PowerShell 支持多个用户和主机程序的配置文件。但是,它不会为你创建配置文件。

3.2 配置文件类型和位置

PowerShell 支持多个范围限定为用户和 PowerShell 主机的配置文件。 你可以在计算机上拥有任何或全部这些配置文件。

PowerShell 控制台支持以下基本配置文件。 这些文件路径是默认位置。

  • 所有用户、所有主机 AllUsersAllHosts
    • Windows- $PSHOME\Profile.ps1
    • Linux - /opt/microsoft/powershell/7/profile.ps1
    • macOS - /usr/local/microsoft/powershell/7/profile.ps1
  • 所有用户,当前主机
    • Windows- $PSHOME\Microsoft.PowerShell_profile.ps1
    • Linux - /opt/microsoft/powershell/7/Microsoft.PowerShell_profile.ps1
    • macOS - /usr/local/microsoft/powershell/7/Microsoft.PowerShell_profile.ps1
  • 当前用户、所有主机
    • Windows- $HOME\Documents\PowerShell\Profile.ps1
    • Linux - ~/.config/powershell/profile.ps1
    • macOS - ~/.config/powershell/profile.ps1
  • 当前用户,当前主机 CurrentUserCurrentHost
    • Windows- $HOME\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
    • Linux - ~/.config/powershell/Microsoft.PowerShell_profile.ps1
    • macOS - ~/.config/powershell/Microsoft.PowerShell_profile.ps1

配置文件脚本按列出的顺序执行。 这意味着,

  • AllUsersAllHosts 配置文件中所做的更改可由任何其他配置文件脚本重写。
  • CurrentUserCurrentHost 配置文件始终最后运行。

在 PowerShell 帮助中,CurrentUserCurrentHost 最常称为 PowerShell 配置文件。

托管 PowerShell 的其他程序可以支持自己的配置文件。 

例如,Visual Studio Code (VS Code) 支持以下特定于主机的配置文件。 

  • 所有用户,当前主机 - $PSHOME\Microsoft.VSCode_profile.ps1
  • 当前用户、当前主机 - $HOME\Documents\PowerShell\Microsoft.VSCode_profile.ps1

配置文件路径包括以下变量:

  • $PSHOME 变量存储 PowerShell 的安装目录
  • $HOME 变量存储当前用户的主目录

3.3 $PROFILE 变量

$PROFILE

D:\Tom\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

$PROFILE 自动变量存储当前会话中可用的 PowerShell 配置文件的路径。

若要查看配置文件路径,请显示 $PROFILE 变量的值。 还可以在命令中使用 $PROFILE 变量来表示路径。

$PROFILE 变量存储“当前用户、当前主机”配置文件的路径。 其他配置文件保存在 $PROFILE 变量的注释属性中。

例如,$PROFILE 变量在 Windows PowerShell 控制台中具有以下值。

  • 当前用户、当前主机 - $PROFILE
  • 当前用户、当前主机 - $PROFILE.CurrentUserCurrentHost
  • 当前用户、所有主机 - $PROFILE.CurrentUserAllHosts
  • 所有用户、当前主机 - $PROFILE.AllUsersCurrentHost
  • 所有用户、所有主机 - $PROFILE.AllUsersAllHosts

由于每个用户和每个主机应用程序中 $PROFILE 变量的值发生更改,因此请确保在所使用的每个 PowerShell 主机应用程序中显示配置文件变量的值。

若要查看 $PROFILE 变量的当前值,请键入:

 $PROFILE | Select-Object *

AllUsersAllHosts       : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1

AllUsersCurrentHost    : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1

CurrentUserAllHosts    : D:\Tom\Documents\WindowsPowerShell\profile.ps1

CurrentUserCurrentHost : D:\Tom\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

Length                 : 67

PS C:\Windows\system32>

可以在许多命令中使用 $PROFILE 变量。 例如,以下命令在记事本中打开“当前用户,当前主机”配置文件: 

 notepad $PROFILE

 $PROFILE

D:\Tom\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

以下命令确定是否在本地计算机上创建了“所有用户,所有主机”配置文件: 

 Test-Path -Path $PROFILE.AllUsersAllHosts

FALSE

3.4 创建配置文件

若要创建 PowerShell 配置文件,请使用以下命令格式:

if (!(Test-Path -Path <profile-name>)) {   New-Item -ItemType File -Path <profile-name> -Force }

例如,若要在当前 PowerShell 主机应用程序中为当前用户创建配置文件,请使用以下命令: 

if (!(Test-Path -Path $PROFILE)) {   New-Item -ItemType File -Path $PROFILE -Force }

    目录: D:\Tom\Documents\WindowsPowerShell

Mode                 LastWriteTime         Length Name

-a----        2025/12/11     21:10              0 Microsoft.PowerShell_profile.ps1

在此命令中,if 语句阻止覆盖现有配置文件。 将 $PROFILE 变量的值替换为要创建的配置文件的路径。 

创建所有用户所有主机的配置文件

if (!(Test-Path -Path $PROFILE.AllUsersAllHosts)) {   New-Item -ItemType File -Path $PROFILE.AllUsersAllHosts -Force }

    目录: C:\Windows\System32\WindowsPowerShell\v1.0

Mode                 LastWriteTime         Length Name

-a----        2025/12/12      0:12              0 profile.ps1

3.5 编辑配置文件

可以在文本编辑器(如记事本)中打开任何 PowerShell 配置文件。

若要在记事本的当前 PowerShell 主机应用程序中打开当前用户的配置文件,请键入:

PS C:\Windows\system32> notepad $PROFILE

若要打开其他配置文件,请指定配置文件名称。 例如,若要打开所有主机应用程序的所有用户的配置文件,请键入: 

notepad $PROFILE.AllUsersAllHosts

先来个简单的配置,将以下代码复制到配置文件中。会显示时间和当前路径。

function prompt {"[ $(Get-Date -Format 'HH:mm:ss') ] $(Get-Location) >"}

若要应用更改,保存配置文件。

  • 然后重启 PowerShell,
  • 或者(. $Profile )重新加载配置文件。

类似 linux 环境下的 source 命令。在 Powershell 中,使用点号 . 来重新加载指定的 ps1 文件。 由于 $Profile 变量保存了 ps1 文件的绝对路径,所以可以用下面的命令使改动实时生效。

. $Profile 

无法加载文件 D:\Tom\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1,因为在此系统上禁止运行脚本。

… 

由于执行策略的默认设置是禁止所有脚本运行的,所有普通用户到这一步,加载配置文件时就会报错。

3.6 修改执行策略-允许本地脚本运行

查看当前执行策略

 Get-ExecutionPolicy

Restricted

为当前用户设置执行策略,允许运行本地脚本。

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

再次查看当前执行策略

Get-ExecutionPolicy

RemoteSigned

然后再尝试加载脚本: 

. $Profile 

理论上应该会成功了。关闭会话,重新打开新的PowerShell,配置文件依然生效。

3.7 NoProfile 参数

设置的配置文件,那么每次打开都会加载相关自定义的内容。 若想回到无配置的状态,不必删除配置,可以用如下命令: 

powershell -NoProfile

更多参数,请看帮助:

Powershell -?

3.8 添加更多个性化设置

可以在 Windows 中使用 notepad.exe,或 VS Code。在 Linux 中使用 vi,或任何其他文本编辑器。

 code $PROFILE

 notepad $PROFILE

以下配置文件脚本包含许多自定义项的示例。 具体代码在如下页面里,微软网站提供的参考,直接复制运行可能会报错。有兴趣的可以自己研究研究。

此配置脚本提供以下个性化自定义的示例:

PowerShell-Docs 风格指南

4. 转载一个不错的配置

该文章分享了完整的脚本代码,包含注释。文章还对每一处做了详细的说明。

执行效果如图: 

PS.ps1

包含功能: 

  • 判断是否为管理员权限;
  • 当前用户名;
  • 上一条命令完成后的时间;
  • 当前路径,然后换行;
  • 上一条命令运行的时间,秒数或分钟数。

可以根据个人喜好增减或调整顺序。

补充,可以添加一行: cd 目录, 修改初始路径。

function prompt {
    #Assign Windows Title Text
    $host.ui.RawUI.WindowTitle = "Current Folder: $pwd"
    #Configure current user, current folder and date outputs
    $CmdPromptCurrentFolder = Split-Path -Path $pwd -Leaf
    $CmdPromptUser = [Security.Principal.WindowsIdentity]::GetCurrent();
    $Date = Get-Date -Format 'dddd hh:mm:ss tt'
    # Test for Admin / Elevated
    $IsAdmin = (New-Object Security.Principal.WindowsPrincipal ([Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
    #Calculate execution time of last cmd and convert to milliseconds, seconds or minutes
    $LastCommand = Get-History -Count 1
    if ($lastCommand) { $RunTime = ($lastCommand.EndExecutionTime - $lastCommand.StartExecutionTime).TotalSeconds }
    if ($RunTime -ge 60) {
        $ts = [timespan]::fromseconds($RunTime)
        $min, $sec = ($ts.ToString("mm\:ss")).Split(":")
        $ElapsedTime = -join ($min, " min ", $sec, " sec")
    }
    else {
        $ElapsedTime = [math]::Round(($RunTime), 2)
        $ElapsedTime = -join (($ElapsedTime.ToString()), " sec")
    }
    #Decorate the CMD Prompt
    Write-Host ""
    Write-host ($(if ($IsAdmin) { 'Elevated ' } else { '' })) -BackgroundColor DarkRed -ForegroundColor White -NoNewline
    Write-Host " USER:$($CmdPromptUser.Name.split("\")[1]) " -BackgroundColor DarkBlue -ForegroundColor White -NoNewline
    If ($CmdPromptCurrentFolder -like "*:*")
        {Write-Host " $CmdPromptCurrentFolder "  -ForegroundColor White -BackgroundColor DarkGray -NoNewline}
        else {Write-Host ".\$CmdPromptCurrentFolder\ "  -ForegroundColor White -BackgroundColor DarkGray -NoNewline}
    Write-Host " $date " -ForegroundColor White
    Write-Host "[$elapsedTime] " -NoNewline -ForegroundColor Green
    return "> "
} #end prompt function