在Win11系统上用 Windows Terminal + PowerShell Core 7 + oh-my-posh 和 posh-git 开发体验一直很好。
但是最近公司要求迁移到内网环境开发,不能连互联网的虚拟机,而且里面是古老的1809版本Win10,无法安装 Windows Terminal 和 PowerShell 7 ,Windows Terminal 要求至少 Win10 2004 版本,PowerShell 7 要求最低Win10 2104版本。所以只能尝试改造老系统自带的老PowerShell5.1。
参考资料
https://juejin.cn/post/6984620463917891614
https://juejin.cn/post/7028907423603638286
1、替换 PSReadLine
确认PowerShell版本
$PSVersionTable
可以看到 PSVersion
是 5.1.17763.1971 ,也就是5.1版本,还是勉强可以的,再低的版本就无法美化了。
如果是 6及以上版本的,会自动包含最新的
PSReadLine
,不需要再单独安装。
执行策略 ExecutionPolicy
修改
默认的shell脚本执行策略会导致后面的步骤报错“在此系统上禁止运行脚本”。
Win10 设置 - 更新和安全 - 开发者选项 - PowerShell 点击应用就更改执行策略,跟Win11一样。
或者,自己修改,在开始菜单上右键, 以管理员运行PowerShell ,执行
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
注意:执行命令都默认是以管理员运行PowerShell的,下文不再说明。
设置成功后 Get-ExecutionPolicy
或 Get-ExecutionPolicy -List
可以查看验证。
下载 PSReadLine
先在外网环境下把 PSReadLine
的包下载下来,然后复制到内网环境,替换掉默认的版本。
执行
Save-Module -Name "PSReadLine" -RequiredVersion 2.1.0 -path "E:\tmp\"
E:\tmp\
文件夹需要提前先建好。这里指定版本2.1.0,是担心高版本有兼容性问题,但并未尝试高版本,也不确定更高版本是否可行。
如果外网网络环境也不行,需要挂梯子的话,命令就再加上代理参数
Save-Module -Name "PSReadLine" -RequiredVersion 2.1.0 -path "E:\tmp\" -Proxy http://127.0.0.1:7890
下载好之后,得到 E:\tmp\PSReadLine\2.1.0\
文件夹。
如果外网环境也是用的虚拟机,不允许执行脚本,那么还可以去PowerShell的第三方包官网下载
https://www.powershellgallery.com/packages
搜索 PSReadLine
posh-git
等,点击下载量最高的,里面有 Manual download 下载得到 .nupkg
文件,这个本质其实是一个 zip 压缩包,解压,一样得到类似于 E:\tmp\PSReadLine\2.1.0\
的文件夹(自己新建文件夹改名)。
替换
在内网的Win10老系统上执行
$env:PSModulePath -split ";"
查看 Module 的路径,一般会显示如下
C:\Users\xxxx\Documents\WindowsPowerShell\Modules
C:\Program Files\WindowsPowerShell\Modules
C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
对于PowerShell5.1版本来说,默认的 PSReadLine
一般是在 C:\Program Files\WindowsPowerShell\Modules\PSReadLine\2.0.0\
,可见是2.0.0版本的,
所以替换只需要退出PowerShell,然后删除 2.0.0 这个文件夹,把刚才下载的 2.1.0 文件夹复制进去,再重新打开PowerShell,就会自动去加载这个2.1.0新版本的了。
然后可以执行
Import-Module PSReadLine
Set-PSReadLineOption -PredictionSource History
可以看一下效果,已经实现自动补全历史命令了。但这只是单次设置,后面会写配置文件,保证每次都先执行这种命令。
2、安装 posh-git
同样的,先在外网环境下把 posh-git
的包下载下来,执行
Save-Module -Name "posh-git" -path "E:\tmp\"
下载好之后,得到 E:\tmp\posh-git\1.1.0\
文件夹。
或者也是在 powershellgallery
网站下载 nupkg
文件,解压出来。
这里 posh-git
以及等下要装的 oh-my-posh
都是第三方包,跟 PSReadLine
不一样,一般安装时是要指定范围的,例如
# 正常外网环境安装示例
Install-Module posh-git -Scope CurrentUser
Install-Module oh-my-posh -Scope CurrentUser
这样就只是为 CurrentUser
范围安装,而不是安装到所有用户范围。
所以正常情况下,这些包安装后是被放在当前用户个人文件夹的“文档”目录下的,也就是前面查看 Module 路径得到的第一条 C:\Users\xxxx\Documents\WindowsPowerShell\Modules
文件夹。
因此接下来就只需要把外网下载得到的 posh-git
文件夹复制到内网环境的这个 Module 路径下,这 posh-git
就算装好了。
重启PowerShell,执行
Import-Module posh-git
然后 cd
到任意一个git项目目录下,就能看到 posh-git
的效果了,会显示当前分支名和改动情况。
3、安装 oh-my-posh
oh-my-posh 的不同之处在于它的主体是一个 .exe
的可执行文件,所以只是复制文件夹就不够了。
首先,在外网环境下执行
Install-Module oh-my-posh -RequiredVersion 6.51.0 -Scope CurrentUser
进行真正的安装。
这里指定版本6.51.0,也是担心高版本有兼容性问题,但并未尝试过高版本,所以也不确定更高版本是否可行。
安装好后,需要找两个部分即两个文件夹。先执行
$env:PSModulePath -split ";"
查看外网环境(Win11系统)里PowerShell 7 的 Module 路径(跟Win10的PowerShell5.1肯定不一样),得到
C:\Users\ABC\Documents\PowerShell\Modules
C:\Program Files\PowerShell\Modules
c:\program files\powershell\7\Modules
C:\Program Files\WindowsPowerShell\Modules
C:\Windows\system32\WindowsPowerShell\v1.0\Modules
那么首先在第一条那个路径下找到 oh-my-posh
文件夹,这是脚本包。
再执行
$env:POSH_PATH
查看 oh-my-posh
的 exe
文件位置,得到
C:\Users\ABC\.oh-my-posh
6.x版本的应该都是这种
~\.oh-my-posh
路径,7.x版本的就不一样了,变成C:\Users\ABC\AppData\Local\oh-my-posh
了,更高版本的还没试过。
那么这个 ~\.oh-my-posh
就是 exe
文件和主题文件 的路径了。
接下来,先把脚本包 oh-my-posh
文件夹复制到内网环境跟之前 posh-git
一样的那个 Module 路径下,然后在内网环境的PowerShell5.1 里执行
Import-Module oh-my-posh # 新版已不支持这种方式导入
会提示报错
# 会提示下载 exe 文件
Downloading oh-my-posh executable for 6.51.0
# 然后报错,因为内网环境无法连接互联网进行下载
# 提示里会有
Import-Module : Executable at C:\Users\xxxx\.oh-my-posh\oh-my-posh.exe was not found, please try ....
这样就能让它自动把 oh-my-posh
的 exe
文件和主题文件 的路径先建好了。
可以执行
$env:POSH_PATH
验证一下,应该能得到
C:\Users\xxxx\.oh-my-posh
这样最后当然就只需要把外网环境的 ~\.oh-my-posh
路径下的东西全复制到内网环境对应的目录下就好了。
验证一下
# 重新执行
Import-Module oh-my-posh
# 引入成功后,再选个主题
Set-PoshPrompt -Theme aliens
能看到主题都生效了,那么 oh-my-posh
就装好了。
用新版
但是新版都不支持 Import-Module
和 Set-PoshPrompt
了,所以上面这么多步骤到最后可能也不行。
现在都更推荐直接用最新版的安装包
如果是 外网环境不允许执行命令的情况,那反而更简单了,就直接用最新的安装包。或者说也别管什么情况都统一用新版,不用再敲命令行了。也不要去 powershellgallery
网站下载了,那也是 7.x
的版本,也很老的了,
直接去 GitHub下载最新版 https://github.com/JanDeDobbeleer/oh-my-posh/releases 是一个 msi
安装包 和 一个 themes.zip
主题包。
安装好后 oh-my-posh.exe
的路径会被写入系统 PATH ,能在命令行直接执行到,然后主题包解压后也放到安装路径下。
新版的启动也不一样了,主要用 init
函数
oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH\aliens.omp.json" | Invoke-Expression
其中的环境变量 POSH_THEMES_PATH
可以去系统高级设置里检查一下。
如果报错无法识别 oh-my-posh 是一个 cmdlet
或命令,那一般是权限问题,执行这些命令都要用管理员启动 PowerShell 。
然后主题是可以自定义的,路径也可以指定,
oh-my-posh init pwsh --config ~/.custom.omp.json | Invoke-Expression
至此有了 oh-my-posh 及其主题,就美化的差不多了,但可以看到会有一些乱码
4、安装字体
oh-my-posh 主题都会用一些特殊字符,所以会有乱码,还需要设置专用字体 Nerd Font
例如 Meslo LG M Regular Nerd Font Complete Mono Windows Compatible.ttf
(这个系列包含有很多个变体,都可以用),常用的还有 Cascadia Code
、 Cascadia Mono
、 DejaVuSansMono
、Fira Code
、Fira Mono
、Hack
、JetBrainsMono
等等
直接去GitHub下载 https://github.com/ryanoasis/nerd-fonts/releases 在外网环境下载好,复制到内网,安装字体。
设置
重启内网的 PowerShell5.1 ,在标题栏上右键,属性,打开 “Windows PowerShell” 属性 对话框,字体设置成刚安装的 MesloLGM NF
,大小设置18,确定,即可看到效果。
属性对话框里 颜色 等各种配置也可以自行设置一番。
5、配置文件
目前虽然看起来都搞好了,但是这些执行过的设置都只是对当前PowerShell对话框生效,关闭之后下次打开又没有了。
所以还需要配置文件,让PowerShell每次启动的时候都自动加载。
首先查看一下是否有配置文件
Test-Path $PROFILE
如果返回了 False ,就需要手动创建一个
New-Item –Type File –Force $PROFILE
# 创建成功后,会返回创建的目录和文件名,例如
目录: C:\Users\xxxx\Documents\WindowsPowerShell
Mode LastWriteTime Length Name
-a---- 2023/6/6 21:57 0 Microsoft.PowerShell_profile.ps1
如果返回了 True ,那就直接修改。
创建后编辑,或修改已有的,都是用文本编辑器打开配置文件直接写,例如执行
notepad $PROFILE # 用记事本打开
也可以用 VS Code 等打开进行编辑。
这里直接贴上我个人使用的配置
Import-Module PSReadLine
Set-PSReadLineOption -PredictionSource History
# 设置Ctrl加方向右键为逐词补全命令,(清除命令默认是Esc)
Set-PSReadLineKeyHandler -Chord "Ctrl+RightArrow" -Function ForwardWord
Import-Module posh-git
# oh-my-posh 如果是 旧版
Import-Module oh-my-posh
Set-PoshPrompt -Theme aliens
# oh-my-posh 如果是 新版
oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH\aliens.omp.json" | Invoke-Expression
# 下面设置一些常用命令的别名
function Alias-GitStatus() {
git status
}
New-Alias -Name gst -Value Alias-GitStatus
function Alias-GitPull() {
git pull
}
New-Alias -Name gll -Value Alias-GitPull
function Alias-GitCheckout() {
git checkout $args
}
New-Alias -Name gco -Value Alias-GitCheckout
配置文件保存后,重启那PowerShell5.1 即可。
6、终端软件
PowerShell 美化好了,已经可以愉快地开发了,但也还有一些不够爽的,例如一次只能打开一个窗口 不能标签化,还有每次最好都要点右键 管理员身份运行,还有 PowerShell 本身界面还是不够美观。
可以再进一步装个终端软件,随意定制界面风格。
首推Windows官方的Terminal https://github.com/microsoft/terminal/releases 去GitHub可以看到有三四种版本下载,注意不要下 .msixbundle
那种(我就在这又踩坑了) msix
appx
以及加个 bundle
这些类型的文件,都是 Microsoft Store 用的那种,也可以手动安装 用PowerShell命令 add-appxpackage ./文件名
,但是,这种安装完成时,到最后还是需要联网才能真正安装完,没网的环境还是不能使用,看官方说明(https://learn.microsoft.com/zh-cn/windows/terminal/distributions)。另外,对于Win10 装 .msixbundle
这种,还得先下载边上那个同名的 ...Windows10_PreinstallKit.zip
,里面都是依赖项,解压出来装完了才能装Terminal。
所以,如果内网的Win10版本能达到 Windows Terminal 要求,至少 Win10 2004 版本,那么果断GitHub下载那个 ..._x64.zip
的,这是免安装便携版,无需安装,解压即用,不再限制必须C盘,随便解压到哪。而且,如果在安装目录下新建一个 .portable
的文件,就能把个人设置也保存在当前目录,真的是非常便携,可以走到哪带到哪,个人专属Terminal。
然而,我面对公司内网更古董版本的Win10,只能转向 Fluent Terminal https://github.com/felixse/FluentTerminal/releases ,它最低能支持 Win10 1709版本,而且风格跟 Windows Terminal 是一样的。
但这个从GitHub下载下来解压后还只是一个安装包,而且有坑(别问我怎么又踩坑了),它一定要先安装里面的安全证书,再执行 install脚本,否则拿不到管理员权限,一直报错,都搞不清是什么原因。
另外,Fluent Terminal 推荐使用的字体是 Meslo LGL
,而 Windows Terminal 推荐的字体是 Cascadia Mono
。