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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 106191
Url: https://administrator.de/contentid/106191
Ausgedruckt am: 23.11.2024 um 03:11 Uhr
7 Kommentare
Neuester Kommentar
Hallo BBUser!
Es lassen sich zwar, sogar ohne "delayedExpansion", entsprechende Variablen erstellen, etwa:
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
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"
Grüße
bastla
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:
Grüße
bastla
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
bastla
Versuche:
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:
Der Echo-Befehl soll simulieren, dass in deiner INI-Datei ein solcher Pfad steht.
for /f "tokens=1,* delims=:" %%i in ('set^|Find "Folder" import.ini') do :was immer du da machst
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
@Ren
Danke für's Mitdenken - ich war ja gerade erst dabei, Überzeugungsarbeit zu leisten ...
Eine Anmerkung zu Deiner "FOR"-Zeile: Sowohl "tokens=*" als auch das "echo" fallen eigentlich unter Luxus:
Grüße
bastla
Danke für's Mitdenken - ich war ja gerade erst dabei, Überzeugungsarbeit zu leisten ...
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 ...
bastla