PowerShell Prozess gnadenlos beenden
Hallo alle zusammen
Ich habe folgende Situation,
ich habe mir mit der PowerShell eine GUI erstellt die mir mein Backup erleichtert.
Das Backup klappt an sich auch ganz gut, aber ein Teil leider nicht so wie ich es gerne möchte.
Wenn ich das Skript nun starte, wird mir eine GUI angezeigt mit folgenden Elementen:
Wenn ich nun auf Button A klicke, öffnet sich eine Neue PowerShell in der Robocopy läuft.
Wenn ich nun auf Button B klicke, soll das momentan laufende Backup abgebrochen werden, also die PowerShell in der Robocopy läuft soll beendet werden.
Dazu wollte ich den Prozess beenden von der neu geöffneten PowerShell, dazu schreibe ich mir die Prozess-ID, beim Start der neuen PowerShell, in einer Variable.
Dann dachte ich mir das ich einfach den Prozess mit dem Folgenden Befehl beende:
Leider geht das nicht.
Wenn ich dazu noch den Prozess von Robocopy beende klappt es, Befehl:
Da es aber auch sein kann das mehrere Robocopy Prozesse laufen, kann es sein das ich auch die anderen mit beende, und das möchte ich nicht.
Meine Frage ist nun, wie realisiere ich das am besten, das auch immer der Richtige Robocopy Prozesse beendet wird oder das sich die neu geöffnete PowerShell gnadenlos beenden?
Gruß Miyamoto
Ich habe folgende Situation,
ich habe mir mit der PowerShell eine GUI erstellt die mir mein Backup erleichtert.
Das Backup klappt an sich auch ganz gut, aber ein Teil leider nicht so wie ich es gerne möchte.
Wenn ich das Skript nun starte, wird mir eine GUI angezeigt mit folgenden Elementen:
- 1x Label
- 2x Buttons (Button A startet das Backup, Button B beendet das Backup)
- 1x ProgressBar
Wenn ich nun auf Button A klicke, öffnet sich eine Neue PowerShell in der Robocopy läuft.
Wenn ich nun auf Button B klicke, soll das momentan laufende Backup abgebrochen werden, also die PowerShell in der Robocopy läuft soll beendet werden.
Dazu wollte ich den Prozess beenden von der neu geöffneten PowerShell, dazu schreibe ich mir die Prozess-ID, beim Start der neuen PowerShell, in einer Variable.
Dann dachte ich mir das ich einfach den Prozess mit dem Folgenden Befehl beende:
Stop-Process -Id "[Variable mit der Prozess-ID]"
Leider geht das nicht.
Wenn ich dazu noch den Prozess von Robocopy beende klappt es, Befehl:
Stop-Process -Name "Robocopy"
Meine Frage ist nun, wie realisiere ich das am besten, das auch immer der Richtige Robocopy Prozesse beendet wird oder das sich die neu geöffnete PowerShell gnadenlos beenden?
Gruß Miyamoto
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 152107
Url: https://administrator.de/contentid/152107
Ausgedruckt am: 20.11.2024 um 02:11 Uhr
8 Kommentare
Neuester Kommentar
Servus,
ich bin kein Experte für die PS, allerdings habe ich etwas ähnliches auch mal gebastelt. Hast mal darüber nachgedacht, für das killen von Robocopy auf ein externes Tool zuzugreifen? Sysinternals hat mit pskill ein sehr gutes Werkzeug für genau diesen Zweck...evtl. geht das killen des spezifischen Prozesses über PID damit besser?!
FLAGSHiP
J.H.
ich bin kein Experte für die PS, allerdings habe ich etwas ähnliches auch mal gebastelt. Hast mal darüber nachgedacht, für das killen von Robocopy auf ein externes Tool zuzugreifen? Sysinternals hat mit pskill ein sehr gutes Werkzeug für genau diesen Zweck...evtl. geht das killen des spezifischen Prozesses über PID damit besser?!
FLAGSHiP
J.H.
Hallo Miyamoto,
Eine dort gesetzte Variable ist auch nur dort sichtbar.
Du musst schon einen anderen Weg zur Weitergabe der ID nutzen, z.Bsp die hier beschriebene Methode mit:
Gruß
LotPings
Dazu wollte ich den Prozess beenden von der neu geöffneten PowerShell, dazu schreibe ich mir die Prozess-ID, beim Start der neuen PowerShell, in einer Variable.
Dann dachte ich mir das ich einfach den Prozess mit dem Folgenden Befehl beende:
...Dann dachte ich mir das ich einfach den Prozess mit dem Folgenden Befehl beende:
Meine Frage ist nun, wie realisiere ich das am besten, das auch immer der Richtige Robocopy Prozesse beendet wird oder das sich die neu geöffnete PowerShell gnadenlos beenden?
Auch bei der Powershell erbt ein neuer Process eine Kopie des Environments.Eine dort gesetzte Variable ist auch nur dort sichtbar.
Du musst schon einen anderen Weg zur Weitergabe der ID nutzen, z.Bsp die hier beschriebene Methode mit:
$process = [System.Diagnostics.Process]::Start("notepad")
$process.Responding
True
$process.HasExited
False
$process.Kill()
Gruß
LotPings
Hätte mich auch gewundert, wenn nicht
Gruß
LotPings
Ich starte meinen Aufruf wie folgt:
durch den Parameter "-PassThru" wird die Prozess-ID von der Neue gestarteten PowerShell in die Variabel
"$copyProzeesID" gespeichert.
Ich glaube da liegt ein Gedankenfehler vor, die ID wird doch nur die vom 2.Powershell Prozess sein, nicht die vom dann erst gestarteten Robocopy.> $copyProzeesID=Start-Process -PassThru powershell -ArgumentList "-command robocopy $bilderQuelle $bilderZiel /E /XF
> $ignordata /ETA /NJH /NJS; 'Das ist eine Temporere Datei' ; out-file -filepath
> $bilderZiel\ncalnasddbuasajsd.nivdnscsdnfdbu -encoding Default"
>
"$copyProzeesID" gespeichert.
Gruß
LotPings
Zitat von @Miyamoto:
Ich starte doch eine weitere PowerShell in der dann ein paar Befehle ablaufen unter anderem der Robocopy Befehl.
Wenn ich jetzt den Prozess der PowerShell beende müsste doch eigentlich auch alles was sich innerhalb der PowerShell befindet
mit sterben.
Robocopy ist doch eine separate exe mit eigener Process-ID, das zusätzliche Wrappen in einen Powershell-Prozess ist IMO überflüssig und kontraproduktiv.Ich starte doch eine weitere PowerShell in der dann ein paar Befehle ablaufen unter anderem der Robocopy Befehl.
Wenn ich jetzt den Prozess der PowerShell beende müsste doch eigentlich auch alles was sich innerhalb der PowerShell befindet
mit sterben.
Oder nicht???
Oder nicht!!!Gruß
LotPings