Powershell-Start-Job-Arbeitsverzeichnis
-
19-09-2019 - |
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" }
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
zumStart-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] }
}