christiankarl
Goto Top

Vergleiche den Inhalt von 3 Verzeichnisse anhand des geändert am Datums und lösche die nicht Übereinstimmungen

Hallo,

leider kenne ich mich in Scripten nicht wirklich aus.
Ich habe folgendes Problem, welches ich gerne per VBS/Batch Script lösen möchte:

in 3 verschieden Verzeichnissen kann es vorkommen, dass Dateien von unterschiedlichen Tagen liegen, der Dateiname selber spielt keine Rolle.
Nun möchte ich folgendes herausfinden:
Vergleiche den Inhalt der 3 Verzeichnisse anhand des „geändert am“ Datums und lösche alle Dateien, welche nicht identisch sind.
3 Zeitstempel -> OK
1 oder 2 Zeitstempel nicht vorhanden, lösche entsprechende vorhandene Datei(en)

Besteht hier überhaupt die Möglichkeit eines solchen Vergleiches, wenn ja wie müsste eine solche Datei aussehen?

Gruß
Christian

Content-Key: 206499

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

Printed on: April 24, 2024 at 01:04 o'clock

Member: Endoro
Endoro May 15, 2013 updated at 09:34:25 (UTC)
Goto Top
Hallo Christian,

es sollen nur Zeitstempel "geändert am" verglichen werden?
Wieviele Dateien liegen denn in den Verzeichnissen?

Es könnten also Dateien in allen drei Verzeichnissen gelöscht werden?

Gruss.
Member: christiankarl
christiankarl May 15, 2013 at 10:05:17 (UTC)
Goto Top
Hallo Endoro,
Richtig, alle Dateien in allen Verzeichnissen sollen gegeneinander geprüft werden
und wo der Zeitstempel "geändert am" nicht identisch ist, sollen alle nicht Übereinstimmungen gelöscht werden.

In den jeweiligen Verzeichnissen können maximal 20 Dateien liegen.

Gruß
christian
Member: Endoro
Endoro May 15, 2013 updated at 12:04:52 (UTC)
Goto Top
Das ist eine witzige Aufgabe face-smile
.. deswegen muss ich noch mal über die Logik nachdenken.


Gruss!
Member: christiankarl
christiankarl May 15, 2013 at 13:17:06 (UTC)
Goto Top
Dann bin ich doch mal auf das Ergebnis gespannt face-smile
Member: bastla
bastla May 15, 2013 updated at 14:29:59 (UTC)
Goto Top
Hallo christiankarl!

Meinst Du "Datum" oder "Zeitstempel" (also inkl Uhrzeit)?

Der Dateiname soll ja keine Role spielen - genügt es daher, wenn (zumindest) eine beliebig benannte Datei aus jedem der beiden anderen Ordner das gleiche Änderungsdatum aufweist?

Falls sowohl Datum als auch Uhrzeit in den Vergleich einbezogen werden soll und die Antwort auf die zweite Frage "ja" lautet, könnte das etwa so gehen:
@echo off & setlocal
set "V1=D:\Ordner"  
set "V2=D:\Anderer Ordner"  
set "V3=D:\Ganz anderer Ordner"  
set /a Anz=3

for /L %%i in (1,1,%Anz%) do (
    for /f "tokens=1-2" %%a in ('call dir /a-d "%%V%%i%%"^|findstr /b "[0-3][0-9]\.[0-1][0-9]\."') do >>%temp%\%%i.txt echo %%a %%b  
)

for /L %%i in (1,1,%Anz%) do (
    call pushd "%%V%%i%%"  
    call echo Bearbeite "%%V%%i%%"  
    for /f "delims=" %%f in ('dir /b/a-d') do (  
        set OK=true
        for /L %%j in (1,1,%Anz%) do findstr /lc:"%%~tf" "%temp%\%%j.txt">nul||set "OK="  
        if not defined OK echo del %%f
    )
    popd
)
Wegen des "echo" vor "del" in Zeile 17 läuft der Batch im "Demo"-Modus - es werden die Löschbefehle nur angezeigt, aber nicht ausgeführt ..

Grüße
bastla

P.S.: Da es sich nur um wenige Dateien handelt, dürfte das Vergleichen mit allen 3 Ordnern anstatt nur mit den beiden anderen performancemäßig zu verschmerzen sein ...
Member: Endoro
Endoro May 15, 2013 updated at 15:57:02 (UTC)
Goto Top
Hmmm, ich hab noch überlegt: findstr und Tempdatei oder ... bastla war schlauer face-smile

