highend01
Goto Top

Batch - Rekursiv .reg Dateien importieren

Hi zusammen,

ich hab hier folgendes Szenario:

- Startordner (sagen wir mal: D:\Temp)
- Innerhalb des Startordners liegt die Batchdatei (Install.bat)
- Unterhalb des Startordners hab ich eine Ordnerstruktur (die sich häufiger mal ändert)

z.B (das sind jetzt nur 2 von im Moment 40 Verzeichnissen):
D:\Temp\Tools\UltraISO\.RegSettings\Windows_2008
D:\Temp\Tools\UltraISO\.RegSettings\Windows_XP

In solchen Verzeichnissen befinden sich .reg Dateien (für das jeweilige OS), die entweder "Enable<Zweck>.reg" oder "Disable<Zweck>.reg" heißen.
Pro Verzeichnis sind es meist ein Dutzend solcher Dateien.

Ich kann mit Hilfe des Kommandozeilentools xqgetosver.exe herausfinden, auf welchem OS die Install.bat ausgeführt wird und setze dementsprechend
Variablen, die das Ende des Pfades als Namen enthalten (also z.b. Win_XP, wenn Install.bat auf einem XP System gestartet wurde).

Was ich gerne möchte ist, dass die Install.bat in der Lage ist, abhängig vom verwendeten OS, rekursiv in den Verzeichnisbaum unterhalb von D:\Temp
hinabzusteigen und dann nur die .reg Dateien (per regedit /s <xyz.reg>) zu importieren, die dem verwendeten OS entsprechen, d.h. z.B. bei einem XP
System eben nur die Dateien zu beachten, die unterhalb eines ...\Win_XP Pfades liegen und dabei dann entweder die "Enable<Zweck>.reg" oder eben
die "Disable<Zweck>.reg" zu nehmen.

Im Moment war ich nur bis zu einem nichtrekursiven Aufruf gekommen, der bspw. hier alle Enable<Zweck>.reg Dateien importiert:

FOR %%f IN ("%workingdir%\Enable*") do regedit /s "%%f"

%workingdir% ist das Verzeichnis aus dem die Install.bat heraus aufgerufen wurde. Das funktioniert zumindest einwandfrei ;)

Hätte jemand einen Ansatz, wie man das Gewünschte realisieren kann?

Danke und Gruß,
Highend

Content-ID: 117471

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

Ausgedruckt am: 18.12.2024 um 20:12 Uhr

77559
77559 04.06.2009 um 14:28:01 Uhr
Goto Top
Zitat von @Highend01:
Hallo Highend,
du schreibst nicht wie der Name der Variable ist die deine OSVEr enthält.
Ich nehme einfach mal OSVER an.
FOR /F "delims=" %%f IN (' Dir /B /S /A-D "%workingdir%\%OSVER%\Enable*" ') do regedit /s "%%f"  

Gruß
LotPings
Highend01
Highend01 04.06.2009 um 14:54:39 Uhr
Goto Top
Hallo LotPings,

die eigentliche Variable heißt RegPath.

Sie wird am Anfang des Scripts abgeleitet:

"%XQGetOSVer%" /B /N  
...
IF %ERRORLEVEL%==10 SET OSVer=Windows 2008 Server
...
IF "%OSVer%"=="Windows 2008 Server" SET RegPath=Windows_2008  

Wenn ich diese jetzt in die Zeile einsetze und das script probehalber mit einem veränderten Aufruf
FOR /F "delims=" %%f IN (' Dir /B /S /A-D "%workingdir%\%RegPath%\Enable*" ') do echo "%%f"  
durchlaufen lasse, bekomme ich allerdings auch .reg Dateien gelistet, die nicht im Windows_2008 Verzeichnis liegen.

"D:\Temp\UltraISO\.RegSettings\Windows_2008\Enable [Extensions (Install)].reg"  
"D:\Temp\UltraISO\.RegSettings\Windows_2008\Enable [Settings (Install)].reg"  
"D:\Temp\UltraISO\.RegSettings\Windows_7\Enable [Extensions (Install)].reg"  
"D:\Temp\UltraISO\.RegSettings\Windows_7\Enable [Settings (Install)].reg"  
"D:\Temp\VLC\.RegSettings\Windows_2008\Enable [Extensions (Install)].reg"  

Siehe die Dateien, die im Windows_7 Verzeichnis liegen.

Gruß,
Highend
77559
77559 04.06.2009 um 16:25:05 Uhr
Goto Top
Hallo Highend,
was in deiner Umgebung wie gesetzt ist, kannst nur du selbst überprüfen.

Entweder ist RegPath nicht oder falsch gesetzt.

