Powershell中的Bash/batch-like子shell

Ken*_*org 9 powershell

在Unix shell中,你可以这样写:

( cmd1 ; cmd2 ) | cmd3
Run Code Online (Sandbox Code Playgroud)

在Windows Batch中,您可以编写此代码

( cmd1 & cmd2 ) | cmd3
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,cmd1和cmd2的输出都传递给stdin上的cmd3.

是否有可能在Powershell中做同样的事情?

我还没有找到允许这种情况的有效语法.我希望语句块可以像这样工作,但它没有:

{ cmd1 ; cmd2 } | cmd3
Run Code Online (Sandbox Code Playgroud)

我可以通过声明一个函数来使它工作:

function f() {
    cmd1
    cmd2
}
f | cmd3
Run Code Online (Sandbox Code Playgroud)

是否有一种语法可以让它在线完成?

Vae*_*lus 11

您可以直接调用 powershell 来生成真正的子 shell(即外壳的状态不会被子 shell 修改):

pwsh -Command { cmd1 ; cmd2 } | cmd3
Run Code Online (Sandbox Code Playgroud)

由于 powershell 采用对象而不仅仅是字符串作为输入,因此-Command参数可以采用脚本块。请注意,如果您尝试写入不成功、名义错误流(例如使用Write-Host. 如果您遇到这些问题,我发现最简单的方法是使用保存所有相关状态的函数来模拟子 shell,使用 or 执行其参数Invoke-Command&然后恢复状态。