跨平台用 pwsh 写脚本?认准原生 Cmdlet 才是王道
作为常年同时使用 Linux、macOS、Windows 的开发者,稣对 pwsh(PowerShell 7+)的跨平台一致性情有独钟——只需写一套 .ps1 脚本,就能在三大系统运行。但最近踩了个 mkdir 的小坑,才发现看似通用的命令背后,藏着平台差异的玄机,也让稣更坚定了「优先用原生命令」的原则。
意外发现:mkdir 居然不是 alias
一直以为 Windows 版 pwsh 上的 mkdir 是个 alias,直到某次在 Windows 上执行 Get-Alias mkdir 时,居然报错,这才意识到,它在不同平台下是不同实现。
用 Get-Command mkdir 一查,差异瞬间清晰:
-
Windows:mkdir 是一个 Function,本质是 New-Item -ItemType Directory 的封装,用 (Get-Command mkdir).Definition 就能看到其代码;
-
Linux/macOS:mkdir 是 Application,直接调用系统自带的 /bin/mkdir。
这就导致了关键差异:Linux/macOS 上的 mkdir 支持 -p 参数创建多级目录,但 Windows 上的 Function 版 mkdir 并没有 -p 参数(即加不加 -p 都是一样的),它都是能“创建多级目录”的语义。
顺着这个思路查了 rmdir,发现它同样存在差异:
-
Windows:rmdir 是 Alias,指向 Remove-Item -ItemType Directory,本质还是 pwsh 原生 Cmdlet;
-
Linux/macOS:rmdir 依然是系统 Application(/bin/rmdir)。
同一个「看似通用」的命令,在不同平台可能是 Function、Alias 或系统应用,这正是跨平台脚本踩坑的核心原因——依赖系统级命令,必然受底层平台规则约束。
跨平台脚本的核心解法:认准 pwsh 原生命令
想要一套脚本跑遍所有平台,关键就是抛弃系统命令/别名,优先使用 pwsh 原生 Cmdlet(动词 + 名词格式,如 New-Item)。这些 Cmdlet 是 pwsh 统一封装的,不依赖底层系统,行为和参数在所有平台完全一致。
如果您使用微信,也可以关注公众号 UMU618,在公众号文章里评论。