powershell - Powershell 中的 Bash/batch-like subshel​​l

标签 powershell

在 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 subshel​​l,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44281699/

相关文章:

powershell - 延迟执行后台 worker 的DoWork事件

xml - PowerShell 连接多个 XML 文件

powershell - 防止在批处理文件中解释多行命令

variables - Powershell 空值表达式

windows - Powershell 中的 vimdiff E97

powershell - 执行 powershell 命令后批处理文件暂停

powershell - 如何检查网络端口访问并显示有用的消息?

windows - 从 powershell 回显/访问环境变量

powershell - 如何从 PowerShell 函数返回一个且仅一个值?

.net - Visual Studio-程序包管理器控制台-以编程方式运行命令