Gruß
LotPings
78632
78632 04.06.2009 um 16:36:09 Uhr
Goto Top
Woher stammt der Punkt im Pfad vor Regsettings\ ?
Highend01
Highend01 04.06.2009 um 17:23:07 Uhr
Goto Top
Hi LotPings,

mh, du hattest Recht, die Variable RegPath war falsch gesetzt. Keine Ahnung, warum das der Fall war.

Setze ich das rein demonstrativ mal manuell auf Windows_2008

FOR /F "delims=" %%f IN (' Dir /B /S /A-D "%workingdir%\Windows_2008\Enable*" ') do echo "%%f"  

Dann werden gar keine .reg Dateien mehr gefunden ("Das System kann die angegebene Datei nicht finden.").

Versteh ich das falsch oder liegt es daran, dass wirklich nur in dem Verzeichnis (wie im Beispiel) D:\Temp\Windows_2008
alle Enable* Dateien gesucht werden? Falls ja entspricht das ja nicht dem Aufbau der Ordnerstruktur, weil diese OS-benannten
Verzeichnisse ja erst tiefer im Verzeichnisbaum auftreten.


@78632

Die Verzeichnisse "heißen" wirklich so (mit führendem Punkt).

Gruß,
Highend
77559
77559 04.06.2009 um 17:32:49 Uhr
Goto Top
Kann ich von hier schlecht sehen,
aber probier mal vor der Schleife mit Pushd in das BBasis Verzeichnis zu wechseln und dann den dir ohne Pfad.
PUSHD "%workingdir%\Windows_2008\"  
FOR /F "delims=" %%A IN (' Dir /B /S /A-D Enable*.reg  ') do echo "%%~fA"  
POPD

Ich mag Kleinbuchstaben nicht als Schleifenvariablen weil man sich schneller bei den Tilde Befehlen mal verhauen kann.

Gruß
LotPings
78632
78632 04.06.2009 um 17:37:25 Uhr
Goto Top
Hier stand mal OT
Highend01
Highend01 04.06.2009 um 17:44:42 Uhr
Goto Top
Das Verzeichnis "%workingdir%\Windows_2008\" existiert ja gar nicht, von daher wird das Wechseln schwierig *g*

Das nach dem laufenden OS benannte jeweilige Verzeichnise (Windows_2008 | Windows_XP, Windows_7, usw. usf.) existiert bei der jetzigen Anordnung _nicht direkt_ unterhalb des Basisverzeichnisses (D:\Temp), sondern taucht erst später (in weiteren Unterordnern) auf.

D:\Temp\Tools\UltraISO\.RegSettings\Windows_2008
oder auch
D:\Temp\Tools\VLC\.RegSettings\Windows_2008

(je nach Tool/Anwendung halt).

Das was du jetzt vorgeschlagen hast, würde implizieren, die Ordnerstruktur umzubauen im Stile von:

D:\Temp\Windows_2008\UltraISO\.Regsettings
D:\Temp\Windows_2008\VLC\.Regsettings

Das würde ich gerne vermeiden, da ich sonst für jedes OS das jeweilige Toolverzeichnis duplizieren müsste.

D:\Temp\Windows_XP\UltraISO\.Regsettings
D:\Temp\Windows_XP\VLC\.Regsettings

Gruß,
Highend
78632
78632 04.06.2009 um 17:51:11 Uhr
Goto Top
Ich würde mich mal mit Junctions beschäftigen. face-wink Unter Vista und > gibt es dazu mklink
77559
77559 04.06.2009 um 18:06:58 Uhr
Goto Top
Jetzt ist der Groschen gefallen,

dann mach doch erst eine for Schleife die nur nach Ordner sucht die das Os enthalten, eine zweite gestaffelte Schleife sucht dann unterhalb nach Enable*.reg Dateien.

@Echo off
Set Work=D:\Temp
PUSHD "%Work%"  
FOR /F "delims=" %%A IN (' Dir /B /S /AD "%RegPath%"') do (  
  PUSHD "%%~fA"  
 FOR /F "Delims=" %%B in ('Dir /B /S /A-D "Enable*.reg" ') Do Echo "%%~fB"  
 POPD  
)
POPD

Gruß
LotPings

Edits
Highend01
Highend01 04.06.2009 um 19:14:53 Uhr
Goto Top
*Cheer*

Ja, LotPings, das ist exakt das, was ich benötigt hatte face-smile

Ursprünglich sollte es auch noch eine Unterstützung für Betriebssysteme <= Win 98(se) geben, aber den Zopf kann man mittlerweile abschneiden, so dass dort das Nichtvorhandensein von pushd / popd nicht ins Gewicht fällt.

Vielen lieben Dank!

Gruß,
Highend