Gewisse Ordner kopieren und relativen Pfad erhalten. Wie?
Hallo,
Ich habe gerade angefangen ein bisschen mit batch zu programmieren (schon eine ziemliche Umstellung von C),
und bin dabei auf euer Forum gestoßen. Sind wirklich gute Tipps zu finden, leider passte noch keiner genau auf
mein Problem.
Also, ich habe zwei Ordner (z.B old und new). Im Ordner old befinden sich ältere Programmdateien, sowie Lokalisierungsordner,
im Ordner new die neuen Programmdateien. Die Struktur von old und new sieht folgendermaßen aus:
old
|---ordner1
| |---programmordner
| |---lokalisierungsordner
|---ordner2
| |---programmordner
| |---lokalisierungsordner
Die Lokalisierungsordner haben immer den gleichen Namen.
Ziel ist es alle Lokalisierungsordner mitsamt Pfad in den Ordner new zu kopieren, damit dort die Lokalisierung auch vorhanden ist.
Habe nun schon die folgende Batch-Datei geschrieben:
Das Problem ist nun, dass ich dieses skript nur in einer gewissen ordnertiefe ausführen kann (siehe tokens).
Ich habe schon versucht die strings in list.txt mit dem Set Befehl zu bearbeiten, um relative Pfade zu bekommen, hat
aber nicht funktioniert, da ich innerhalb des Set Befehls (z.B SET var=%%%a:%STR%=%) Variablen verwenden muss,
was er offensichtlich gar nicht mag.
Ich hoffe das war einigermaßen verständlich erklärt und mir kann jemand helfen.
Grüße
Ich habe gerade angefangen ein bisschen mit batch zu programmieren (schon eine ziemliche Umstellung von C),
und bin dabei auf euer Forum gestoßen. Sind wirklich gute Tipps zu finden, leider passte noch keiner genau auf
mein Problem.
Also, ich habe zwei Ordner (z.B old und new). Im Ordner old befinden sich ältere Programmdateien, sowie Lokalisierungsordner,
im Ordner new die neuen Programmdateien. Die Struktur von old und new sieht folgendermaßen aus:
old
|---ordner1
| |---programmordner
| |---lokalisierungsordner
|---ordner2
| |---programmordner
| |---lokalisierungsordner
Die Lokalisierungsordner haben immer den gleichen Namen.
Ziel ist es alle Lokalisierungsordner mitsamt Pfad in den Ordner new zu kopieren, damit dort die Lokalisierung auch vorhanden ist.
Habe nun schon die folgende Batch-Datei geschrieben:
dir *407 /s /a d /B >> list.txt
for /f "tokens=5* delims=\" %%a in (list.txt) do (
xcopy %%a\%%b newdir\%%b /I /H /E /Y
)
Das Problem ist nun, dass ich dieses skript nur in einer gewissen ordnertiefe ausführen kann (siehe tokens).
Ich habe schon versucht die strings in list.txt mit dem Set Befehl zu bearbeiten, um relative Pfade zu bekommen, hat
aber nicht funktioniert, da ich innerhalb des Set Befehls (z.B SET var=%%%a:%STR%=%) Variablen verwenden muss,
was er offensichtlich gar nicht mag.
Ich hoffe das war einigermaßen verständlich erklärt und mir kann jemand helfen.
Grüße
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 122870
Url: https://administrator.de/forum/gewisse-ordner-kopieren-und-relativen-pfad-erhalten-wie-122870.html
Ausgedruckt am: 23.12.2024 um 06:12 Uhr
9 Kommentare
Neuester Kommentar
Servus,
warum "so" umständlich?
sollte doch das gleiche bringen?
Gruß
warum "so" umständlich?
xcopy quelle\*407 ziel\ /I /H /E /Y
sollte doch das gleiche bringen?
Gruß
Hallo ADiewi und willkommen im Forum!
Grüße
bastla
hat aber nicht funktioniert, da ich innerhalb des Set Befehls (z.B SET var=%%%a:%STR%=%) Variablen verwenden muss, was er offensichtlich gar nicht mag.
Daran scheitert's erst später (außer Du verwendest zusätzlich ein "call") - zunächst einmal kannst Du für Schleifenvariablen keine Ersetzungen vornehmen (und, ganz nebenbei, auch keine Teilstrings bilden), daher zunächst in eine "gewöhnliche" Variable übertragen:@echo off & setlocal
set "Quelle=D:\Ordner 1\Ordner 2\Ordner 3\old"
set "Ziel=D:\Neuer Ordner1\Neuer Ordner2\new"
for /f "delims=" %%a in ('dir /s /b /ad "%Quelle%\*407"') do call :ProcessDir "%%a"
goto :eof
:ProcessDir
set "Absolut=%~1"
call set "Relativ=%%Absolut:%Quelle%\=%%"
xcopy /e /h /y %1 "%Ziel%\%Relativ%\">nul
goto :eof
bastla
Hallo ADiewi!
Dem Unterprogramm "ProcessDir" musst Du noch den vollständigen Pfad zum jeweiligen Ordner übergeben, aber Du kannst ja die Zerlegung dann für %Relative% vornehmen ...
... was dann etwa so aussehen könnte:
[Edit] Voraussetzung ist allerdings, dass sich der zu zerlegende Teil am Anfang des Relativpfades befindet ... [/Edit]
Grüße
bastla
Dem Unterprogramm "ProcessDir" musst Du noch den vollständigen Pfad zum jeweiligen Ordner übergeben, aber Du kannst ja die Zerlegung dann für %Relative% vornehmen ...
... was dann etwa so aussehen könnte:
for /f "tokens=1* delims=\" %%a in ("%Relative%") do for /f "tokens=1,2 delims=_" %%i in ("%%a") do set "TargetAbsolute=%Target%\%%i_%%j\%%b\"
Grüße
bastla
Hallo ADiewi!
Das könnte mit dem folgenden (ungetesteten) Unterprogramm gehen:
Das Einbeziehen des "_" in die Variable %Version% ist zwar nicht ganz sauber, verkürzt das Ganze aber, da ansonsten vorweg geprüft werden müsste, ob es im behandelten "Packet (inkl. Version)"-Ordnernamen tatsächlich einen "_" gibt ...
... wäre dies allerdings als sicher anzunehmen, dann besser so:
Grüße
bastla
Das könnte mit dem folgenden (ungetesteten) Unterprogramm gehen:
:ProcessDir
set "Absolute=%~1"
call set "Relative=%%Absolute:%Source%\=%%"
for /f "delims=_" %%i in ("%Relative%") do set "Packet=%%i"
set "Version="
for /f "tokens=1* delims=_" %%i in ('dir /b /ad "%Target%\%Packet%_*.*"') do set "Version=_%%j"
for /f "tokens=1* delims=\" %%i in ("%Relative%") do set "TargetAbsolut=%Target%\%Packet%%Version%\%%j\"
xcopy /e /h /y %1 "%TargetAbsolute%\">nul
goto :eof
... wäre dies allerdings als sicher anzunehmen, dann besser so:
:ProcessDir
set "Absolute=%~1"
call set "Relative=%%Absolute:%Source%\=%%"
for /f "delims=_" %%i in ("%Relative%") do set "Packet=%%i"
for /f "tokens=1* delims=_" %%i in ('dir /b /ad "%Target%\%Packet%_*.*"') do set "Version=%%j"
for /f "tokens=1* delims=\" %%i in ("%Relative%") do set "TargetAbsolut=%Target%\%Packet%_%Version%\%%j\"
xcopy /e /h /y %1 "%TargetAbsolute%\">nul
goto :eof
Grüße
bastla