Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

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

Frage Entwicklung Batch & Shell

Mitglied: BBUser

BBUser (Level 1) - Jetzt verbinden

15.01.2009, aktualisiert 19:03 Uhr, 5481 Aufrufe, 7 Kommentare

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
Mitglied: bastla
15.01.2009 um 19:25 Uhr
Hallo BBUser!

Es lassen sich zwar, sogar ohne "delayedExpansion", entsprechende Variablen erstellen, etwa:
01.
set /a x=0 
02.
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
Bitte warten ..
Mitglied: BBUser
15.01.2009 um 21:01 Uhr
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
Bitte warten ..
Mitglied: bastla
15.01.2009 um 22:04 Uhr
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:
01.
@echo off & setlocal 
02.
set "Backupvereichnis=E:\Sicherung" 
03.
set "Log=D:\BackupLog.txt" 
04.
 
05.
>>"%Log%" echo Sicherung gestartet am %date% um %time% 
06.
for /f "tokens=2 delims=>" %%i in ('set^|Find "Folder" import.ini') do call :ProcessPath "%%i" 
07.
>>"%Log%" echo Sicherung beendet am %date% um %time% 
08.
echo Fertig. 
09.
goto :eof 
10.
 
11.
:ProcessPath 
12.
set "Pfad=%~1" 
13.
:: irgendwelche Aktionen 
14.
:: 
15.
>>"%Log%" echo Sichere %Pfad% 
16.
xcopy "%Pfad%" "%Backupverzeichnis%" 
17.
:: weitere Aktionen 
18.
:: 
19.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: BBUser
15.01.2009 um 22:26 Uhr
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
Bitte warten ..
Mitglied: Ren
16.01.2009 um 12:06 Uhr
Versuche:
01.
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:
01.
@echo off 
02.
FOR /F "tokens=* delims=" %%A IN ('echo.c:\ablage \%%test%%') DO (call :test "%%~A") 
03.
FOR /F "tokens=* delims=" %%A IN ('echo.c:\ablage \%%test%%') DO (set "variable=%%~A"&call :test1) 
04.
goto :end 
05.
:test 
06.
set "variable=%~1" 
07.
set variable 
08.
goto :eof 
09.
:test1 
10.
set variable 
11.
goto :eof 
12.
:end
Der Echo-Befehl soll simulieren, dass in deiner INI-Datei ein solcher Pfad steht.
Bitte warten ..
Mitglied: bastla
16.01.2009 um 12:18 Uhr
@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:
FOR /F "delims=" %%A IN ("c:\ablage \%%test%%") DO ...
Grüße
bastla
Bitte warten ..
Mitglied: BBUser
16.01.2009 um 22:17 Uhr
Danke für eure hilfe

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 ;)
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...