Verwenden Sie Start-Process (verfügbar ab Version 2), solange der Befehl eine ausführbare Datei oder eine Datei ist, der eine ausführbare Datei zugeordnet ist :
Start-Process -NoNewWindow ping google.com
Sie können dies auch als Funktion in Ihr Profil einfügen:
function bg() {Start-Process -NoNewWindow @args}
und dann wird der Aufruf:
bg ping google.com
Meiner Meinung nach ist Start-Job ein Overkill für den einfachen Anwendungsfall, einen Prozess im Hintergrund auszuführen:
- Start-Job hat keinen Zugriff auf Ihren vorhandenen Bereich (da er in einer separaten Sitzung ausgeführt wird). Sie können "Start-Job {notepad $ myfile}" nicht ausführen.
- Start-Job behält das aktuelle Verzeichnis nicht bei (da es in einer separaten Sitzung ausgeführt wird). Sie können "Start-Job {notepad myfile.txt}" nicht ausführen, wenn sich myfile.txt im aktuellen Verzeichnis befindet.
- Die Ausgabe wird nicht automatisch angezeigt. Sie müssen Receive-Job mit der ID des Jobs als Parameter ausführen.
HINWEIS: In Bezug auf Ihr erstes Beispiel würde "bg sleep 30" nicht funktionieren, da sleep ein Powershell-Commandlet ist. Start-Prozess funktioniert nur, wenn Sie tatsächlich einen Prozess verzweigen.
Start-Job
, getötet wird, wenn die PS-Shell beendet wird. Im Gegensatz dazu scheint etwas, mit dem begonnen wurdeStart-Process
, nach dem Beenden der PS-Shell weiter zu laufen. Dies ist ein großer Unterschied.Start-Process
, überlebt es die Shell-Beendigung. Wenn Sie es jedoch über ein Konsolenfenster gestartet haben, bleibt es an dieses Fenster gebunden, und das Schließen des Fensters beendet den Prozess.Start-Process
und dies daher NICHT funktioniert :Start-Process {ping -n 1000 example.com > ping__example.com.txt }
. Das Gleiche gilt fürStart-Job
funktioniert einwandfrei (obwohl Sie den vollständigen Pfad zur Ausgabedatei verwenden müssen).Es scheint, dass der übergebene Skriptblock
Start-Job
nicht mit demselben aktuellen Verzeichnis wie derStart-Job
Befehl ausgeführt wird. Geben Sie daher bei Bedarf den vollständig qualifizierten Pfad an.Beispielsweise:
quelle
Ich habe noch nicht herausgefunden, wie man stdout in Echtzeit bekommt. Für den Startjob müssen Sie stdout mit get-job abfragen
Update: Ich konnte den Job nicht starten, um einfach zu tun, was ich will, was im Grunde die Bash & Operator ist. Hier ist mein bisher bester Hack
quelle
Start-Job { Write-Output 'Hello world' } | Receive-Job -Wait
Ab PowerShell Core 6.0 können Sie
&
am Ende des Befehls schreiben. Dies entspricht der Ausführung Ihrer Pipeline im Hintergrund im aktuellen Arbeitsverzeichnis .Es ist nicht gleichbedeutend mit
&
in bash, es ist nur eine schönere Syntax für die aktuelle PowerShell- Jobfunktion . Es gibt ein Jobobjekt zurück, sodass Sie alle anderen Befehle verwenden können, die Sie für Jobs verwenden würden. Zum BeispielReceive-Job
:Wenn Sie einige Aussagen im Hintergrund ausführen möchten , können Sie kombinieren
&
Call - Betreiber ,{ }
Script - Block und diesen neuen&
Hintergrund Operator wie hier:Hier einige weitere Informationen von den Dokumentationsseiten:
von den Neuerungen in PowerShell Core 6.0 :
von about_operators / Ampersand Hintergrundoperator & :
quelle
Receive-Job 3
, aber nichts passiert.fg
zu erhalten, um den Job in den Vordergrund zu rücken .fg
in Powershell kein ähnliches Unix zu geben :( Ich erinnere mich, dass ich danach gesucht habe, aber nichts gefunden habeSie können PowerShell-Job-Cmdlets verwenden, um Ihre Ziele zu erreichen.
In PowerShell sind 6 auftragsbezogene Cmdlets verfügbar.
Wenn Sie daran interessiert sind, können Sie das Beispiel zum Erstellen eines Hintergrundjobs in PowerShell herunterladen
quelle
Sie können so etwas tun.
Und wenn Sie darauf warten möchten:
Bonus OSX oder Linux Version:
Beispiel Pinger Skript, das ich habe. Die Argumente werden als Array übergeben:
quelle
start
wird den Prozess verzweigen und die Kontrolle an den Anrufer zurückgeben. Weitere Infos hiertl; dr
quelle
Ich habe die hier beschriebene Lösung http://jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.entry erfolgreich in PowerShell v1.0 verwendet. In PowerShell v2.0 wird es definitiv einfacher.
quelle