Powershell String Suchen mit Wildcard und Ersetzen
Hallo zusammen,
ich bräuchte Unterstützung bei einem Powershell Script.
Ich habe ein Java Rollout per GPO über ein PowerShell Script eingerichtet.
Im Anschluss an das Update, muss die Systemvariable PFAD aktualisiert werden.
Leider stehen in dieser Variable noch einige andere Pfade, sodass ich diesen nicht einfach leeren und mit dem aktuellen Pfad überschreiben kann.
1. Ist Situation vor einem Java Update:
C:\Program Files (x86)\Common Files\\\;C:\Windows\system32;C:\Windows;C:\Windows\System32\;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\\Viewer\bin;C:\Program Files (x86)\\\bin;C:\Program Files (x86)\Java\jre1.8.0_60\bin
2. Soll:
Suchen nach dem String \jre*\ und ersetzen gegen die aktuelle Version:
C:\Program Files (x86)\Common Files\\\;C:\Windows\system32;C:\Windows;C:\Windows\System32\;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\\Viewer\bin;C:\Program Files (x86)\\\bin;C:\Program Files (x86)\Java\jre1.8.0_77\bin
Mein bisheriges Script:
Das Ergebnis sieht leider folgendermaßen aus:
C:\Program Files (x86)\Common Files\\\;C:\Windows\system32;C:\Windows;C:\Windows\System32\;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\\Viewer\bin;C:\Program Files (x86)\\\bin;C:\Program Files (x86)\Java\jre1.8.0_771.8.0_99\bin
Es wird also nur das jre ersetzt. Ich möchte gerne, das alles zwichen den beiden Backslashs ersetzt wird.
Habt ihr eine Idee?
ich bräuchte Unterstützung bei einem Powershell Script.
Ich habe ein Java Rollout per GPO über ein PowerShell Script eingerichtet.
Im Anschluss an das Update, muss die Systemvariable PFAD aktualisiert werden.
Leider stehen in dieser Variable noch einige andere Pfade, sodass ich diesen nicht einfach leeren und mit dem aktuellen Pfad überschreiben kann.
1. Ist Situation vor einem Java Update:
C:\Program Files (x86)\Common Files\\\;C:\Windows\system32;C:\Windows;C:\Windows\System32\;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\\Viewer\bin;C:\Program Files (x86)\\\bin;C:\Program Files (x86)\Java\jre1.8.0_60\bin
2. Soll:
Suchen nach dem String \jre*\ und ersetzen gegen die aktuelle Version:
C:\Program Files (x86)\Common Files\\\;C:\Windows\system32;C:\Windows;C:\Windows\System32\;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\\Viewer\bin;C:\Program Files (x86)\\\bin;C:\Program Files (x86)\Java\jre1.8.0_77\bin
Mein bisheriges Script:
# Script zum Suchen und Ersetzten von Strings in Registry Keys
$RegistryPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
$RegistryKey = "Path"
# Auslesen des Inhaltes eines Registry Keys
$Ist = (Get-ItemProperty -Path $RegistryPath -Name $RegistryKey).Path
# Suchstring
$SearchStr = "jre*"
if ($Ist -match $SearchStr)
{
write-host "Suchstring $SearchStr gefunden"
$Ist -replace $SearchStr,$jreVersion
}
else
{
write-host "Nicht gefunden"
$Soll = Set-ItemProperty -Path "$RegistryPath" -Name "$RegistryKey" -Type ExpandString -Value "$Ist;C:\Program Files (x86)\Java\jre1.8.0_99\bin"
}
Das Ergebnis sieht leider folgendermaßen aus:
C:\Program Files (x86)\Common Files\\\;C:\Windows\system32;C:\Windows;C:\Windows\System32\;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\\Viewer\bin;C:\Program Files (x86)\\\bin;C:\Program Files (x86)\Java\jre1.8.0_771.8.0_99\bin
Es wird also nur das jre ersetzt. Ich möchte gerne, das alles zwichen den beiden Backslashs ersetzt wird.
Habt ihr eine Idee?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 305239
Url: https://administrator.de/contentid/305239
Ausgedruckt am: 19.11.2024 um 08:11 Uhr
6 Kommentare
Neuester Kommentar
Hi,
das ist bei aktuellen Java-Versionen doch gar nicht mehr nötig. Die tragen doch automatisch folgenden universellen Pfad in PATH ein:
Dort zeigen Symlinks auf die aktuellen Version.
Gruß skybird
p.s. das hatten wir doch vor kurzem schon mal hier
Windows 7 - PATH - ändern
das ist bei aktuellen Java-Versionen doch gar nicht mehr nötig. Die tragen doch automatisch folgenden universellen Pfad in PATH ein:
C:\ProgramData\Oracle\Java\javapath
Dort zeigen Symlinks auf die aktuellen Version.
Gruß skybird
p.s. das hatten wir doch vor kurzem schon mal hier
Windows 7 - PATH - ändern
Hallo herrmanndominic!
Da kann ich @129413 nur zustimmen, die aktuellen Versionen setzen diesen universellen Pfad in die PATH Umgebungsvariable ein.
Willst du dein Vorhaben trotzdem so umsetzen, warum auch immer, sollte dir folgendes Skript helfen:
(Natürlich mit Admin-Rechten auszuführen (Startskript/Task))
Grüße Uwe
Da kann ich @129413 nur zustimmen, die aktuellen Versionen setzen diesen universellen Pfad in die PATH Umgebungsvariable ein.
Willst du dein Vorhaben trotzdem so umsetzen, warum auch immer, sollte dir folgendes Skript helfen:
# reg key je nach OS Architecture anpassen
if ((gwmi win32_operatingsystem).OSArchitecture -eq '64-Bit'){
$key = 'HKLM:\SOFTWARE\Wow6432Node\JavaSoft\Java Runtime Environment'
}else{
$key = 'HKLM:\SOFTWARE\JavaSoft\Java Runtime Environment'
}
try{
# Hauptversion holen
$main = (Get-ItemProperty $key -Name CurrentVersion).CurrentVersion
# Pfad zur aktuellen Version extrahieren
$currentpath = (Get-ItemProperty ($key + "\$main")).JavaHome
}catch{}
# Wenn Version gefunden wurde ersetze die "System"-Umgebungsvariable PATH
if ($currentpath){
[System.Environment]::SetEnvironmentVariable('PATH',([System.Environment]::GetEnvironmentVariable('PATH',2) -replace '[^;]+\\jre[^;]+',$currentpath), 2)
}
Grüße Uwe
Wieso du doppelt gemoppelt zusätzlich noch nach
$SearchStr = "\\java\\*"
suchst verstehe wer will ??? Das alles macht doch schon der Regex
'[^;]+\\jre[^;]+'
von @colinardo denn kannst du ja wenn du willst stattdessen noch ausbauen zu
'[^;]+\\java\\jre[^;]+'
Dein doppeltes Konstrukt ist also vollkommen überflüssig.
$SearchStr = "\\java\\*"
suchst verstehe wer will ??? Das alles macht doch schon der Regex
'[^;]+\\jre[^;]+'
von @colinardo denn kannst du ja wenn du willst stattdessen noch ausbauen zu
'[^;]+\\java\\jre[^;]+'
Dein doppeltes Konstrukt ist also vollkommen überflüssig.
Eben, das Skript war ja dadurch schon komplett und funktionsfähig, da braucht es kein unzuverlässiges Registry-Gebastel wenn es doch die passenden Funktionen zum Setzen der System-Umgebungsvariablen gibt
Außerdem wird bei der Variante die aktuell installierte Java-Version schon von selbst ausgelesen, so kann es nicht zum Setzen eines falschen Pfades kommen falls das Java doch noch nicht korrekt deployed wurde.
Naja jeder wie ers mag ...
Außerdem wird bei der Variante die aktuell installierte Java-Version schon von selbst ausgelesen, so kann es nicht zum Setzen eines falschen Pfades kommen falls das Java doch noch nicht korrekt deployed wurde.
Naja jeder wie ers mag ...