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

Printed on: April 16, 2024 at 20:04 o'clock

Member: bastla
bastla Jul 22, 2009 at 09:12:13 (UTC)
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
Member: D3ns007
D3ns007 Jul 22, 2009 at 09:29:50 (UTC)
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
Member: bastla
bastla Jul 22, 2009 at 09:39:17 (UTC)
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 Jul 22, 2009 at 10:02:05 (UTC)
Goto Top
Hallo zusammen!

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

Gruß Dieter
Member: D3ns007
D3ns007 Jul 22, 2009 at 11:23:43 (UTC)
Goto Top
Ja genau so hatte ich mir das auch schon überlegt... aber Wie?
Ein Vergleich des DAteinamens würde mir schon ausreichen.
Member: bastla
bastla Jul 22, 2009 at 11:30:01 (UTC)
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
Member: D3ns007
D3ns007 Jul 22, 2009 at 11:33:02 (UTC)
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
Member: D3ns007
D3ns007 Jul 22, 2009 at 11:57:57 (UTC)
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
Member: bastla
bastla Jul 22, 2009 at 12:08:53 (UTC)
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
Member: D3ns007
D3ns007 Jul 22, 2009 at 15:23:07 (UTC)
Goto Top
Danke für die Hilfe!

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