近期换了Win11,发现现在Win下的powershell也可以像macOS的zsh那样,配合iterm2做一番美化,网上搜了很多文章,但是大部分都比较老旧,已经不符合现在版本的安装方式,所以跟着官方文档一步一步走,发现步骤非常简单,并不如网上说的那么复杂,便有此一记。
1. 环境说明
- Windows11专业版 22H2
- 安装vscode,并且配置了环境变量,可以使用code来打开vscode
2. 安装oh-my-posh
1
| winget install JanDeDobbeleer.OhMyPosh -s winget
|
winget在Windows11中默认就有了,也挺好用,没不要在单独安装sqoop(和macOS上的brew类似)之类的工具。
请不要使用网上各种文章的Install-Module oh-my-posh -Scope CurrentUser,官方已经不推荐了。
参考文档:PowerShell module Oh My Posh
3. 配置oh-my-posh
填入如下内容:
1
| oh-my-posh init pwsh Invoke-Expression
|
重启PowerShell。
此时会打开一个默认主题的Shell,并且有大量的乱码。
4. 下载字体
配置过oh-my-zsh的都知道,此时需要一些名为powerline的字体文件才可以正确显示,我试过使用sqoop下载字体,或者手动下载字体包去安装,经常会遇到打开power shell的时候,提示字体文件未找到的问题。但是通过如下方式下载并安装字体就再也不会出现这个问题。
选择JetBrainsMono,等待下载即可。喜欢其他的请自行选择,可点击查看预览Nerd Fonts - Iconic font aggregator, glyphs/icons collection, & fonts patcher

下载完成后这些乱码就消失了。
5. 安装插件
插件可以使oh-my-posh和power shell更为强大,这里只需要安装如下几个插件即可。
1 2 3 4 5 6 7 8
| Install-Module posh-git -Scope CurrentUser
Install-Module -Name PSReadLine -Scope CurrentUser -Force
Install-Module -Name Terminal-Icons -Repository PSGallery
Install-Module DirColors
|
然后编辑$Profile
添加如下信息:
1 2 3 4
| Import-Module DirColors Import-Module -Name Terminal-Icons Import-Module posh-git Import-Module PSReadLine
|
然后重启PowerShell。

6. 更换主题
觉得默认主题不好看?那就换一个,执行如下命令,可预览主题
看到中意的主题,继续修改配置文件,只需替换`主题名.omp.json`就行,实际情况根据你得路径来设置。
最终配置如下:
1 2 3 4 5 6 7 8
| code $Profile
oh-my-posh init pwsh --config 'C:\Program Files (x86)\oh-my-posh\themes\unicorn.omp.json' Invoke-Expression Import-Module DirColors Import-Module -Name Terminal-Icons Import-Module posh-git Import-Module PSReadLine
|
unicorn就是我们选中的主题名。
7. 效果图

优点是界面更好看了,缺点嘛,第一次打开power shell会很慢,如图中所示,加载配置使用了3356毫秒。
8. 配置代理
对于有代理需求的,可以在PowerShell中新增配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| function set_proxy_variable { $proxy = 'http://127.0.0.1:1080'
$env:HTTP_PROXY = $proxy $env:HTTPS_PROXY = $proxy
Write-Host "`n OPEN powershell proxy channel!`n" }
function unset_proxy_variable { Remove-Item env:HTTP_PROXY Remove-Item env:HTTPS_PROXY
Write-Host "`n CLOSE powershell proxy channel!`n" }
Set-Alias proxy set_proxy_variable Set-Alias unproxy unset_proxy_variable
|
配置完成后,重新打开PowerShell,输入proxy即可开启代理,输入unproxy即可关闭代理。
推荐大家升级到PowerShell 7 。
1
| winget install --id Microsoft.Powershell --source winget
|
2026年3月16日更新,下面贴一下我最新的配置,做了一点优化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
| $env:POSH_CHECK_UPDATE = "off"
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding
$ompConfig = "$env:POSH_THEMES_PATH\jandedobbeleer.omp.json"
if (!(Test-Path $ompConfig)) { $ompConfig = "$env:POSH_THEMES_PATH\powerline.omp.json" }
oh-my-posh init pwsh --config $ompConfig Invoke-Expression
Import-Module PSReadLine
$slowModules = @("DirColors", "Terminal-Icons", "posh-git", "Microsoft.WinGet.CommandNotFound") foreach ($mod in $slowModules) { if (Get-Module -ListAvailable -Name $mod) { Import-Module $mod -ErrorAction SilentlyContinue } }
if (Get-Command uv -ErrorAction SilentlyContinue) { (& uv generate-shell-completion powershell) Out-String Invoke-Expression }
if (Get-Module -ListAvailable -Name scoop-completion) { Import-Module scoop-completion }
if (Get-Command scoop-search -ErrorAction SilentlyContinue) { . ([ScriptBlock]::Create((& scoop-search --hook Out-String))) }
Set-PSReadLineOption -PredictionSource History
Set-PSReadLineOption -PredictionViewStyle ListView
Set-PSReadLineOption -HistorySearchCursorMovesToEnd
Set-PSReadLineKeyHandler -Key "Tab" -Function MenuComplete
Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward
function ListDirectory { (Get-ChildItem).Name Write-Host("") } Set-Alias -Name ll -Value Get-ChildItem
function set_proxy_variable { $proxy = 'http://127.0.0.1:1080'
$env:HTTP_PROXY = $proxy $env:HTTPS_PROXY = $proxy
Write-Host "`n OPEN powershell proxy channel!`n" }
function unset_proxy_variable { Remove-Item env:HTTP_PROXY Remove-Item env:HTTPS_PROXY
Write-Host "`n CLOSE powershell proxy channel!`n" }
Set-Alias proxy set_proxy_variable Set-Alias unproxy unset_proxy_variable
function Get-DirSize { param ( [string]$Path = ".", [switch]$GB )
Write-Host "正在计算目录大小,请稍候..." -ForegroundColor Cyan
Get-ChildItem -Path $Path -Directory ForEach-Object { $subFiles = Get-ChildItem $_.FullName -Recurse -File -ErrorAction SilentlyContinue $sizeSum = ($subFiles Measure-Object -Property Length -Sum).Sum if ($GB) { $finalSize = [math]::Round($sizeSum / 1GB, 2) $unit = "GB" } else { $finalSize = [math]::Round($sizeSum / 1MB, 2) $unit = "MB" }
[PSCustomObject]@{ FolderName = $_.Name Size = "$finalSize $unit" RawSize = $sizeSum } } Sort-Object RawSize -Descending Select-Object FolderName, Size }
function start-wnmp { echo "Starting PHP FastCGI..." Start-Process "php-cgi" -ArgumentList "-b 127.0.0.1:9000" -WindowStyle Hidden echo "Starting Nginx..." Start-Process "nginx" -WorkingDirectory (scoop prefix nginx) -WindowStyle Hidden echo "WNMP is running!" }
function stop-wnmp { taskkill /f /im nginx.exe taskkill /f /im php-cgi.exe echo "WNMP stopped." }
|