从 Windows Powershell 5 迁移到 PowerShll 7

10/9/2022 powershell

# 起因

因为平时的主力系统还是在使用 Windows,也没有特别强烈的需求非得使用 Linux,所以使用默认的 Windows Powershell 5 似乎是一件顺理成章的事情,然而在一次 VSCode 的 Terminal Shell Integration 的功能中,突然发现 Windows Powershell 5 居然不支持,于是便有了迁移的想法。

然而事实上根本不需要迁移,因为 Powershell 7 与 Windows Powershell 5 是共存的,不过还是打算写下这篇日志用于记录切换到 Powerhsell 7 的过程。

# Powershell 7

Powershell 7 与 Windows Poershell 5 最大的区别是 Powershell 7 是全平台支持,并且被宣称为专门为云环境设计,这让很多使用 Windows Powershell 的人可以在远程 Linux 时也能使用自己熟悉的 Shell 环境。(虽然大部分人可能还是会选择 ZSH 吧),不过这种支持确实能给用户很大的诱惑力。

关于 Powershell 7 的特性,这里就不赘述了,直接引用官方原话吧。

Powershell 7 Features

Designed for cloud, on-premises, and hybrid environments, PowerShell 7 is packed with enhancements and new features.

  • Installs and runs side-by-side with Windows PowerShell
  • Improved compatibility with existing Windows PowerShell modules
  • New language features, like ternary operators and ForEach-Object -Parallel
  • Improved performance
  • SSH-based remoting
  • Cross-platform interoperability
  • Support for Docker containers

# 迁移

  1. 安装 Powershell 7,Windows 传送门 (opens new window) ,其他系统例如 Linux,macOS,Arm,Docker 可直接在侧栏切换即可。

  2. Windows Terminal 配置,会自动添加配置项,只需要切换默认配置文件为 Powershell 7 即可。

  3. 默认的安装位置:

  • Windows PowerShell 5.1: $env:WINDIR\System32\WindowsPowerShell\v1.0
  • PowerShell 6.x: $env:ProgramFiles\PowerShell\6
  • PowerShell 7: $env:ProgramFiles\PowerShell\7
  1. Powershell 模块路径与 Windows Powershell 是隔离的,但是 Powershell 的默认模块路径时包括 Windows Powershell 的模块路径的,且这些模块大概率是兼容 Powershell 7 的,这意味着你不用重新下载模块,只需要拷贝一份原来的配置文件即可。想查看具体路径可以使用命令:$Env:PSModulePath -split (';')。以下是不同范围的模块路径说明。
Install Scope Windows PowerShell 5.1 PowerShell 7.0
PowerShell modules $env:WINDIR\system32\WindowsPowerShell\v1.0\Modules $PSHOME\Modules
User installed AllUsers scope $env:ProgramFiles\WindowsPowerShell\Modules $env:ProgramFiles\PowerShell\Modules
User installed CurrentUser scope $HOME\Documents\WindowsPowerShell\Modules $HOME\Documents\PowerShell\Modules
  1. 复制一份原来的配置文件到新的路径,文件不存在则新建。Windows Powershell 的路径是 $HOME\Documents\WindowsPowerShell,而 Powershell 的路径为 $HOME\Documents\PowerShell. 除了用户级别的配置文件之外,还有全局的配置文件,且配置文件的名字也发生了变化,具体参考以下命令输出结果。
PS> $PROFILE | Select-Object *Host* | Format-List

AllUsersAllHosts       : C:\Program Files\PowerShell\7\profile.ps1
AllUsersCurrentHost    : C:\Program Files\PowerShell\7\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts    : C:\Users\<user>\Documents\PowerShell\profile.ps1
CurrentUserCurrentHost : C:\Users\<user>\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
1
2
3
4
5
6

需要了解更多的配置项可以参考 about_Profiles (opens new window)

  1. 最后再把 VSCode 的终端默认使用 Powershell 7 即可。步骤,打开命令面板 Ctrl Shift PTerminal: Select Default Profile,然后选择 Powershell 7 的那个配置就行了。随后就可以体验到增强的终端功能了,比如执行命令失败会在命令的左边有个红色断点,成功为蓝色,同时右侧进度条也会有提醒,方便快速定位命令,同时左侧断点可以直接重新执行命令,复制命令输出为基础格式,HTML格式等,更多功能可以查看 Terminal Shell Integration (opens new window)

# 配置文件备份

# oh my posh
oh-my-posh --init --shell pwsh --config ~/scoop/apps/oh-my-posh/current/themes/zash.omp.json | Invoke-Expression
# posh-git
Import-Module posh-git
1
2
3
4

# 结束

至此,迁移到 Powershell 7 的工作基本结束,想了解 Powershell 的功能,例如远程支持,组策略相关可以查看官方文档 (opens new window)后半部分。