Batch Dateivergleich: Pfad auslesen
Hallo,
ich bin neu hier, grüße also alle; ich habe ein Batch-Problem, mit dem ich trotz langer Googelei einfach nicht weiter komme.
Was ich möchte:
-> Dateivergleich in zwei Laufwerken ("Quelle" und "Ziel"); wenn eine Datei fehlt, soll sie kopiert werden.
Ich schaffe es, ein Batch zu schreiben, das dieses schafft - allerdings nur, solange ich statisch fixe Quell- und Ziellaufwerke habe.
Beispiel: Unter einem Laufwerkspfad (z. B. "D:\Ordner1\Ordner2\" als "Stamm"; 'Set Source') liegen Dateien in verschiedenen weiteren Unterordnern. Der "Stamm" ist also bekannt, die weiteren Unterordner wechseln. Deswegen möchte ich in eine Variable diese weiteren Pfade schreiben, so dass ich am Ende habe:
"Quelle": %Source%%[Pfadvariable]%%Dateiname%
In den unten eingestellten Codes bekomme ich aber als %%~pi immer nur "C:\Windows\System32\" heraus, der Dateiname wird perfekt gefunden.
Codeversuch 1:
Set Source=E:\AAA_Test\Quelle\
Set Target=E:\AAA_Test\Ziel\
for /f "delims=" %%i in ('dir /b/a-d "%Source%" %cd%') do (
echo i: %%i; Pfada: %%~di; Pfadb: %%~pi; Pfadb: %%~ni
pause
)
echo i: Dok3.doc (korrekt)
echo Pfada: C: (muss "E:" lauten)
echo Pfadb: \Windows\System32\ (muss gleich Variable "Source" lauten)
echo Pfadc: Dok3 (korrekt)
Ein "Set Datei"%%i" funktioniert nicht, das Echo ist "NULL", also nichts.
Ich dachte, ich probiers mal ohne Klammern nach 'do':
for /f "delims=" %%i in ('dir /b/a-d "%Source%" "%cd%" ') do set "Name=%%~dpi"
echo Name: %Name%;
pause
echo Name: C:\Windows\System32\
Ich habe noch mehr ausprobiert, komme aber einfach nicht auf das korrekte Verzeichnis (E:\AAA_Test\Quelle). Was also muss man tun, damit als Suchergebnis der korrekte Pfad - gerne auch mit der Datei plus Endung hinten dran - herauskommt? Damit komme ich dann klar, denke ich. Danke für eure Hilfe; ich weiß, ich bin nicht so supergut beim Batchschreiben - daher würde ich mich über detaillierte Codes freuen.
Danke schon mal an alle Helferinnen und Helfer!
ich bin neu hier, grüße also alle; ich habe ein Batch-Problem, mit dem ich trotz langer Googelei einfach nicht weiter komme.
Was ich möchte:
-> Dateivergleich in zwei Laufwerken ("Quelle" und "Ziel"); wenn eine Datei fehlt, soll sie kopiert werden.
Ich schaffe es, ein Batch zu schreiben, das dieses schafft - allerdings nur, solange ich statisch fixe Quell- und Ziellaufwerke habe.
Beispiel: Unter einem Laufwerkspfad (z. B. "D:\Ordner1\Ordner2\" als "Stamm"; 'Set Source') liegen Dateien in verschiedenen weiteren Unterordnern. Der "Stamm" ist also bekannt, die weiteren Unterordner wechseln. Deswegen möchte ich in eine Variable diese weiteren Pfade schreiben, so dass ich am Ende habe:
"Quelle": %Source%%[Pfadvariable]%%Dateiname%
In den unten eingestellten Codes bekomme ich aber als %%~pi immer nur "C:\Windows\System32\" heraus, der Dateiname wird perfekt gefunden.
Codeversuch 1:
Set Source=E:\AAA_Test\Quelle\
Set Target=E:\AAA_Test\Ziel\
for /f "delims=" %%i in ('dir /b/a-d "%Source%" %cd%') do (
echo i: %%i; Pfada: %%~di; Pfadb: %%~pi; Pfadb: %%~ni
pause
)
echo i: Dok3.doc (korrekt)
echo Pfada: C: (muss "E:" lauten)
echo Pfadb: \Windows\System32\ (muss gleich Variable "Source" lauten)
echo Pfadc: Dok3 (korrekt)
Ein "Set Datei"%%i" funktioniert nicht, das Echo ist "NULL", also nichts.
Ich dachte, ich probiers mal ohne Klammern nach 'do':
for /f "delims=" %%i in ('dir /b/a-d "%Source%" "%cd%" ') do set "Name=%%~dpi"
echo Name: %Name%;
pause
echo Name: C:\Windows\System32\
Ich habe noch mehr ausprobiert, komme aber einfach nicht auf das korrekte Verzeichnis (E:\AAA_Test\Quelle). Was also muss man tun, damit als Suchergebnis der korrekte Pfad - gerne auch mit der Datei plus Endung hinten dran - herauskommt? Damit komme ich dann klar, denke ich. Danke für eure Hilfe; ich weiß, ich bin nicht so supergut beim Batchschreiben - daher würde ich mich über detaillierte Codes freuen.
Danke schon mal an alle Helferinnen und Helfer!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 556529
Url: https://administrator.de/forum/batch-dateivergleich-pfad-auslesen-556529.html
Ausgedruckt am: 04.04.2025 um 05:04 Uhr
7 Kommentare
Neuester Kommentar
Zitat von @icepick1661:
Was ich möchte:
-> Dateivergleich in zwei Laufwerken ("Quelle" und "Ziel"); wenn eine Datei fehlt, soll sie kopiert werden.
Was ich möchte:
-> Dateivergleich in zwei Laufwerken ("Quelle" und "Ziel"); wenn eine Datei fehlt, soll sie kopiert werden.
Es gibt dazu gut funktionierende fertige Programme. Zum Beispiel "WinMerge". (Ich benutze es. M.W. ist es sogar kostenlos.) Ulrich
Hi!
Warum verwendest du nicht einfach RoboCopy ?
Sind Ordner nicht vorhanden, kümmert sich RC darum diese anzulegen. Die Quelle wird also als Grundgerüst für das Ziel verwendet. Soll es in beide Richtungen sein, dann drehst du Quelle und Ziel einfach um und RC kopiert von B nach A was in A nicht vorhanden ist.
2-Zeiler, Fertig!
Warum verwendest du nicht einfach RoboCopy ?
robocopy "quelle" "ziel" /E /S
Sind Ordner nicht vorhanden, kümmert sich RC darum diese anzulegen. Die Quelle wird also als Grundgerüst für das Ziel verwendet. Soll es in beide Richtungen sein, dann drehst du Quelle und Ziel einfach um und RC kopiert von B nach A was in A nicht vorhanden ist.
2-Zeiler, Fertig!
Moin.
schmeisst also nur den Dateinamen und die Erweiterung der enthaltenen Elemente heraus. Die For-Schleife kennt den Pfad fortan nicht mehr.
Du musst entweder zusätzlich /s angeben (dadurch werden jedoch auch alle Elemente in Unterordnern aufgelistet, was ungewünscht sein kann), oder du gibst den Pfad einfach immer mit an.
Gruß Thomas
Zitat von @icepick1661:
In den unten eingestellten Codes bekomme ich aber als %%~pi immer nur "C:\Windows\System32\" heraus, der Dateiname wird perfekt gefunden.
Der Output des dir-Befehls enthält keinen Pfad, wenn man den Schalter /s (rekursive Ausführung) nicht angibt.In den unten eingestellten Codes bekomme ich aber als %%~pi immer nur "C:\Windows\System32\" heraus, der Dateiname wird perfekt gefunden.
dir /b
Du musst entweder zusätzlich /s angeben (dadurch werden jedoch auch alle Elemente in Unterordnern aufgelistet, was ungewünscht sein kann), oder du gibst den Pfad einfach immer mit an.
Set Source=E:\AAA_Test\Quelle
Set Target=E:\AAA_Test\Ziel
for /f "delims=" %%i in ('dir /b/a-d "%Source%" %cd%') do (
echo Quelle= "%Source%\%%i"
echo Ziel= "%Target%\%%i"
)
Gruß Thomas
Zitat von @icepick1661:
Weil es um eine kleinere Abteilung in einem größeren Batch geht, in dem nicht nur Dateivergleiche stattfinden. Außerdem lerne ich ja was dabei.
Weil es um eine kleinere Abteilung in einem größeren Batch geht, in dem nicht nur Dateivergleiche stattfinden. Außerdem lerne ich ja was dabei.
Hm... Wäre es dann nicht sinnvoller sich mit etwas zeitgemäßerer Technologie zu befassen? Etwa Powershell. Das lässt sich auch von einem Batch aus weiter verarbeiten.
Wir haben in unserer Abteilung fast alle Batch-Scripts zu PS adaptiert, weil...
A) Kaum einer der jüngeren Mitarbeiter noch was mit Batch anfangen kann und will
B) auch die alten Hasen die Vorteile von PS erkannt haben und sich sowieso über die Kilometer an sinnlosem Code ärgern
C) mit PS wesentlich mehr, wesentlich einfacher umzusetzen ist
Grüße!