Frage

Gibt es eine Möglichkeit, ein Arbeitsverzeichnis auf den Start-Job-Befehl angeben?

Use-Fall:

Ich bin in einem Verzeichnis, und ich möchte eine Datei öffnen, mit Emacs zum Bearbeiten. Wenn ich dies direkt tun, wird es Powershell blockieren, bis ich Emacs schließen. Aber mit Start-Job versucht, Emacs aus meinem Home-Verzeichnis zu laufen, so dass statt dem eine neue Datei Emacs öffnen zu müssen ich wollte.

Ich habe versucht, den vollständigen Pfad mit $ PWD angeben, aber Variablen im Script-Block nicht aufgelöst werden, bis sie in dem Start-Job Kontext sind ausgeführt werden. So eine Möglichkeit, die Variablen in dem Shell-Kontext zu erzwingen Lösung wäre auch eine akzeptable Antwort auf diese Frage sein.

So, hier ist was ich versucht habe, nur der Vollständigkeit halber:

Start-Job { emacs RandomFile.txt }
Start-Job { emacs "$pwd/RandomFile.txt" }
War es hilfreich?

Lösung

Eine mögliche Lösung wäre, einen "Kicker-Skript" zu erstellen:

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

Ihr Skript würde wie folgt aussehen:

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

Hope, das hilft.

Andere Tipps

Es gibt schöne Lösung von Kommentaren einiger Post der Geck. Commenter schlägt Init Parameter Setup Arbeitsverzeichnis von Skriptblock zu verwenden.

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

Um das Problem zu fassen:

  • Ein Hintergrundjob begann mit Start-Job nicht nicht das aktuelle Position (Arbeitsverzeichnis) erbt.

    • Der Standardwert in Windows Powershell $HOME\Documents und $HOME in Powershell-Core (ab PSv5.1 / PSv6 alpha).

    • Wenn Sie mit Powershell Kern und Sie eine Datei in das Targeting Strom Verzeichnis, können Sie mit dem folgender, weil die neue ... & Syntax standardmäßig den Job in dem läuft Strom Verzeichnis :
      emacs RandomFile.txt &

  • Sie können nicht direkt Referenzvariablen aus der Strom Sitzung in einem Script-Block übergeben Start-Job.

jdmichal eigenes hilfreiche Antwort und asavartsov die hilfreiche Antwort , die noch gut funktionieren:

PSV3 eingeführt, um eine einfache Art und Weise der Strom Sitzung Variablen in einem Skriptblock zu verweisen, die in einem anderen Kontext ausgeführt wird (als Hintergrundjob oder auf einem entfernten Rechner) über den $using: -umfang:

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

Alternativ:

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

Hinweis:

  • Diese GitHub Ausgabe eine -WorkingDirectory zum Start-Job Cmdlets schlägt hinzuzufügen.

    • Start-Job -WorkingDirectory $PWD { emacs RandomFile.txt } # WISHFUL THINKING
  • Diese GitHub Ausgabe berichtet die überraschende Unfähigkeit $using: im Skript zu verwenden, Block übergeben -InitializationScript, auch wenn es im Hauptskriptblock (der implizite -ScriptBlock Parameter) funktioniert.

    • Start-Job -Init { Set-Location $using:PWD } { emacs RandomFile.txt } # FAILS

try this

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

Hier $input ist vordefinierte Variable, die intern den Wert -inputobject Parameter nehmen

Start-Job ist ein Overkill für das, was man braucht (einen Befehl im Hintergrund ausgeführt wird). Verwenden Sie Start-Prozess statt:

Start-Process -NoNewWindow emacs RandomFile.txt

Es gibt kein Problem mit dem aktuellen Verzeichnis in diesem Ansatz. Ich habe auch eine Funktion, um diese so einfach wie möglich zu machen:

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

und dann der Aufruf wird:

bg emacs RandomFile.txt

Dies funktioniert auf Windows 7 (Powershell v2).

Nur der Vollständigkeit halber, hier ist das letzte Skript, das ich auf Filburt Antwort basiert implementiert, Community-Wiki-Stil:

function Start-Emacs ( [string]$file )
{
    Start-Job -ArgumentList "$pwd\$file" { emacs $args[0] }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top