
Frage
Wie kann ich einen Powershell-Befehl in einem ausführen script.ps1
(der beispielsweise eine Endlosschleife in einem WSL startet), 5 Sekunden warten und dann den Befehl stoppen/unterbrechen, sodass Powershell zur nächsten Zeile des Befehls wechselt script.ps1
?
Beispielverhalten
Wenn ich manuell drücke, ctrl+c
während der Befehl in Powershell ausgeführt wird, wird der WSL-Befehl gestoppt und die Ausgabe des Befehls gedruckt bzw. mit der Zeile fortgesetzt Write-Host "output="$output
.
Versuche
- Emulieren des Sendens
ctrl+c
an das Powershell-Terminal.
# line 1, activate "inifinite" loop in wsl
[String] $output = wsl /home/testlinuxname/maintenance/gCal/./askSync.sh
# try to stop/break the previous command/infinite loop
[void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
[System.Windows.Forms.SendKeys]::SendWait("^{c}")
# get the output of the first command and print it to screen.
Write-Host "output="$output
Das bleibt aber beim ersten Befehl hängen und zeigt die Ausgabe nicht weiter an.
- Den Befehl in einen Job einfügen und diesen Job nach
n
Sekunden beenden.
# Start Job
$job = Start-Job -ScriptBlock {
Start-Sleep -Seconds 2
}
# Wait for job to complete with timeout (in seconds)
$job | Wait-Job -Timeout 10
# Check to see if any jobs are still running and stop them
#$job | Where-Object {(wsl pwd > c:/temp/output.txt) } | Stop-Job #Executes command and puts it in log
$job | Where-Object {(wsl /home/testlinuxname/maintenance/gCal/./askSync.sh > c:/temp/output.txt) } | Stop-Job # Execute command but does not terminate
Der Befehl wird ausgeführt, aber nicht beendet.
- Basierend auf den Kommentaren habe ich start-process verwendet, um den Code in einem separaten Fenster auszuführen, was funktioniert. Ich stelle gerade fest, wie ich das gestartete Objekt erhalte, damit ich
Stop-Process
es anwenden/aufrufen kann.
$proc = Start-Process wsl /home/testlinuxname/maintenance/gCal/./askSync.sh > c:/temp/output.txt -RedirectStandardOutput c:/temp/input1.txt -Passthru
Write-Host "Continuing powershell and starting sleep:"
Start-Sleep -s 10
Write-Host "Done sleeping, now stopping process:"
$proc | Stop-Process
Write-Host "Stopped process"
Dieses läuft zwar weiter und sagt, dass es den Vorgang gestoppt hat, das Fenster wsl
ist danach aber immer noch geöffnet und schließt nicht.