@echo off&setlocal
set "V1=Verzeichnis1"  
set "V2=Verzeichnis2"  
set "V3=Verzeichnis3"  

for %%i in ("%V1%" "%V2%" "%V3%") do (  
	pushd "%%~i"  
	for %%j in (*) do for /f "tokens=1,2delims=:" %%a in ("%%~tj") do set "$%%~i|%%~j=%%a%%b"&set "#%%~i%%a%%b=%%a%%b"  
	popd
)
for %%i in ("%V1%" "%V2%" "%V3%") do for %%j in ("%V1%" "%V2%" "%V3%") do if "%%~i" neq "%%~j" (  
	for /f "tokens=1-3delims=$|=" %%a in ('set "$%%~i" 2^>nul') do (  
		setlocal enabledelayedexpansion
		set "test=!#%%~j%%~c!"   
		if not defined test (
			endlocal
			echo del "%%a\%%b"  
			set "$%%~a|%%~b="  
		) else endlocal
	)
)

Wenn im Verzeichnis oder Dateinamen "=" oder ":" sind, geht der Code nicht. Die Verzeichnisse können also nur ohne Laufwerk angegeben werden (also zB "\user\dokumente"), warum das so ist konnte ich nicht rausfinden face-smile (Batch halt).

Gruss!
Member: christiankarl
christiankarl May 16, 2013 at 08:50:24 (UTC)
Goto Top
Hallo, ich danke euch beiden für die Hilfe,

eine kleine änderungsanfrage habe ich da aber noch:

besteht die Möglichkeit, bevor die Dateien gelöscht werden, das diese in ein "archiv" zu kopieren,
oder anstatt zu löschen, direkt in ein Archiv zu verschieben

 

set "V1=D:\Ordner"   
set "V2=D:\Anderer Ordner"   
set "V3=D:\Ganz anderer Ordner"   

set "A1=D:\Ordner Archiv"  
set "A2=D:\Anderer Ordner Archiv"   
set "A3=D:\Ganz anderer Ordner Archiv"   
Member: Endoro
Endoro May 16, 2013 at 10:04:30 (UTC)
Goto Top
Hallo christiankarl,

das kannst du eine Zeile über dem "del" Kommando einfügen face-smile

Gruss!
Member: christiankarl
christiankarl May 16, 2013 updated at 10:19:21 (UTC)
Goto Top
Hallo Bastla,

nochmalig danke,

zu deiner Frage: Meinst Du "Datum" oder "Zeitstempel" (also inkl Uhrzeit)?


ich meine nur Datum, keine Uhrzeit

habe aber ein kleines Problem festgestellt:

z.b. Beispiel 1

Verzeichnis1 3 Dateien
12.05
06.05
03.05

Verzeichnis2 2 Dateien
07.05
09.05

Verzeichnis3 0 Dateien

Ergebnis erwartet = 0
Ergebnis erhalten, alle Dateien bleiben im Ordner


Beispiel 2

Verzeichnis1 2 Dateien
12.05
13.05

Verzeichnis2 1 Dateien
12.05

Verzeichnis3 1 Dateien
04.05

Ergebnis erwartet = 0
Ergebnis erhalten, alle Dateien bleiben im Ordner

Keines der Verzeichnisse hat ein Vorrang. Die Verzecihnisse sollen sozusagen Syncronisiert werden, sprich in allen Ordnern sollem immer nur die gleichen Dateien vom Datum her sein.

Vielleicht hilft es, dass in allen Dateien am Ende immer ein Zeitstempel mit im Dateinamen aufgeführt wird. z.b.
test1234_32423_test_20130416-1116171
Member: christiankarl
christiankarl May 16, 2013 at 10:18:18 (UTC)
Goto Top
@ Endoro,
aber dann erfolgt doch noch keine durchführung der archivierung oder?
Member: Endoro
Endoro May 16, 2013 at 18:34:23 (UTC)
Goto Top
Hallo christiankarl,

du kannst den Dateinamen vor dem Löschen abgreifen und die Dateien mit einem Packer deiner Wahl archivieren. Der Rest ist ja sonst erledigt face-smile

Gruss!