icepick1661
Goto Top

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!

Content-Key: 556529

Url: https://administrator.de/contentid/556529

Printed on: April 25, 2024 at 14:04 o'clock

Member: UserUW
UserUW Mar 11, 2020 at 22:32:09 (UTC)
Goto Top
Zitat von @icepick1661:
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
Member: mayho33
mayho33 Mar 12, 2020 at 08:10:43 (UTC)
Goto Top
Hi!

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!
Member: TK1987
Solution TK1987 Mar 12, 2020 updated at 09:51:14 (UTC)
Goto Top
Moin.

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.
dir /b
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.

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
Member: icepick1661
icepick1661 Mar 12, 2020 at 11:31:24 (UTC)
Goto Top
Moin Thomas,

Danke für deine Antwort, das ist die Lösung.

Mit /s hatte ich es eigentlich schon probiert, jetzt nochmal auf deinen Hinweis hin. Aber offenbar noch nicht mit dem oben von dir zitierten Code.

Ich stelle den funktionierenden Code nochmal ein:

Set Source=E:\AAA_Test\Quelle\
Set Target=E:\AAA_Test\Ziel\

for /f "delims=" %%i in ('dir /s/b/a-d "%Source%" %cd%') do (

echo i: %%i; Pfada: %%~di; Pfadb: %%~pi; Pfadb: %%~ni
pause
)

Hinweis an dich: echo Quelle= "%Source%\%%i" geht nicht, weil zwischen %Source% und %%i noch variable Ordnernamen mit Unterordnern in verschiedener Zahl vorkommen - ich müsste also viele "Sources" benennen...

Danke vielmals!
Member: UserUW
UserUW Mar 13, 2020 at 12:33:41 (UTC)
Goto Top
Nur aus Neugierde: Warum ziehst Du es vor, viel Zeit damit kaputt zu machen, Dir einen eigenen Job hinzubasteln, statt ein wirklich rund laufendes, fertiges und dazu auch noch kostenloses Programm zu benutzen?

Ulrich
Member: icepick1661
icepick1661 Mar 13, 2020 at 21:07:53 (UTC)
Goto Top
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.
Member: mayho33
mayho33 Mar 15, 2020 at 15:02:51 (UTC)
Goto Top
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.

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!