在 Unix shell 中,你可以这样写:
( cmd1 ; cmd2 ) | cmd3
在 Windows Batch 中,你可以这样写
( cmd1 & cmd2 ) | cmd3
在这两种情况下,cmd1 和 cmd2 的输出都通过 stdin 传递给 cmd3。
是否可以在 Powershell 中执行相同操作?
我还没有找到允许这样做的有效语法。我希望语句块像这样工作,但它没有:
{ cmd1 ; cmd2 } | cmd3
我可以通过声明一个函数来让它工作:
function f() {
cmd1
cmd2
}
f | cmd3
是否有允许在线完成此操作的语法?
最佳答案
您可以直接调用 powershell 以生成真正的子 shell (即子 shell 不会修改 shell 的状态):
pwsh -Command { cmd1 ; cmd2 } | cmd3
由于 powershell 将对象而不只是字符串作为输入,-Command
参数可以采用脚本块。请注意,如果您尝试写入不成功的 nom-error 流(例如 Write-Host
),则会出现一些奇怪的行为。 .如果您遇到这些问题,我发现最简单的方法是使用保存所有相关状态的函数来模拟子 shell,并使用 Invoke-Command
执行其参数。或 &
,然后恢复状态。
关于powershell - Powershell 中的 Bash/batch-like subshell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44281699/