Batch zum Synchronisieren von Ordnerstrukturen bzw. pfade auslesen
Hallo Leute,
ist mein erster Eintrag bei euch in diesem wirklich informativen Forum. Habe bereits sehr viel von den Tutorials und Beiträgen ralisieren können aber nun komm ich leider nicht wirklich weiter und benötige eure Hilfe.
Ich arbeite gerade an einem Script welches wie im Betreff angedeutet Ordnerstrukturen und deren Inhalte synchronisieren soll.
Hintergrund:
Für Silentinstall soll von einem Installshare nur das notwendige auf eine lokale Platte um dann eine CD/DVD zu brennen (für Clients ausser Haus)
In den zu synchronisierenden Ordnern liegt eine Datei copy.txt zusätzlich sollen Dateien unter dem Ordner auch kopiert werden
Erste Anforderung die Ordner nach der Datei auszulesen und diese zu synchronisieren ist kein Problem gewesen
z.B:
set source=\\server\share\apps
set destination=d:\silentinstall\apps
set searchstr=copy.txt
for /f %%i in ('dir "%source%" /A:d /b /s') do if exist %%i\%searchstr% for /f "tokens=1,2* delims=\" %%j in ("%%i") do echo %%l>>%destination%\log.txt & %programfiles%\robocopy %%i %destination%\%%l /MIR /r:2 & del %destination%\%%l\%searchstr%
Ist etwas lang aber funktioniert.
Nun muss ich zusätzlich die Dateien in übergeordneten Ordner mitkopieren
Beispiel
Ordner: \\server\share\apps\adobe\reader\7.0
dateien \\server\share\apps\adobe\installreader.cmd
Jezt dachte ich mir ich schreibe alle zu kopierenden Ordner in eine Datei
for /d /r %source% %%i in (*) do if exist %%i\%searchstr% echo %%i>>success.log
Dann möchte ich die Zeilen auslesen und den Pfad um eine Ebene kürzen
z.B.:
\\server\share\silentinstall\apps\adobe\reader\7.0
auf
\\server\share\silentinstall\apps\adobe\reader
um dann die Datei (en) zu kopieren
Leider finde ich nur die Funktion um einen String von links nach rechts zu kürzen
set %var%=%var:*\=%
Frage:
gibt es auch irgend eine Möglichkeit um die Variable genauso von rechts nach links bis zu einem Trennzeichen zu kürzen?
wenn nicht gibt es eine andere Möglichkeit und den Ordner un eine Ebene zu kürzen?
Hoffe ich habe nicht zu ausführlich beschrieben aber ich dachte der Hintergrund wird immer wieder erfragt dann stell ich ihn gleich rein :o)
Vielen Dank
schöne Grüße
normi
ist mein erster Eintrag bei euch in diesem wirklich informativen Forum. Habe bereits sehr viel von den Tutorials und Beiträgen ralisieren können aber nun komm ich leider nicht wirklich weiter und benötige eure Hilfe.
Ich arbeite gerade an einem Script welches wie im Betreff angedeutet Ordnerstrukturen und deren Inhalte synchronisieren soll.
Hintergrund:
Für Silentinstall soll von einem Installshare nur das notwendige auf eine lokale Platte um dann eine CD/DVD zu brennen (für Clients ausser Haus)
In den zu synchronisierenden Ordnern liegt eine Datei copy.txt zusätzlich sollen Dateien unter dem Ordner auch kopiert werden
Erste Anforderung die Ordner nach der Datei auszulesen und diese zu synchronisieren ist kein Problem gewesen
z.B:
set source=\\server\share\apps
set destination=d:\silentinstall\apps
set searchstr=copy.txt
for /f %%i in ('dir "%source%" /A:d /b /s') do if exist %%i\%searchstr% for /f "tokens=1,2* delims=\" %%j in ("%%i") do echo %%l>>%destination%\log.txt & %programfiles%\robocopy %%i %destination%\%%l /MIR /r:2 & del %destination%\%%l\%searchstr%
Ist etwas lang aber funktioniert.
Nun muss ich zusätzlich die Dateien in übergeordneten Ordner mitkopieren
Beispiel
Ordner: \\server\share\apps\adobe\reader\7.0
dateien \\server\share\apps\adobe\installreader.cmd
Jezt dachte ich mir ich schreibe alle zu kopierenden Ordner in eine Datei
for /d /r %source% %%i in (*) do if exist %%i\%searchstr% echo %%i>>success.log
Dann möchte ich die Zeilen auslesen und den Pfad um eine Ebene kürzen
z.B.:
\\server\share\silentinstall\apps\adobe\reader\7.0
auf
\\server\share\silentinstall\apps\adobe\reader
um dann die Datei (en) zu kopieren
Leider finde ich nur die Funktion um einen String von links nach rechts zu kürzen
set %var%=%var:*\=%
Frage:
gibt es auch irgend eine Möglichkeit um die Variable genauso von rechts nach links bis zu einem Trennzeichen zu kürzen?
wenn nicht gibt es eine andere Möglichkeit und den Ordner un eine Ebene zu kürzen?
Hoffe ich habe nicht zu ausführlich beschrieben aber ich dachte der Hintergrund wird immer wieder erfragt dann stell ich ihn gleich rein :o)
Vielen Dank
schöne Grüße
normi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 79706
Url: https://administrator.de/forum/batch-zum-synchronisieren-von-ordnerstrukturen-bzw-pfade-auslesen-79706.html
Ausgedruckt am: 22.04.2025 um 12:04 Uhr
5 Kommentare
Neuester Kommentar
Hi normi,
innerhalb des Batches mit
@for /F "tokens=*" %%i in (success.log) do cscript //nologo pfad.vbs %%i
und ein kleines VB-Script "Pfad.vbs"
Set objArgs = Wscript.Arguments
parameter = Split(objArgs(0), "\", -1, 1)
For Each name in parameter
path = path & name & "\"
laenge = len(name)
Next
ausgabe = left(path, len(path)-(laenge+2))
wscript.echo ausgabe
Gruß
Stefan
innerhalb des Batches mit
@for /F "tokens=*" %%i in (success.log) do cscript //nologo pfad.vbs %%i
und ein kleines VB-Script "Pfad.vbs"
Set objArgs = Wscript.Arguments
parameter = Split(objArgs(0), "\", -1, 1)
For Each name in parameter
path = path & name & "\"
laenge = len(name)
Next
ausgabe = left(path, len(path)-(laenge+2))
wscript.echo ausgabe
Gruß
Stefan
Moin normi3053,
alternativ könntest Du mit den FOR -"%~"-Variablen den Pfad kürzen.
Ich empfehle, die UNC-\\-Zeichen so wie dargestellt kurzzeitig rauszunehmen aus der %~pi-Auflösung.
Die CMD.exe versucht sonst wirklich, einen Pfad "\\server\share.." zu finden - das dauert unnötig lange.
Grüße
Biber
alternativ könntest Du mit den FOR -"%~"-Variablen den Pfad kürzen.
(=13:08:16 D:\temp=)
>for /f %i in ("%instpfadalt:\\=%") do @echo %i
server\share\silentinstall\apps\adobe\reader\7.0
(=13:09:39 D:\temp=)
>for /f %i in ("c:\%instpfadalt%") do @echo set "instpfadminus1=\%~pi"
set "instpfadminus1=\\server\share\silentinstall\apps\adobe\reader\"
Ich empfehle, die UNC-\\-Zeichen so wie dargestellt kurzzeitig rauszunehmen aus der %~pi-Auflösung.
Die CMD.exe versucht sonst wirklich, einen Pfad "\\server\share.." zu finden - das dauert unnötig lange.
Grüße
Biber
@stbewo
Um eine zusätzliche Datei einzusparen, verwende ich gerne aus dem Batch heraus erstellte temporäre VBScripts und formuliere diese etwas knapper, zB
Anmerkung: Biber's Empfehlung folgend zum Testen ebenfalls nur "server\..." anstatt "\\server\..."
Grüße
bastla
Um eine zusätzliche Datei einzusparen, verwende ich gerne aus dem Batch heraus erstellte temporäre VBScripts und formuliere diese etwas knapper, zB
...
set "instpfadalt=server\share\silentinstall\apps\adobe\reader\7.0"
...
set "C=%temp%\CutPath.vbs"
echo Pfad=WScript.Arguments(0):WScript.Echo Left(Pfad,InStrRev(Pfad,"\")-1)>%C%
for /f "delims=" %%i in ('cscript //nologo %C% "%instpfadalt%"') do set "instpfadminus1=%%i"
del %C%
Grüße
bastla