PowerShell开始 - 工作工作目录

时间:2010-02-08 19:42:23

标签: 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" }

6 个答案:

答案 0 :(得分:22)

comments section of some dude's post提供了很好的解决方案。评论者建议使用Init参数来设置脚本块的工作目录。

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

答案 1 :(得分:14)

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

Start-Job -filepath .\emacs.ps1 -ArgumentList $workingdir, "RandomFile.txt"

您的脚本如下所示:

Set-Location $args[0]
emacs $args[1]

希望这有帮助。

答案 2 :(得分:9)

总结问题:

  • Start-Job开始的后台作业会继承当前位置(工作目录)。

    • 在Windows PowerShell中默认为$HOME\Documents,在PowerShell Core中默认为$HOME(从PSv5.1 / PSv6 alpha开始)。

    • 如果您使用的是 PowerShell 核心 ,并且您的目标是当前目录中的文件,则可以使用以下是因为默认情况下... &语法在当前目录中运行作业
      emacs RandomFile.txt &

  • 您无法直接从传递给Start-Job的脚本块中的当前会话中引用变量。

补充jdmichal's own helpful answerasavartsov's helpful answer,这仍然有效:

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

$using:

可替换地:

Start-Job { Set-Location $using:PWD; emacs RandomFile.txt }

注意:

  • This GitHub issue建议在Start-Job { emacs $using:PWD/RandomFile.txt } cmdlet中添加-WorkingDirectory

    • Start-Job
  • This GitHub issue报告令人意外无法在传递给Start-Job -WorkingDirectory $PWD { emacs RandomFile.txt } # WISHFUL THINKING的脚本块中使用$using:,即使它在主脚本块中有效(隐含-InitializationScript参数)。

    • -ScriptBlock

答案 3 :(得分:6)

试试这个

Start-Job -inputobject $pwd -scriptblock { emacs "$input/RandomFile.txt" }

此处$input是预定义变量,内部取值-inputobject参数

答案 4 :(得分:4)

Start-Job对你需要的东西来说太过分了(在后台运行一个命令)。请改用启动流程

Start-Process -NoNewWindow emacs RandomFile.txt

此方法中的当前目录没有问题。我还创建了一个函数,使其尽可能简单:

function bg() {Start-Process -NoNewWindow @args}

然后调用变为:

bg emacs RandomFile.txt

这适用于Windows 7(Powershell v2)。

答案 5 :(得分:2)

为了完整起见,这是我根据Filburt的回答实现的最终脚本,社区维基风格:

function Start-Emacs ( [string]$file )
{
    Start-Job -ArgumentList "$pwd\$file" { emacs $args[0] }
}