代码之家  ›  专栏  ›  技术社区  ›  jdmichal

PowerShell启动作业工作目录

  •  24
  • jdmichal  · 技术社区  · 15 年前

    有没有办法为start job命令指定一个工作目录?

    用例:

    我在一个目录中,我想用emacs打开一个文件进行编辑。如果我直接这样做,它将阻止PowerShell,直到我关闭Emacs。但是使用StartJob会尝试从我的主目录运行Emacs,因此让Emacs打开一个新文件而不是我想要的文件。

    我尝试使用$pwd指定完整路径,但脚本块中的变量只有在开始作业上下文中执行时才会被解析。因此,在shell上下文中强制解析变量的某种方法也是可以接受的答案。

    为了完整起见,我尝试了以下方法:

    Start-Job { emacs RandomFile.txt }
    Start-Job { emacs "$pwd/RandomFile.txt" }
    
    6 回复  |  直到 7 年前
        1
  •  14
  •   Filburt kukabuka    15 年前

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

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

    您的脚本如下所示:

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

    希望这有帮助。

        2
  •  22
  •   Sander    7 年前

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

    function start-jobhere([scriptblock]$block) {
        Start-Job -Init ([ScriptBlock]::Create("Set-Location '$pwd'")) -Script $block
    }
    
        3
  •  8
  •   mklement0    7 年前

    总结问题:

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

      • 它默认为 $HOME\Documents 在Windows PowerShell中,以及 $HOME 在PowerShell核心中(从PSV5.1/PSV6 Alpha开始)。

      • 如果你在使用 动力壳 核心 你的目标是 现在的 目录,您可以使用以下内容,因为 新的 ... & 语法默认情况下在 现在的 目录 以下内容:
        emacs RandomFile.txt &

    • 你不能 直接地 引用来自的变量 现在的 传递到的脚本块中的会话 开始作业 .

    补足 jdmichal's own helpful answer asavartsov's helpful answer 仍然有效:

    PSv3介绍了一种简单的引用 现在的 脚本块中的会话变量,在不同的上下文(作为后台作业或在远程计算机上)中通过 $using: 经营范围:

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

    可选地:

    Start-Job { emacs $using:PWD/RandomFile.txt }
    

    注:

    • This GitHub issue 建议添加 -WorkingDirectory 开始作业 CMDLET。

      • Start-Job -WorkingDirectory $PWD { emacs RandomFile.txt } # WISHFUL THINKING
    • This GitHub issue 报告令人惊讶的无法使用 使用美元: 在传递给的脚本块中 -InitializationScript 即使它在主脚本块中工作 -ScriptBlock 参数)。

      • Start-Job -Init { Set-Location $using:PWD } { emacs RandomFile.txt } # FAILS
        4
  •  6
  •   Smamatti Severino Lorilla Jr.    12 年前

    试试这个

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

    在这里 $input 是一个预先定义的变量,内部取 -inputobject 参数

        5
  •  4
  •   Bogdan Calmac    12 年前

    StartJob对于您需要的东西(在后台运行一个命令)来说是一种过度杀伤力。使用 启动进程 而是:

    Start-Process -NoNewWindow emacs RandomFile.txt
    

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

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

    然后调用变成:

    bg emacs RandomFile.txt
    

    这适用于Windows 7(PowerShell v2)。

        6
  •  2
  •   jdmichal    15 年前

    为了完整起见,下面是我根据filburt的答案实现的最后一个脚本,社区wiki风格:

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