blacksaber
Goto Top

Mit Powershell strings in Variable oder Array zerlegen

Hallo zusammen,

ich versuche mich gerade an der Powershell und hänge an einem, wahrscheinlich, trivialem Problem.

Zielsetzung:
Ich benötige ProzessID(s) von einem Terminalserver die einer bestimmten .exe im Dateisystem zugeordnet sind damit ich diese beenden kann und anschließend einen Updateprozess anstossen kann.
Die Prozesse habe ich in einer Liste mittlerweile hinbekommen. Hier werden auch die Pfade zur .exe angezeigt.
Was ich jetzt nicht hinbekomme ist die ProzessID zu extrahieren damit ich den Prozess abschießen kann.

Ich habe folgendes bisher getan:
$ProcessNames = @( 'Name1.exe', 'javaw.exe' )  

$ProcessList = gwmi win32_process -ComputerName "Hostname" |  
    Where-Object { $ProcessNames -contains $_.Name} |
    Select-Object ProcessID, Name, Path 

Ich erhalte folgendes Ergebnis:

ProcessID Name              Path                                                                              
--------- ----              ----                                                                              
     7324 Name1.exe      C:\ProgramData\OrdnerA\Stage TuI\Name1.exe                  
     8560 javaw.exe         C:\ProgramData\OrdnerA\Stage TuI\java\jre1.8.0_141\bin\javaw.exe    
     6512 Name1.exe      C:\ProgramData\OrdnerA\Stage Live\Name1.exe                 
     9724 javaw.exe         C:\ProgramData\OrdnerA\Stage Live\java\jre1.8.0_141\bin\javaw.exe   
     9248 Name1.exe      C:\ProgramData\OrdnerA\Stage Prelive\Name1.exe              
      464 javaw.exe          C:\ProgramData\OrdnerA\Stage Prelive\java\jre1.8.0_141\bin\javaw.exe

Jetzt ist wichtig das ich die richtige Stage beende, also TuI oder Prelive oder Live.
Das habe ich soweit auch hinbekommen mit

$ProcessList = $ProcessList -like "*TuI*"  

Jetzt habe ich in der $ProcessList folgendes stehen:

@{ProcessID=7324; Name=Name1.exe; Path=C:\ProgramData\OrdnerA\Stage TuI\Name1.exe}
@{ProcessID=8560; Name=javaw.exe; Path=C:\ProgramData\OrdnerA\Stage TuI\java\jre1.8.0_141\bin\javaw.exe}

Wie bekomme ich jetzt die ProzessID in eine Form dass ich damit weiterarbeiten kann? Einfach ausschneiden geht nicht, da die ID von 3 bis 5 stellig sein kann bzw. ich bekomme das einfach nicht hin. Vielleicht mache ich ja auch schon beim Anfang einen Fehler und das ganze geht noch viel einfacher?

Vielen Dank schon im voraus, ich stehe gerade auf dem Schlauch.

Gruß
Klaus aus I

Content-Key: 640132

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

Ausgedruckt am: 29.03.2024 um 13:03 Uhr

Mitglied: SlainteMhath
SlainteMhath 13.01.2021 um 15:08:46 Uhr
Goto Top
Moin,

in etwa so:

$ProcessList | %{
  write-host $_.ProcessID
}

lg,
Slainte
Mitglied: manuel-r
manuel-r 13.01.2021 um 15:31:48 Uhr
Goto Top
Wie wäre es etwa so (ungetestet)
$Prozesse = Get-Process
foreach ($Prozess in $Prozesse) {
	$ProzessID = $Process.ID
	$Prozessname = $Process.Name
	$Prozesspfad = $Prozess.Path
	if (($Prozessname -match "Name1.exe") -and ($Prozesspfad -match "Stage Tui")) {  
		Stop-Process -ID $ProzessID
	}
}
Manuel

PS: Bestimmt kommt auch noch jemand mit 'nem Einzeiler um die Ecke face-wink
Mitglied: 147069
147069 13.01.2021 aktualisiert um 15:49:39 Uhr
Goto Top
gps | ?{[IO.Path]::GetFileName($_.Path) -in ('Name1.exe', 'javaw.exe') -and $_.Path -like '*Stage Tui*'} | kill -Force  
Mitglied: Blacksaber
Blacksaber 14.01.2021 um 13:09:08 Uhr
Goto Top
Danke für die Idee. Leider funktioniert diese Lösung nur wenn ich lokal angemeldet bin und nicht remote da der Get-Process über Remote den Pfad nicht ausgibt.

Nur für mich zum Verständnis: Was bewirkt das "?{[IO.Path]::GetFileName($_.Path)"?
Danke
Mitglied: Blacksaber
Blacksaber 14.01.2021 um 13:52:01 Uhr
Goto Top
Danke für den Vorschlag. Mit dem einzeiler hattest Recht... face-smile

So ganz verstehe ich den Vorschlag allerdings nicht. Du willst jeden Prozess der "Prozesse" die entsprechende Kriterien haben in "Prozess" schreiben und diesen dann wenn "getroffen" beenden. Richtig?

Ich bekomme auf meinem Rechner leider keine Ergebnisse geliefert...

Gruß
Mitglied: Blacksaber
Blacksaber 14.01.2021 um 13:54:41 Uhr
Goto Top
Hi, das sieht gut aus. Kann ich hier nochmal filtern? Weil in dieser Form schreibt mir die PS alle gefundenen Prozesse als ProzessID weg. Ich benötige aber nur die, die einer konkreten Stage entsprechen. Wenn ich die Filterung im Vorfeld mache dann habe ich die @ Zeichen vorne dran und mit deiner Methode passiert dann gar nichts mehr...
Mitglied: 147069
Lösung 147069 14.01.2021 aktualisiert um 15:27:25 Uhr
Goto Top
Zitat von @Blacksaber:

Danke für die Idee. Leider funktioniert diese Lösung nur wenn ich lokal angemeldet bin und nicht remote da der Get-Process über Remote den Pfad nicht ausgibt.
Auch kein Problem, kannst du so auch gleich beenden ...
gwmi Win32_process -ComputerName XYZ | ?{$_.Name -in ('Name1.exe', 'javaw.exe') -and $_.Path -like '*Stage Tui*'} | %{$_.Terminate()}  
oder etwas aktueller und schneller mit CIM statt WMI
gcim Win32_process -ComputerName XYZ | ?{$_.Name -in ('Name1.exe', 'javaw.exe') -and $_.Path -like '*Stage Tui*'} | icim -MethodName Terminate -Verbose  
Nur für mich zum Verständnis: Was bewirkt das "?{[IO.Path]::GetFileName($_.Path)"?
Holt sich nur den Dateinamen aus einem Pfad, die Doku hätte es dir übrigens auch verraten.
https://docs.microsoft.com/de-de/dotnet/api/system.io.path.getfilename?v ...
Mitglied: Blacksaber
Blacksaber 14.01.2021 um 16:43:32 Uhr
Goto Top
Super!!

Vielen Dank. Damit bekomme ich es jetzt hin. Und danke für den Link zur Doku. Ich hätte nicht gewusst wonach ich genau suchen muss... Das hilft mir sehr weiter! Danke nochmal.

Gruß