Benutzer mit den meisten Antworten
Registrierungseintrag per Batch und Powershell modifizieren, Problem mit dem %-Zeichen

Frage
-
Hallo Zusammen,
ich möchte bei Windows einen weiteren Pfad eintragen, in dem Windows nach Treibern sucht.
Hierzu muss ich in der Registry (HKLM\Software\Microsoft\Windows\CurrentVersion\DevicePath) das Verzeichnis ergänzen, wobei die Verzeichnisse durch ein Semikolon zu trennen sind.
Dazu lese ich in einer Batch die vorhandenen Werte aus und hängte „;<MeinVerzeichnis>“ an.
set myPath=C:\Sample for /f "tokens=3" %%i in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion" /v DevicePath') do ( set oldValue=%%i ) reg add "HKLM\Software\Microsoft\Windows\CurrentVersion" /v DevicePath /t REG_EXPAND_SZ /d "%oldValue%;%myPath%"
Dabei ist mir folgendes aufgefallen:
Der originale Wert lautet „%SystemRoot%\inf“, nach dem Batch-Eingriff steht dort allerdings „C:\Windows\inf;<Mein Verzeichnis>“.
Probehalber habe ich in der Powershell ebenfalls den Wert ausgelesen, hierbei bekomme ich nur „C:\Windows\inf“ zurück.
(Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion).DevicePath
Nun zu meinen Fragen:
(1) Wie kann ich das %-Zeichen in einer Batch in „^%“ ändern?
(2) Wie kann ich in der PowerShell wissen, dass dort %SystemRoot%“ anstelle von „C:\Windows“ steht?
(3) Muss/Sollte „%SystemRoot%“ an dieser Stelle stehen bleiben, respektive kann ich davon ausgehen, dass sich „C:\Windows" niemals(!) in „D:\Windows“ ändern wird?
Viele Grüße,
Crazy
- Bearbeitet CrazyMetal Mittwoch, 3. Dezember 2014 15:55 Korrektur
Antworten
-
Mittlerweile habe ich eine Lösung gefunden, die ich niemanden vorenthalten möchte.
(3) Vorweg muss ich sagen, dass ich grundsätzlich davon ausgehe, dass ich jemand was dabei gedacht hat „%SystemRoot%\inf“ dort einzutragen und ich möchte das auch so beibehalten.
Daher habe ich folgenden Workaround im Batch umgesetzt:
@echo off & setlocal enableDelayedExpansion cls set myPath=C:\MyPath for /f "tokens=3" %%i in ('reg query "HKLM\Software\Microsoft\Windows\CurrentVersion" /v DevicePath') do ( set oldDevicePathes=%%i ) for %%A in ("%oldDevicePathes:;=" "%") do ( echo %%A | findstr /c:"%SystemRoot%\inf" >nul || ( if defined oldValue ( set "oldValue=!oldValue!;%%A" ) else ( set "oldValue=%%A" ) ) ) if defined oldValue ( reg add "HKLM\Software\Microsoft\Windows\CurrentVersion" /v DevicePath /t REG_EXPAND_SZ /d "^%%SystemRoot^%%\inf;!oldValue!;%myPath%" ) else ( reg add "HKLM\Software\Microsoft\Windows\CurrentVersion" /v DevicePath /t REG_EXPAND_SZ /d "%%SystemRoot%%\inf;%myPath%" )
Zu der Lösung gibt es eigentlich nicht viel zu sagen, so komplex ist es ja auch nicht. Das Script liest die bestehenden Werte aus, dabei werden die alten Werte in ein Hilfsvariable geschrieben, sofern diese nicht „%SystemRoot\inf“ heißen.
Anschließend werden die neuen Werte in die Registry geschrieben, hierbei wird lediglich unterschieden ob alte Werte aus der Registry vorhanden waren oder nicht.
(Zu 1: Um aus dem „%“-Zeichen die Zeichenfolge „^%“ in die Variable zu schreiben: Einfach „^%%SystemRoot^%%\inf“)
Zu 2:
function AddDriverPathToWindowsDriverSearch($neuerPfad) { $regEintrag=Get-ItemPropertyValue -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion -Name DevicePath $neuerRegEintrag="" $regEintrag.Split(';') | % { if($_ -like ($env:SystemRoot + "\inf")){$neuerRegEintrag+=";%SystemRoot%\inf"} else {$neuerRegEintrag+=";"+$_} } $neuerRegEintrag=$neuerRegEintrag.Remove(0,1) $neuerRegEintrag+=";$neuerPfad" Set-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion -Name DevicePath -Value $neuerRegEintrag }
Damit ich den Eintag von der PowerShell aus wieder richtig hinterlege, verwende ich ein ähnliches Vorgehen wie in der Batch.
Zuerst lese ich die Werte aus der Registrierung, anschließend schreibe ich diese in eine Hilfsvariable, wobei in einer foreach-Schleife (% {}) geprüft wird ob das aktuelle Token gleich der Enviroment-Variable env:SystemRoot+“\inf“ ist; dieser Eintrag wird durch „%SystemRoot%\inf“ ersetzt. Jedes Token wird mit einem vorangestellten Semikolon den Werten hinzugefügt, sodass anschließend das erste Zeichen der Hilfsvariable entfernt wird und diese als neuer Wert in die Registrierung geschrieben wird.
Wichtig:
Das sind Lösungsbeispiele, die Prüfung ob der neu einzutragende Pfad bereits enthalten ist habe ich hier nicht gepostet, damit die Code-Ausschnitte übersichtlich bleiben.
Grüße,
Crazy- Als Antwort markiert CrazyMetal Freitag, 5. Dezember 2014 07:07