【问题标题】:Bash/batch-like subshell in PowershellPowershell 中的 Bash/batch-like subshel​​l
【发布时间】:2017-05-31 10:03:03
【问题描述】:

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

( cmd1 ; cmd2 ) | cmd3

在 Windows Batch 中,你可以这样写

( cmd1 & cmd2 ) | cmd3

在这两种情况下,cmd1 和 cmd2 的输出都会在标准输入上传递给 cmd3。

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

我还没有找到允许这样做的有效语法。我希望语句块可以像这样工作,但它不会:

{ cmd1 ; cmd2 } | cmd3

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

function f() {
    cmd1
    cmd2
}
f | cmd3

是否有允许在线完成此操作的语法?

【问题讨论】:

    标签: powershell


    【解决方案1】:

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

    pwsh -Command { cmd1 ; cmd2 } | cmd3
    

    由于 powershell 接受对象而不是字符串作为输入,-Command 参数可以接受脚本块。请注意,如果您尝试写入不成功的、标称错误的流,例如Write-Host,则会出现一些奇怪的行为。如果您遇到这些问题,我发现最简单的方法是模拟一个具有保存所有相关状态的函数的子shell,使用Invoke-Command& 执行其参数,然后恢复状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 2014-01-01
      相关资源
      最近更新 更多