powershell 命令行中 bash 括号的对应内容是什么?

powershell 命令行中 bash 括号的对应内容是什么?

在 bash 中我可以做到这一点

cd some-folder
(cd some-other-folder && export foo=bar && exec-some-command)

完成后,我将回到我开始的状态,我仍然在“某个文件夹”而不是“其他文件夹”,并且我的环境将与执行命令之前的状态相同(foo 将不会分配给 bar)

有没有办法在 powershell 中轻松地完成同样的事情?

我试过

Invoke-Command -ScriptBlock {cd "some-other-folder"; $env:foo="bar"; exec-some-command}

但它影响了当前进程,而不是在另一个进程中执行。

答案1

如果你的命令是非交互式的,那么工作是最接近的等价物,因为它们基本上运行后台子shell并可选地返回其输出:

sh$  (cd folder && export foo=bar && some-command) & wait

PS>  Start-Job {cd "folder"; $env:foo="bar"; some-command} | Receive-Job -Wait -AutoRemoveJob
sh$  (cd foo && do_bar) & pid=$!; <...>; wait $pid

PS>  $job = Start-Job {cd foo; do_bar}; <...>; Wait-Job $job

不幸的是,作业无法正确继承 Windows 附带的 PowerShell 5 中的工作目录(尽管它们在可安装的 PowerShell 7 中可以继承)。来自 GitHub)。在 PS5 中,所有作业似乎都从 ~\Documents 开始。

Start-Job 的参数-WorkingDirectory也是 PS7 新增的。PS5 的一个可能解决方法是提供$pwd输入对象:

$pwd | start-job {cd; cd "folder"; ...} | receive-job ...

相关内容