bbuser
Goto Top

Dynamische Liste aus INI lesen und die Werte für Variablen nutzen

Diverse Pfade sind in einer Datei aufgelistet, diese sollen je einer neuen Variablen zugeordnet werden.

Hallo Forum,

ich sitze derzeit über einem Backup Script.

Folgender Hintergrund:

In einer .INI Datei werden diverse Pfade Zeile für Zeile definiert.
Es wird eine Batch ausgeführt welche in die INI schauen soll und den jeweiligen Pfad ausliest und diesen einer Variable zuordnet. Diese Pfade sollen später gesichert werden.
Das sichern klappt. Auch das auslesen einzelner Werte aus der .INI.

Nun kommt es aber vor, dass ich auf einem System z.B. 3 Pfade für ein Backup in der .INI definieren möchte, und für ein anderes System 5 oder "x" Pfade. Die Batch soll dabei gleich bleiben aber trotzdem schauen das sie jeden Pfadeeintrag mitnimmt.

Die INI sieht derzeit so aus:

[Text1]
x=>y

[Text2]
d=>z
a=>k

[Directories to backup]
Folder=>C:\Outlook
Folder=>D:\Outlook
Folder=>%USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook

Ab dem Eintrag [Directories to backup] soll die Batch nun nach den Pfaden schauen und jeden einer, wenn möglich neuen dynamischen, Variable zuordnen.

Mit

FOR /F "tokens=2 Delims=>" %%i IN ('set^|Find "Folder" import.ini') DO echo %%i

kann ich Werte aus der Datei lesen und anzeigen lassen, wenn nur Pfade drin stehen. Aber das Zuordnen dieser Pfade zu neuen Variablen für die spätere Verwendung im Backup klappt noch nicht.

Über Hilfe würde ich mich freuen.

Das fertige Script kann ich später dann gerne hier posten.

Gruss

Content-ID: 106191

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

Ausgedruckt am: 23.11.2024 um 03:11 Uhr

bastla
bastla 15.01.2009 um 19:25:29 Uhr
Goto Top
Hallo BBUser!

Es lassen sich zwar, sogar ohne "delayedExpansion", entsprechende Variablen erstellen, etwa:
set /a x=0
for /f "tokens=2 delims=>" %%i in ('set^|Find "Folder" import.ini') do set /a x+=1 & call set "Pfad%%x%%=%%i"  
Allerdings stellt sich mir die Frage, wozu Du diese Variablen später konkret benötigst (bzw ob es nicht einfacher wäre, das Ganze über eine "for"-Schleife mit Aufruf eines Unterprogrammes für jeden Pfad zu realisieren)...

Grüße
bastla
BBUser
BBUser 15.01.2009 um 21:01:54 Uhr
Goto Top
Hallo basta,


danke für die erste Hilfe.

Später sollen diese Variablen dann für eine Sicherungsroutine verwendet werden.

Also so nach dem Motto


xcopy %variable-welche-dem-pfad-x-aus-der-ini-entspricht% nach %backupverzeichnis%

je nach dem wieviel Pfade ich in der ini angebe ändert sich ja auch die anzahl der variablen.

Hoffe ich konnte das Ziel einigermaßen gut dar stellen.

Grüße
bastla
bastla 15.01.2009 um 22:04:20 Uhr
Goto Top
Hallo BBUser!

Das eigentliche Ziel war mir schon klar, nur: Warum soll das erst später passieren? Das "xcopy" kannst Du doch einfach in die Schleife einbauen, und wenn Du drumherum noch etwas tun wolltest, dann, wie gesagt, über ein Unterprogramm:
@echo off & setlocal
set "Backupvereichnis=E:\Sicherung"  
set "Log=D:\BackupLog.txt"  

>>"%Log%" echo Sicherung gestartet am %date% um %time%  
for /f "tokens=2 delims=>" %%i in ('set^|Find "Folder" import.ini') do call :ProcessPath "%%i"  
>>"%Log%" echo Sicherung beendet am %date% um %time%  
echo Fertig.
goto :eof

:ProcessPath
set "Pfad=%~1"  
:: irgendwelche Aktionen
::
>>"%Log%" echo Sichere %Pfad%  
xcopy "%Pfad%" "%Backupverzeichnis%"  
:: weitere Aktionen
::
goto :eof
Grüße
bastla
BBUser
BBUser 15.01.2009 um 22:26:09 Uhr
Goto Top
Funktioniert soweit gut nach etwas Anpassung auf meiner Seite.

Gibts da noch Möglichkeiten der Optimierung?

z.B. die ini.. sieht derzeit u.a. so aus:

[Directories to backup]
Folder=>C:\source2

Ich würde aber gerne

Folder: C:\source2

schreiben. Dann klappt das aber mit den tokens und delims nicht mehr da ich ja in der Pfadangabe auch ein Doppelpunkt habe bzw. können auch Leerzeichen in den Pfaden auftreten.

Wäre das trotzdem irgendwie möglich?

