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:
Ich erhalte folgendes Ergebnis:
Jetzt ist wichtig das ich die richtige Stage beende, also TuI oder Prelive oder Live.
Das habe ich soweit auch hinbekommen mit
Jetzt habe ich in der $ProcessList folgendes stehen:
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 640132
Url: https://administrator.de/contentid/640132
Ausgedruckt am: 26.11.2024 um 11:11 Uhr
8 Kommentare
Neuester Kommentar
Wie wäre es etwa so (ungetestet)
Manuel
PS: Bestimmt kommt auch noch jemand mit 'nem Einzeiler um die Ecke
$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
}
}
PS: Bestimmt kommt auch noch jemand mit 'nem Einzeiler um die Ecke
gps | ?{[IO.Path]::GetFileName($_.Path) -in ('Name1.exe', 'javaw.exe') -and $_.Path -like '*Stage Tui*'} | kill -Force
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 ...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.
gwmi Win32_process -ComputerName XYZ | ?{$_.Name -in ('Name1.exe', 'javaw.exe') -and $_.Path -like '*Stage Tui*'} | %{$_.Terminate()}
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 ...