Windows 7 自带的版本 PowerShell 是 2.0 版本。这个版本号听起来有点寒酸,版本但它确实是版本微软第一次把 PowerShell 塞进操作系统默认组件的版本。2009 年 Win7 正式发售时,版本PowerShell 2.0 已经随系统预装,版本路径在 %SystemRoot%\System32\WindowsPowerShell\v1.0\ 下面——注意目录名还是版本 v1.0,但里面跑的版本确实是 2.0 的引擎。微软当年在版本目录命名上偷了个懒,版本这事我印象特别深,版本因为第一次看到这个路径时还以为自己装错了东西。版本
2.0 相比 1.0 最大的版本变化是加入了远程管理功能,也就是版本 Invoke-Command 和 Enter-PSSession 这套东西。不过要在 Win7 上用远程,版本得先跑 Enable-PSRemoting -Force,版本而且默认的版本 WinRM 服务在 Win7 上并不是自动启动的。我见过不少人在 Win7 上折腾远程 PowerShell 卡在这一步,防火墙规则没放行,或者 WinRM 监听器没配好,报错信息又含糊,挺折磨人的。
另一个实际用起来会碰到的坑是执行策略。Win7 的 PowerShell 2.0 默认执行策略是 Restricted,意味着你写个 .ps1 脚本双击运行,它会直接拒绝。解决办法无非是 Set-ExecutionPolicy RemoteSigned,但这在域环境里可能被组策略覆盖,改了也没用。我自己的做法是在本地测试机上直接改成 Unrestricted,省事,但生产环境别这么干。
语法层面,2.0 缺少很多后来才有的东西。比如 Get-ChildItem -File 这种参数在 2.0 里不存在,你得用 Where-Object { !$_.PSIsContainer } 来过滤文件。还有 [pscustomobject] 类型加速器也是 3.0 才加的,2.0 里只能用 New-Object PSObject -Property。写惯了新版 PowerShell 的人回到 2.0,会觉得处处别扭。不过反过来说,2.0 的 Add-Member 和 Select-Object 组合已经能应付大部分日常管理任务了。
Win7 上 PowerShell 2.0 的 ISE 编辑器也是个话题。它功能很基础,没有智能提示的自动补全,没有多行编辑的括号匹配高亮,代码折叠也没有。但它的好处是启动快,比后来 3.0 之后的 ISE 轻量得多。我在一台老赛扬笔记本上试过,2.0 的 ISE 打开只要两秒左右,换成 5.1 的 ISE 要等七八秒。老机器上这点差距挺明显的。
如果你现在还在用 Win7,并且想升级 PowerShell,最高只能到 5.1。微软官方提供了 WMF 5.1 的安装包,但要求先装 .NET Framework 4.5.2 以上。装完之后 $PSVersionTable 会显示 5.1,但原来的 2.0 引擎仍然保留在系统里,可以通过 powershell.exe -Version 2 显式调用。这个兼容层有时候会出问题,比如某些模块加载失败,或者控制台字体渲染异常。我遇到过几次,最后干脆把 2.0 引擎的注册表项删了,反正也用不上。
说到底,Win7 上的 PowerShell 2.0 是个够用但不好用的工具。它让 Win7 用户第一次不用装额外软件就能写脚本管理机器,但语法老旧、功能残缺、远程配置麻烦。如果你还在维护 Win7 机器,要么忍,要么升到 5.1,没有第三条路。