darkfire
Goto Top

Mit Powershell zwei Prozesse mit gleichem Prozessname und unterschiedlichen Parameter überprüfen und ggf. erneut starten

Hallo Zusammen,

ich versuche seit Stunden zwei Prozesse mit gleichem Prozessname, gleichen Verzeichnis in WIn10 mittles Powershell zu überprüfen ob diese jeweils noch laufen, und ggf. erneut zu starten.

Den einzigen Unterschied mit dem ich was anfangen könnte, den ich im Taskmanager sehe, fand ich unter Details, die Spalte "Befehlszeile":

Für den ersten Prozess:
"C:\Users\Programm Test.exe" /ident=0
Für den zweiten Prozess:
"C:\Users\Programm Test.exe" /ident=1


Hatte folgendes programmiert, hat aber nicht zum Erfolg geführt:

$Program = '"C:\Users\Programm Test.exe"'
$Arg0 = '/ident=0'
$Arg1 = '/ident=1'

if (!(get-Process | ?{$_.commandline -eq „$Program“,“$Arg0“ -join “ „})){Start-Process „$Program“,“$Arg0“ -join “ „}
else {Write-Host "Prozess wird aktuell ausgeführt"}

if (!(get-Process | ?{$_.commandline -eq „$Program“,“$Arg1“ -join “ „})){Start-Process „$Program“,“$Arg1“ -join “ „}
else {Write-Host "Prozess wird aktuell ausgeführt"}


Hätte da jemand eine Idee? Vielen Dank im Voraus,

Viele Grüße

Content-Key: 594837

Url: https://administrator.de/contentid/594837

Printed on: April 19, 2024 at 14:04 o'clock

Member: SeaStorm
SeaStorm Aug 08, 2020 updated at 16:09:06 (UTC)
Goto Top
Hi

Startest du die Prozesse Initial auch mit Powershell? Wenn ja, dann kannst du die PID prüfen.
Wäre auch viel effizienter weil dann nicht jedes Mal alle Prozesse durchsucht werden müsste
Member: DarkFire
DarkFire Aug 08, 2020 at 16:19:03 (UTC)
Goto Top
Hi,

ja ich öffne die Programme bei jedem Windows-Start über die Aufgabenplanung mit Powershell.
Was müsste ich da programmieren, damit die PID bei Programmstart abgefragt werden, und diese PID nach Start überprüft werden?

Vielen Dank
Member: SeaStorm
SeaStorm Aug 08, 2020 at 16:41:20 (UTC)
Goto Top
Einfach $var = Start-Process .....
Dann enthält var die property ID:
$var.id
Member: DarkFire
DarkFire Aug 08, 2020 at 20:51:38 (UTC)
Goto Top
Danke für die schnelle Antowrt, ich habe das versucht mit der PID so umzusetzen wie ich es verstanden habe, aber leider läuft das so wie ich das gemacht habe leider nicht optimal. So wie ich es aktuell habe startet er jedes Programm je zweimal:


$ProcessName = "Programm Test"
$proc = Get-Process | Where-Object {$_.ProcessName -eq "Programm Test"}

if ($proc -imatch 'Programm Test')
{
'"Programm Test" ist aktiv - nix zu tun'
}
else
{
'"Programm Test" ist nicht aktiv - wird gestartet'
$Cmd = "C:\Users\Programm Test.exe"
  1. Starte für ident=0
$Arg0 = '/ident=0'
$var0 = Start-Process $Cmd -ArgumentList $Arg0
  1. Starte für ident=1
$Arg1 = '/ident=1'
$var1 = Start-Process $Cmd -ArgumentList $Arg1

if (!(get-Process | ?{$_.id -eq $var0.id})){Start-Process $Cmd -ArgumentList $Arg0}
else {Write-Host "Prozess wird aktuell ausgeführt"}

if (!(get-Process | ?{$_.id -eq $var1.id})){Start-Process $Cmd -ArgumentList $Arg1}
else {Write-Host "Prozess wird aktuell ausgeführt"}
}

Viele Grüße
Member: SeaStorm
SeaStorm Aug 08, 2020 at 21:04:10 (UTC)
Goto Top
Oh... ich hab -Passthru vergessen. Und deine Abfrage auf den Prozess hab ich mal angepasst
$ProcessName = "Programm Test"  
$proc = Get-Process | Where-Object {$_.ProcessName -eq "Programm Test"}  

if ($proc -imatch 'Programm Test')  
{
'"Programm Test" ist aktiv - nix zu tun'  
}
else
{
'"Programm Test" ist nicht aktiv - wird gestartet'  
$Cmd = "C:\Users\Programm Test.exe"  
Starte für ident=0
$Arg0 = '/ident=0'  
$var0 = Start-Process $Cmd -ArgumentList $Arg0 -PassThru
Starte für ident=1
$Arg1 = '/ident=1'  
$var1 = Start-Process $Cmd -ArgumentList $Arg1 -PassThru

if (!(get-Process -id $var0.id)){Start-Process $Cmd -ArgumentList $Arg0}
else {Write-Host "Prozess wird aktuell ausgeführt"}  

if (!(get-Process -id $var0.id)){Start-Process $Cmd -ArgumentList $Arg1}
else {Write-Host "Prozess wird aktuell ausgeführt"}  
}
Member: DarkFire
DarkFire Aug 09, 2020 at 06:43:01 (UTC)
Goto Top
Guten Morgen,

vielen Dank für die schnelle Antwort, funktioniert nun teilweise.
Was mir jetzt beim Testen aufgefallen ist, sobald ein Programm von den zwei geschlossen wird, dann wird das nicht mehr gestartet, da ja ein Porcess mit dem gleichen schon Namen läuft, wenn ich das wie unten machen:

$ProcessName = "Programm Test"
$proc = Get-Process | Where-Object {$_.ProcessName -eq "Programm Test"}
if ($proc -imatch 'Programm Test')

Gibt es da eine Möglichkeit das anderst zu machen? Hatte erst überlegt zwei *ps1-Dateien zu machen, aber dann müsste auch immer gefragt werden, ob der Porzess läuft?

Vielen Grüße
Mitglied: 145033
Solution 145033 Aug 10, 2020 updated at 09:50:08 (UTC)
Goto Top
Erst einmal: Die Eigenschaft commandline gibt es in den zurückgelieferten Objekten von Get-Process nicht, deswegen kann das Skript nicht funktionieren. Diese Eigenschaft wird nur bei der Abfrage der Prozesse über WMI oder CIM zurückgeliefert.

Gibt es da eine Möglichkeit das anderst zu machen?
Es gibt immer 1000 und 1 Weg nach Rom... Hier mal eine mögliche Variante:
$progpath = 'C:\Users\Programm Test.exe'  
$arg1 = '/ident=0'  
$arg2 = '/ident=1'  

$procs = gcim win32_Process | ?{$_.Path -eq $progpath}

if ($procs){
    if (!($procs | ?{$_.CommandLine -like "*$arg1*"})){  
        start $progpath $arg1
    }
    if (!($procs | ?{$_.CommandLine -like "*$arg2*"})){  
        start $progpath $arg2
    }
}else{
    start $progpath $arg1
    start $progpath $arg2
}
Member: DarkFire
DarkFire Aug 10, 2020 at 15:39:31 (UTC)
Goto Top
Hallo,

vielen Dank für eure Antworten und Hilfe, ein wirklich sehr tolles Forum!

@145033, vielen Danke so funktioniert es. Auf sowas wäre ich nie gekommen, trotz viele Seiten wo ich jetzt stundenlang gelesen habe,

Viele Grüße