然后让底层的 shell 来完成这项工作?
PowerShell 是一个外壳,因此没有底层外壳(在某种意义上说 PowerShell 不需要从另一个外壳启动)。
但是,有平台特定的默认 shell:在 Windows 上为cmd.exe,在类 Unix 平台上为/bin/sh。
我需要调用一个命令,从站点或其他站点复制该命令
在 PowerShell 跨平台 --% 之前,Windows PowerShell v3 中引入了 stop-parsing token,正是为了解决您的场景。
鉴于 Windows 是当时唯一受支持的平台,行为集中在 cmd.exe - 即使在那里它也不支持 cmd.exe' s 通过行尾 ^ 字符继续行。
更一般地说,虽然它试图模拟 cmd.exe 的行为(例如,通过扩展 % 封闭的标记,例如 %USERNAME% 作为环境变量引用)而不实际 委派给后者,它没有这样做完全。
在 PowerShell Core (v6+) 中 --% 甚至在类 Unix 平台上也受支持,但在那里几乎没有用处,因为应用了 cmd.exe 语义即使在那里;值得注意的是,'...'-quoting 不受支持。
(请注意,PowerShell 在类 Unix 平台上模拟了一个 /bin/sh 功能,但仅没有使用
--%:globbing,即扩展*.txt 等未加引号的标记到匹配的文件路径)。
但是,您可以显式调用平台原生 shell,例如,通过在类 Unix 平台上将复制的命令字符串传递给 sh -c,使用(逐字)here-string 作为命令字符串:
# Call the platform-native shell with a command crafted for it:
sh -c @'
echo This line\
keeps going\
with --all-namespaces and\
with -o custom-columns='KIND:kind,NAMESPACE'
'@
不幸的是,有一个问题:
至少在 v7.2.x 之前,PowerShell 对嵌入式 " 字符的处理。在传递给外部程序的参数中(例如sh)从根本上被破坏了,需要手动将嵌入的" \-转义:
# !! BROKEN
sh -c @'
echo "high noon"
'@
要完成这项工作,您必须手动 \-escape :
# WORKAROUND
sh -c (@'
echo "high noon"
'@ -replace '"', '\"')
有关背景信息,请参阅 this answer 和 this GitHub issue。
简而言之:向后兼容性问题阻止了修复默认行为,但正在进行讨论以至少允许选择正常的默认行为。