老版本Win10系统的PowerShell美化

在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-ExecutionPolicyGet-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-poshexe 文件位置,得到

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-poshexe 文件和主题文件 的路径先建好了。

可以执行

$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-ModuleSet-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 CodeCascadia MonoDejaVuSansMonoFira CodeFira MonoHackJetBrainsMono 等等

直接去GitHub下载 https://github.com/ryanoasis/nerd-fonts/releases 在外网环境下载好,复制到内网,安装字体。

设置

重启内网的 PowerShell5.1 ,在标题栏上右键,属性,打开 “Windows PowerShell” 属性 对话框,字体设置成刚安装的 MesloLGM NF ,大小设置18,确定,即可看到效果。

属性对话框里 颜色 等各种配置也可以自行设置一番。

5、配置文件

目前虽然看起来都搞好了,但是这些执行过的设置都只是对当前PowerShell对话框生效,关闭之后下次打开又没有了。

所以还需要配置文件,让PowerShell每次启动的时候都自动加载。

首先查看一下是否有配置文件

Test-Path $PROFILE

如果返回了 False ,就需要手动创建一个

New-ItemType 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值