d3ns007
Goto Top

Wie kann man in einer Batch Dateien miteinander vergleichen?

Folgendes Szenario: Dateien (Dateinamen) sollen miteinander verglichen werden die unter verschiedenen Pfaden zu finden sind. Danach sollen Dateien die im Verzeichniss A und B zu finden sind aus A rausgelöscht werden. Alle anderen Dateien sollen von A nach B kopiert werden.

Ich hab mir gedacht das eine If-Anweisung hier am sinnvollsten ist. Leider kenne ich die Syntax nicht und weiß auch nicht wie man sagt "DU Datei 12345.mdb aus Verzeichnis A vergleiche dich mit allen *.mdb im Verzeichnis B"

Könnt Ihr mir auf die Sprünge helfen?
Dazu hier mein eigentlicher Quellcode:

(Es sollen damit Dateien in Ziparchive komprimiert werden)

@Echo off

set source="D:\Module\Zip-Archive"  

Pushd "%source%"  
For /F "Delims=" %%A in ('Dir /B/A-D "D:\Module\Zip-Archive\01-*.mda"') Do call :ZipIt "%%~fA"  
Popdrem
Del "D:\Module\Zip-Archive\01-*.mda"  
Goto :Eof
:ZipIt
Set "Zip=%~n1"  
Set "Zip=%archive%%Zip:~0,9%.zip"  
"C:\Program Files\7-Zip\7z.exe" u "%Zip%"  %1  



Vielen Dank im voraus
D3ns!007

Content-Key: 121040

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

Ausgedruckt am: 29.03.2024 um 13:03 Uhr

Mitglied: bastla
bastla 22.07.2009 um 11:12:13 Uhr
Goto Top
Hallo D3ns!007!

Die Anforderung "DU Datei 12345.mdb aus Verzeichnis A vergleiche dich mit allen *.mdb im Verzeichnis B" ließe sich (gleich für alle ".mdb" des %source%-Verzeichnisses) ungetestet etwa so umsetzen:
@echo off & setlocal
set "source=D:\Module\Zip-Archive"  
set "dest=D:\Archive"  
set "ext=mdb"  

for %%i in ("%source%\*.%ext%") do (  
    set dupe=
    echo Vergleiche %%i
    for %%a in ("%dest%\*.%ext%") do fc /b "%%i" "%%a">nul && set dupe=true  
    if defined dupe echo del "%%i"  
)
REM Verbliebene Dateien kopieren
REM copy "%source%\*.%ext%" "%dest%"  
Für ein entspanntes Testen steht vor dem "del" noch ein "echo", damit der Löschbefehl nur angezeigt wird ...

Grüße
bastla
Mitglied: D3ns007
D3ns007 22.07.2009 um 11:29:50 Uhr
Goto Top
Hallo bastla,
also das Script vergleicht fröhlich vor sich hin. Nur gibt es da ein Problem.
Es sollen jeden Tag ungefähr 1000 Dateien so verglichen werden und das dauert bei knappen 20 Testdateien schon ganz schön lange. Kann man das beschleunigen?

Aber Danke natürlich für die schnelle Hilfe!

Bisher zeig die Console an das die Dateien verglichen werden...

Grüße
Dens!007
Mitglied: bastla
bastla 22.07.2009 um 11:39:17 Uhr
Goto Top
Hallo D3ns!007!

Da jede Datei mit jeder anderen verglichen werden muss, dauert das natürlich ... face-sad

Flotter wären auf Derartiges spezialisierte Tools (als ein Beispiel etwa CloneSpy) - wieweit sich diese aber autmatisieren lassen, habe ich noch nie untersucht ...

Grüße
bastla
Mitglied: 76109
76109 22.07.2009 um 12:02:05 Uhr
Goto Top
Hallo zusammen!

Eventuell könnte man den Vergleich ja auf den Datei-Namen, Größe und DateLastModified beschränken.

