PowerShell开始 - 工作工作目录

jdm*_*hal 25 powershell start-job

有没有办法为Start-Job命令指定工作目录?

用例:

我在一个目录中,我想用Emacs打开一个文件进行编辑.如果我直接执行此操作,它将阻止PowerShell,直到我关闭Emacs.但是使用Start-Job尝试从我的主目录运行Emacs,从而让Emacs打开一个新文件而不是我想要的文件.

我尝试使用$ pwd指定完整路径,但脚本块中的变量在Start-Job上下文中执行之前不会被解析.因此,强制解决shell上下文中的变量的一些方法也是可接受的答案.

所以,这是我尝试过的,只是为了完整性:

Start-Job { emacs RandomFile.txt }
Start-Job { emacs "$pwd/RandomFile.txt" }
Run Code Online (Sandbox Code Playgroud)

asa*_*sov 26

一些家伙的评论部分提供了很好的解决方案.Commenter建议使用Init参数来设置脚本块的工作目录.

function start-jobhere([scriptblock]$block) {
    Start-Job -Init ([ScriptBlock]::Create("Set-Location '$pwd'")) -Script $block
}
Run Code Online (Sandbox Code Playgroud)


Fil*_*urt 16

一个可能的解决方案是创建一个"踢脚脚本":

Start-Job -filepath .\emacs.ps1 -ArgumentList $workingdir, "RandomFile.txt"
Run Code Online (Sandbox Code Playgroud)

你的脚本看起来像这样:

Set-Location $args[0]
emacs $args[1]
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


mkl*_*nt0 9

总结一下这个问题:

  • 后台作业开始ForEach-Object -Parallel没有继承当前位置(工作目录).

    • 它默认为-WorkingDirectoryWindows PowerShell和Start-JobPowerShell Core(从PSv5.1/PSv6 alpha开始).

    • 如果您正在使用PowerShell Core并且目标是当前目录中的文件,则可以使用以下命令,因为默认情况下$HOME\Documents语法在当前目录中运行作业:
      $HOME

  • 您无法在传递给的脚本块中直接引用当前会话中的变量... &.

补充jdmichal自己的有用答案asavartsov的有用答案,这仍然有效:

PSv3引入了一种简单的方法来引用脚本块中的当前会话变量,该脚本块在不同的上下文(作为后台作业或远程机器)上执行,通过emacs RandomFile.txt &作用域:

Start-Job { Set-Location $using:PWD; emacs RandomFile.txt }
Run Code Online (Sandbox Code Playgroud)

或者:

Start-Job { emacs $using:PWD/RandomFile.txt }
Run Code Online (Sandbox Code Playgroud)

注意:

  • 此GitHub问题建议添加Start-Job$using:cmdlet.

    • $using:
  • 这个GitHub问题报告了令人惊讶的无法-InitializationScript在传递给脚本块中使用-ScriptBlock,即使它在主脚本块(隐含Start-Job -Init { Set-Location $using:PWD } { emacs RandomFile.txt } # FAILS参数)中工作.

    • ForEach-Object -Parallel


小智 6

试试这个

Start-Job -inputobject $pwd -scriptblock { emacs "$input/RandomFile.txt" }
Run Code Online (Sandbox Code Playgroud)

$input是预定义的变量,它在内部取值-inputobject参数


Bog*_*mac 5

Start-Job 对你需要的东西来说太过分了(在后台运行一个命令)。使用Start-Process代替:

Start-Process -NoNewWindow emacs RandomFile.txt
Run Code Online (Sandbox Code Playgroud)

在这种方法中当前目录没有问题。我还创建了一个函数来使这尽可能简单:

function bg() {Start-Process -NoNewWindow @args}
Run Code Online (Sandbox Code Playgroud)

然后调用变为:

bg emacs RandomFile.txt
Run Code Online (Sandbox Code Playgroud)

这适用于 Windows 7 (Powershell v2)。