Grüße
Ren
Ren 16.01.2009 um 12:06:21 Uhr
Goto Top
Versuche:
for /f "tokens=1,* delims=:" %%i in ('set^|Find "Folder" import.ini') do :was immer du da machst  
Dabei ist jetzt %%i Folder, %%j alles, was hinter dem : Steht. Das Führt dich zu dem Problem, dass du ja als Trennzeichen nicht den : genommen hast, sondern den : mit einer Leertaste dahinter. Die bekommst du aber weg, wenn du in der Routine, die aufgerufen wird, die Variable mit Hilfe von set um ein Zeichen vorne beschneidest. Siehe set /?
Noch einen Anmerkung:
Verzeichnisnamen dürfen unter Windows leider %-Zeichen enthalten. so ohne weiteres kann man also Verzeichnisnamen wie c:\ablage % ich bin so doof%\backup nicht in einer Batch als Variable übergeben. Wenn es also universal einsetzbar sein muss, in den Verzeichnisnamen also % vorkommen kann, dann geht die von bastla angeführte Lösung nicht. Dann müsstest du die Variable wieder manuell vor dem Aufruf von :ProcessPath setzen. Folgendes Beispiel soll das etwas verdeutlichen:
@echo off
FOR /F "tokens=* delims=" %%A IN ('echo.c:\ablage \%%test%%') DO (call :test "%%~A")  
FOR /F "tokens=* delims=" %%A IN ('echo.c:\ablage \%%test%%') DO (set "variable=%%~A"&call :test1)  
goto :end
:test
set "variable=%~1"  
set variable
goto :eof
:test1
set variable
goto :eof
:end
Der Echo-Befehl soll simulieren, dass in deiner INI-Datei ein solcher Pfad steht.
bastla
bastla 16.01.2009 um 12:18:52 Uhr
Goto Top
@Ren
Danke für's Mitdenken - ich war ja gerade erst dabei, Überzeugungsarbeit zu leisten ... face-wink

Eine Anmerkung zu Deiner "FOR"-Zeile: Sowohl "tokens=*" als auch das "echo" fallen eigentlich unter Luxus:
FOR /F "delims=" %%A IN ("c:\ablage \%%test%%") DO ...
Grüße
bastla
BBUser
BBUser 16.01.2009 um 22:17:27 Uhr
Goto Top
Danke für eure hilfe face-smile

Ich gehe erstmal davon aus, das die Nutzer in unserem Netz keine % in den Pfaden verwenden. Einen anderen Vorteil, als die Kompatibiltät mit Pfadnamen dieser Art, hätte es ja nicht, oder? Evtl. blicke ich das auch nach dem Arbeitstag nicht so schnell ;)

Mal etwas anderes zu dem Script, auch wenn das vllt. in ein eigenes Thema gehört (Möchte ungern gleich so viele Themen öffnen).

Ich prüfe vor dem Backup ob das System mit dem Netzwerk verbunden ist.

das mache ich z.B. so:

:CHECKLOGONSERVER
For /F "tokens=2 Delims=:" %%i in ('set^|Find /i "LOGONSERVER"') Do @set LOGONSERVER=%%i
set LOGONSERVER=%LOGONSERVER:\=%
PING -n 3 %LOGONSERVER%|find "Reply from " >NUL
IF NOT ERRORLEVEL 1 goto :CHECKDNSSERVER
IF ERRORLEVEL 1 goto :FAILURE

:CHECKDNSSERVER
For /F "tokens=2 Delims=:" %%i in ('ipconfig /all^|Find /i "DNS"') Do @set DNSSERVER=%%i
ping -n 1 %DNSSERVER%|find "Reply from " >NUL
IF NOT ERRORLEVEL 1 GOTO :CHECKGATEWAY
IF ERRORLEVEL 1 GOTO :FAILURE

:CHECKGATEWAY
:: Asuming the user has the defined gateway only at his local office
For /F "tokens=2 Delims=:" %%i in ('ipconfig /all^|Find /i "Standardgateway"') Do @set CURRENT_GATEWAY=%%i
IF "%MYHOME_GATEWAY%"=="%CURRENT_GATEWAY%" GOTO :CHECKOUTLOOK


Für das testen hier zu hause sind DNS Server und Logon Server deaktiviert, aber das Gateway möchte ich prüfen. Myhome Gateway kommt aus einer ini.
Das dumme ist nun, ich habe hier verschiedene Netzwerkkarten u.a. Vmware Adapter im System (Vista), welche natürlich alle ein Gateway haben. Es ist aber nur ein Adapter derzeit wirklich aktiv. Mit einer Karte unter Win2000 funktioniet das super. Aber jetzt bekomme ich gar nichts für die Variable.
Einfach gefragt, wie komme ich an das Standardgateway dieses einen Adapters? Ist das möglich? Google etc. ergaben bisher keine Erleuchtung.

Gruß

P.S. Ich würde meinen Code auch gerne so formatieren wie ihr ;)