Gruß Dieter
Mitglied: D3ns007
D3ns007 22.07.2009 um 13:23:43 Uhr
Goto Top
Ja genau so hatte ich mir das auch schon überlegt... aber Wie?
Ein Vergleich des DAteinamens würde mir schon ausreichen.
Mitglied: bastla
bastla 22.07.2009 um 13:30:01 Uhr
Goto Top
Hallo D3ns!007 und didi1954!

Soferne die Dateigröße als Kriterium taugt, etwa mit folgender neuen Zeile 9:
for %%a in ("%dest%\*.%ext%") do if %%~zi eq %%~za fc /b "%%i" "%%a">nul && set dupe=true
[Edit] Zu spät gesehen ...
Ein Vergleich des DAteinamens würde mir schon ausreichen.
In diesem Fall:
if exist "%dest%\%%~nxi" do fc /b "%%i" "%dest%\%%~nxi">nul && set dupe=true
oder ohne Vergleich des Inhaltes:
if exist "%dest%\%%~nxi" do set dupe=true
[/Edit]

Grüße
bastla
Mitglied: D3ns007
D3ns007 22.07.2009 um 13:33:02 Uhr
Goto Top
Kann man einen Vergleich des Namens auch noch realisieren?

Und gibt es ein paar Einschlägige Seiten auf denen man Übungsmaterial zu diesen Scripts findet?
=> Hatte bisher nicht das gefundne was ich mir vorstelle.

Grüße
D3ns!007
Mitglied: D3ns007
D3ns007 22.07.2009 um 13:57:57 Uhr
Goto Top
Das Script ist jetzt bei weitem schneller wie vorher nur löscht es die Dateien die überprüft wurden und nach "Dest" kopiert wurden nicht aus der "Source" raus.

Nachdem der Vergleich gemacht wurde soll ja entsprechend entweder gelöscht werden oder kopiert und gelöscht werden.

Wisst Ihr da vielleicht Rat?

Der Quelltext bisher sieht so aus:


@echo off & setlocal
set "source=C:\Test\Source"  
set "dest=C:\Test\Dest"  
set "ext=mda"  

for %%i in ("%source%\*.%ext%") do (  
set dupe=
echo Vergleiche %%i
for %%a in ("%dest%\*.%ext%") do if exist "%dest%\%%~nxi" do fc /b "%%i" "%dest%\%%~nxi">nul && set dupe=true  
if defined dupe echo del "%%i"  
)
REM Verbliebene Dateien kopieren
copy "%source%\*.%ext%" "%dest%"  



Pushd "%dest%"  
For /F "Delims=" %%A in ('Dir /B/A-D "%dest%\*.%ext%"') Do call :ZipIt "%%~fA"  
Popdrem
Del "%dest%\*.%ext%"  
Goto :Eof
:ZipIt
Set "Zip=%~n1"  
Set "Zip=%archive%%Zip:~0,9%.zip"  
"C:\Program Files\7-Zip\7z.exe" u "%Zip%"  %1  


Grüße
D3ns!007
Mitglied: bastla
bastla 22.07.2009 um 14:08:53 Uhr
Goto Top
Hallo D3ns!007!

Eigentlich sollte es ja genügen, die Nicht-Duplikate zu kopieren und am Ende alle Dateien zu löschen, daher neue Zeile 11:
if not defined dupe copy "%%i" "%dest%"
und neue Zeile 14
del "%source%\*.%ext%"
Als Zeile 10 sollte übrigens genügen:
if exist "%dest%\%%~nxi" do fc /b "%%i" "%dest%\%%~nxi">nul && set dupe=true
Die obigen Zeilen sind (da kein "echo" vor dem "del" verwendet wurde) "scharf" geschaltet und löschen tatsächlich.

Grüße
bastla
Mitglied: D3ns007
D3ns007 22.07.2009 um 17:23:07 Uhr
Goto Top
Danke für die Hilfe!

Problem wurde gelöst...
Grüße
D3ns!007