webbi
Goto Top

Batch Dateien vergleichen per Datum Uhrzeit Größe

Hallo

Ich habe in einem Ordner eine Datei aktuell.xls.
Diese Datei möchte ich nachts umbenennen in:

aktuellJahraktuellMonataktuellTag.xls

Das funktioniert bisher ohne Probleme - nur mit einem kleinen Fehler, dass er fragt Datei
oder Verzeichnis! ;( WARUM AUCH IMMER???

Allerdings gibt es dadurch einen Haufen Dateien.
Jetzt ist meine Idee, dass diese Datei nur dann erstellt wird, wenn
sie sich im Gegensatz zum letzten speichern etwas geändert hat - vielleicht
per Datum, Uhrzeit und Größenänderung???

Bisher habe ich noch nichts gefunden, was mich weiterbringt.

Vielleicht habt ihr eine Idee.

Hier mal mein bisheriges Script:

@echo off:
IF EXIST PFAD\aktuell.xls GOTO start

:start
echo START
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
xcopy PFAD\aktuell.xls PFAD\%jahr%%monat%%tag%.xls

IF EXIST PFAD\%jahr%%monat%%tag%.xls GOTO ende

:ende

Webbi1976

Content-ID: 52078

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

Ausgedruckt am: 19.11.2024 um 20:11 Uhr

Weiricth
Weiricth 19.02.2007 um 15:24:46 Uhr
Goto Top
hi,

also des mit den zwei if abfragen kapier ich erlich gesagt nicht weil es selbst wenn die datei nicht exist ist start trozdem ausführt also müste es so sein:

@echo off:
IF EXIST PFAD\aktuell.xls GOTO start
GOTO ende

:start
echo START
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
xcopy PFAD\aktuell.xls PFAD\%jahr%%monat%%tag%.xls

IF EXIST PFAD\%jahr%%monat%%tag%.xls GOTO ende

:ende


genau so die zweite abfrage ist total unnütz weil er das programm auf jedenfall beendet.

so wäre es wenigstens schon mal syntaktisch richtig:

@echo off:
IF EXIST PFAD\aktuell.xls GOTO start
GOTO ende

:start
echo START
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
xcopy PFAD\aktuell.xls PFAD\%jahr%%monat%%tag%.xls

:ende
echo ENDE

und was meinst du mit

nur mit einem kleinen Fehler, dass er fragt Datei
oder Verzeichnis! ;(


grüße

TomTom
Webbi
Webbi 19.02.2007 um 15:36:22 Uhr
Goto Top
Hallo

Stimmt, die zweite Abfrage ist blödsinn!

Diese Frage erhalte ich:
Ist das Ziel PFAD\20070219.xls ein Dateiname oder ein Verzeichnisname
(D = Datei, V = Verzeichnis)?

Wo liegt da der Hund begraben?

Und wie bekomme ich es hin, dass ich überprüfen kann, ob die aktuell.xls die gleiche Größe und das gleiche Datum / Uhrzeit wie vor drei Tagen hat.

Ich möchte nämlich nicht, dass die Datei gespeichert wird, obwohl in dieser Datei nichts
geändert wurde.

Viele Dank schon mal

Webbi1976
Weiricth
Weiricth 19.02.2007 um 16:01:20 Uhr
Goto Top
das mit dem pfad und der datei ist wenn der pfrag langer ist als (pu must nachlesen, am einfachsten du gehst in das verzeichniss mit cmd rein und dann siehst du den pfad den er braucht mit ~) zeichen ist. Und dann must du "PFAD\DATEI.ENDUNG" in " setzen

aber zum thema alter datei usw.

http://de.wikibooks.org/wiki/Batch-Programmierung:_Beispiele#Dateiinfor ...
Chipy
Chipy 19.02.2007 um 17:46:47 Uhr
Goto Top
Hi,


nim anstatt Xcopy halt nur Copy
dann fragt er nicht nach.
Dani
Dani 19.02.2007 um 18:01:48 Uhr
Goto Top
Hi,
also ich habe einfach mal den Code von oben genommen und angepasst:
@echo off:
IF EXIST "PFAD\aktuell.xls" (  
   set jahr=%date:~-4%
   set monat=%date:~-7,2%
   set tag=%date:~-10,2%
   move "PFAD\aktuell.xls" "PFAD\%jahr%%monat%%tag%.xls" /y  

) 
Mit xcopy kannst du direkt keine Dateien umbennen. Mit Move müsste es gehen. Ansonsten, wie oben schon erwähnt "copy" probieren.


Grüße
Dani
miniversum
miniversum 19.02.2007 um 18:12:09 Uhr
Goto Top
Diese Frage erhalte ich:
Ist das Ziel PFAD\20070219.xls ein Dateiname oder ein Verzeichnisname
(D = Datei, V = Verzeichnis)?

Wo liegt da der Hund begraben?

Daran das du den /i Parameter beim Xcopy nicht hast.

Eigentlich reicht dir ja ne überprüfung ob sich die Datei verändert hat. Also das Änderungsdatum anders ist.
Versuchs mal damit (ungtestet).
for /F "tokens=1,2 delims= " %%f in ('dir /a-D /Tw /-C aktuell.xls^|find "."') do Zeitaktuell=%%f%%g  
for /F "tokens=1,2 delims= " %%f in ('dir /a-D /Tw /-C letzte.xls^|find "."') do Zeitletzte=%%f%%g  
if Zeitaktuell == Zeitletzte rename blabla....

miniversum
Chipy
Chipy 19.02.2007 um 18:35:51 Uhr
Goto Top
Hi,

und hier nach Dateigrösse :

for /f "tokens=3 delims= " %i in ('dir /A-D /N /-C /OD C:\1\wieauchimmer.xls^|find "."') do set Z=%i  
for /f "tokens=3 delims= " %i in ('dir /A-D /N /-C /OD C:\1\unddasauchwieimmer.xls^|find "."') do set Y=%i  
if %z%==%y% copy........
bastla
bastla 19.02.2007 um 20:13:53 Uhr
Goto Top
Hallo Webbi1976!

Eigentlich gäbe es ja "fc" zum Vergleichen von Dateien, daher könnte eine Lösung so aussehen:
@echo off & setlocal
pushd D:\Pfad
set "Akt=aktuell.xls"  
for /f "delims=" %%i in ('dir /b /od *.xls') do if /i "%%i" neq "%Akt%" set "Letzte=%%i"  
fc /b "%Akt%" "%Letzte%" >nul || move /y "%Akt%" "%date:~-4%%date:~-7,2%%date:~-10,2%.xls"  
popd
Ablauf:
- in das Zielverzeichnis wechseln - wenn alle Dateien dort sind (und bleiben sollen), erspart man sich alle weiteren Pfadangaben
- jüngste .xls-Datei (die nicht "aktuell.xls" heißt) mit "dir /od" suchen und deren Namen in der Variablen %Letzte% zwischenspeichern
- wenn "fc" einen Unterschied zwischen der aktuellen und der letzten .xls-Datei feststellt, "aktuell.xls" mit den aktuellen Datumsangaben umbenennen
- zum ursprünglichen Verzeichnis zurückkehren

Anmerkungen:
- Ich verwende aus Sicherheitsgründen relativ viele Anführungszeichen, obwohl dies bei den mir derzeit bekannten Dateinamen (alle ohne Leerstellen) nicht nötig wäre - für ev spätere Änderungen ist damit aber vorgesorgt.
- Falls Du doch nicht die "aktuell.xls" umbenennen, sondern eine Kopie davon ablegen willst, ändere einfach das "move" auf "copy".

Grüße
bastla
Biber
Biber 19.02.2007 um 20:41:59 Uhr
Goto Top
Schade, bastla,

diese Strategie wollte ich auch gerade empfehlen.

Dann kann ich mich ja kürzer fassen und lieber was zu Dutum-Uhrzeit-Größe schreiben... face-wink

Die einzigen Unterschiede in meiner Variante wären:
- ich hätte genauso die neueste 2007*.xls ermittelt:
for /f %%i in ('dir /b /od 2007*.xls') do set newest=%%i"

...und im zweiten Schritt diese neueste 2007*.xls mit der Aktuell.xls verglichen:
 for %%i in (d:\Pfad\Aktuell.xls) do for %%j in (d:\pfad\%newest%)do if "%%~zti" NEQ "%%~tzj" (  
             move d:\Pfad\%%i  d:\Pfad\PFAD\%jahr%%monat%%tag%.xls  /y
)
... wobei die verglichenen Strings %~zti [definitiv gleich %~tzi] so was in der Art sind:
>for %i in (2007*.xls ) do @echo %~zti
08.02.2007 06:34 116201
08.02.2007 06:35 116201
08.02.2007 06:34 116201

Gruss
Biber
bastla
bastla 19.02.2007 um 21:12:33 Uhr
Goto Top
@Biber

diese Strategie wollte ich auch gerade empfehlen.
Inzwischen schaue ich Dir ja schon ne ganze Weile über die Schulter ... face-wink

- ich hätte genauso die neueste 2007*.xls ermittelt:
War auch mein erster Ansatz, weil einfachere Unterscheidung von "aktuell.xls", aber dann wollt' ich's doch möglichst allgemein formulieren.

Sehe ich das übrigens richtig, dass die ganzen "Dateiauswertungsfunktionen" (hier also etwa ~t und ~z) nur auf übergebene Argumente (%1) oder auf Laufvariable aus einem "for" anwendbar sind? Ein "echo %~pDatei%" liefert jedenfalls kein brauchbares Ergebnis ...

Grüße
bastla
Biber
Biber 19.02.2007 um 21:53:43 Uhr
Goto Top
Jepp, bastla,

siehst Du richtig - diese "erweiterte Variablenauflösung" (O-Ton M$) funktioniert nur bei den "dynamischen Variablen" (dito).
Also den Parametervariablen %0...%9 und den 56 Zählvariablen.

Dort allerdings ohne Prüfung auf Existenz der Datei:
>for /f %i in ("B:\Bibers\VirtuellerOrdner") do @echo %~di %~pi %~nxi %~snxi  
B: \Bibers\ VirtuellerOrdner VirtuellerOrdner
:: [ein short filename kann leider nicht gebildet werden; auch %~zi oder %~ti nicht]
:: Und -na ja- ganz wasserdicht ist der Algorithmus auch nicht:
>for /f %i in ("@:\B:i:b:ers\VirtuellerOrdner") do @echo %~di %~pi  
@: \B:i:b:ers\

Aber für Codetester bei M$ gilt ja schon seit 1993 ein Einstellungsstopp, munkelt man/frau.

Um auf den Algorithmus zurückzukommen.... so ganz sinnvoll finde ich den immer noch nicht.

Wenn in der Datei \PFAD\Aktuell.xls der gleiche WasAuchImmer-Stand wie in der Datei 2007-01-01.xls steht, dann ist das Ergebnis der Mimik, dass hinterher in dem Verzeichnis eine Datei Aktuell.xls steht, die identisch mit der 2007-01-01.xls ist.
Das heißt, wenn der Stand derselbe ist wie vorher, habe ich zwei Dateien, von denen eine "Aktuell.xls" heißt.
Wenn die Dateien verschiedene Stände haben, habe ich allerdings hinterher keine Datei "Aktuell.xls", die ich "blind" aufrufen kann. Hmm.
Wenn ich allerdings im Identisch-Fall die Datei Aktuell.xls lösche (will ja keine doppelten Infos), dann kann ich nicht erkennen, wann ich denn das letzte Mal überprüft habe. Hmm.

Gefällt mir nicht wirklich.

Gruss Biber
bastla
bastla 20.02.2007 um 08:53:57 Uhr
Goto Top
@Biber

Am ehesten sinnvoll ist die Vorgangsweise, wenn man von "Versionierung" ausgeht (dann müsste natürlich ein "copy" und kein "move" erfolgen) - die aktuellste Version ist immer "aktuell.xls" und die Vorgängerversionen sind unter dem jeweiligen Datum gespeichert.

Die Redundanz zwischen "aktuell.xls" und der zuletzt davon abgelegten Kopie nehme ich als Preis für die Sicherheit, immer eine "aktuell.xls" vorzufinden.
ganz wasserdicht ist der Algorithmus auch nicht
Ich hätte den Algorithmus ohnehin so interpretiert, dass nur schematisch, ohne Rücksicht auf das eigentlich beschriebene Dateisystemobjekt, zerlegt wird:

Laufwerk = Teil bis zum ersten ":"
Pfad = Teil nach dem ersten ":" bis zum letzten "\"
Dateiname = Teil nach dem letzten "\" und vor dem letzten "."
Dateityp = Teil ab dem letzten "."

auch wenn der letzte Pfadbestandteil ein Verzeichnis ist.

Grüße
bastla
Webbi
Webbi 20.02.2007 um 11:19:43 Uhr
Goto Top
Hallo

Vielen Dank an ALLE!

xcopy habe ich erstmal durch copy ausgetauscht - klappt wunderbar!

Die anderen Vorschläge werde ich jetzt noch ausprobieren!

Webbi1976
Webbi
Webbi 27.04.2007 um 07:15:19 Uhr
Goto Top
Hallo

Hier erstmal der aktuelle Code, den ich habe:

@echo off & setlocal
set "PFAD=G:\Bestand\"
IF EXIST %PFAD%aktuell.xls GOTO start
GOTO ende

:start
echo START
set "PFAD=G:\Bestand\"
set "Akt=aktuell.xls"
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%

for /f %%i in ('dir /b /od %PFAD%%jahr%\*.xls') do set newest=%%i

echo PFAD: %PFAD%
echo Neueste: %newest%

:: pause

for /f "delims=" %%i in ('dir /b /od %PFAD%%jahr%\*.xls') do if /i "%%i" neq "%Akt%" set "Letzte=%%i"

echo Letzte: %Letzte%



copy %PFAD%%Akt% %PFAD%%jahr%\%jahr%%monat%%tag%.xls

echo Aktuelle: %Akt%

:: pause

:ende
echo ENDE

Die aktuell.xls wir ganz korrekt an jedem Abend in das passende Verzeichnis kopiert (natürlich auch mit richitgem Datum) - 2007/04/20070426.xls

Das Problem ist jetzt folgendes:

Die Datei wurde kopiert, obwohl die aktuell.xls das letzte mal am 23.04.2007 geändert wurde. Somit wurde eine Datei am 23. erstellt (KORREKT),
allerdings auch am 24., 25. & 26. (was nicht gemacht werden sollte)!

Habt ihr da eine Idee, wo der Fehler liegt.

Vielen Dank für die Hilfe

Webb1976
bastla
bastla 27.04.2007 um 11:04:34 Uhr
Goto Top
Hallo Webbi1976!

Schuld an den überzähligen Dateien ist die Zeile
copy %PFAD%\%Akt% %PFAD%\%jahr%\%jahr%%monat%%tag%.xls
Diese Zeile wird ohne Bedingung (also immer) ausgeführt.

Ersetze einfach diese und die vorhergehende "fc-"Zeile durch die eine Zeile
fc /b "%Akt%" "%Letzte%" >nul || copy /y %PFAD%\%Akt% %PFAD%\%jahr%\%jahr%%monat%%tag%.xls  
Damit sollte die Kopie dann nur mehr bei veränderter "Aktuell.xls" erstellt werden.

Grüße
bastla

P.S.: Beim Posten bitte für Programmcode die Tags "< code>" und "< /code>" (jeweils ohne Leerstellen nach dem "<") verwenden - dann klappt's auch mit den Backslashes ...
Webbi
Webbi 27.04.2007 um 11:40:56 Uhr
Goto Top
Hallo

Vielen Dank schon mal.

Werde das ändern und nächste Woche berichten.

Webbi1976
Webbi
Webbi 30.04.2007 um 07:41:40 Uhr
Goto Top
Hallo

Leider muss ich berichten, dass die Änderung nichts gebracht hat. Es wurden
übers Wochenende wieder neue Dateien mit dem aktuellen Datum abgelegt,
obwohl die letzte Änderung am 26.04.2007 war.

Webbi
bastla
bastla 30.04.2007 um 09:24:22 Uhr
Goto Top
Hallo Webbi1976!

Versuch es bitte so:
@echo off & setlocal
set "PFAD=G:\Bestand"  
set "Akt=aktuell.xls"  
if not exist "%PFAD%\%Akt%" goto :eof  
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
for /f %%i in ('dir /b /od "%PFAD%\%jahr%\*.xls"') do set newest=%%i  
for /f "delims=" %%i in ('dir /b /od "%PFAD%\%jahr%\*.xls"') do if /i "%%i" neq "%Akt%" set "Letzte=%%i"  
fc /b "%PFAD%\%Akt%" "%PFAD%\%Jahr%\%Letzte%" >nul || copy /y "%PFAD%\%Akt%" "%PFAD%\%jahr%\%jahr%%monat%%tag%.xls" >nul  
Anmerkung: Du hattest in Deiner Fassung kein "pushd" / "popd", weshalb ich jetzt auf jeweils volle Pfadangabe umgestellt habe.

Grüße
bastla

[Edit] Existenzprüfung ("if not exist ...") auf Variable umgestellt und noch einige Anführungszeichen ergänzt. [/Edit]
Webbi
Webbi 04.05.2007 um 09:06:34 Uhr
Goto Top
Hallo

Einfach genial!!! Hat 1a funktioniert!!! face-smile
Dieser Beitrag kann als erfolgreich geschlossen werden.

Eine Frage im allgemeinen hätte ich da aber noch:
Habt Ihr ein paar Links, mit guten Beschreibungen /Beispielen usw. zu den Batchbefehlen.

Vielleicht gibt es ja auch die Möglichkeit hier im Forum so etwas mal bereitzustellen.

Webbi1976

[EDIT] Oder kennt ihr ein gutes Buch???
Biber
Biber 04.05.2007 um 11:06:10 Uhr
Goto Top
Moin Webbi1976,

mein Mod-Schwerpunkt hier im Forum sind eher die prozeduralen, schrittweisen Programmiersprachen.

Mit diesem neumodischen Zeuch wie Objektorientierung, parallelisierte Threads und selbstlernende Klassen kenn ich mich nicht so aus.

Deshalb habe ich jetzt Schwierigkeiten, gleichzeitig Deinen Beitrag zu schließen und die neuen Fragen zu beantworten...*kopfkratz*

Ich entscheide mich mal für die Erfüllung des ersten Wunsches und mach hier dicht.

Zur den Links und Buchempfehlungen:

Es existiert im Bereich "Batch & Shell" eine (noch) relativ überschaubare Linkliste.
Mehr konnte ich auch bisher auf vergleichbare Fragen nicht antworten.
Mehr habe ich auch nicht in meinen virtuellen Schubladen.

Grüße und schönes, vor allem baldiges Wochenende
Biber
Biber
Biber 16.07.2007 um 11:24:56 Uhr
Goto Top
Geschlossenen Beitrag wieder geöffnet wegen Anfrage des Beitragserstellers.

Grüße
Biber
Webbi
Webbi 16.07.2007 um 12:12:05 Uhr
Goto Top
Hallo und Herzlichen Dank an Biber

Hier mal das Script im Ganzen:

@echo off & setlocal
set "PFAD=g:\Bestand\"  
set "Akt=aktuell.xls"  
IF EXIST %PFAD%%Akt% GOTO start
GOTO ende

:start
echo START
set "PFAD=g:\Bestand\"  
set "body=c:\batch\blat\body.txt"  
set "Akt=aktuell.xls"  
set jahr=%date:~-4%
set monat=%date:~-7,2%
set tag=%date:~-10,2%

if not exist "%PFAD%%Akt%" goto :eof  
for /f %%i in ('dir /b /od "%PFAD%%jahr%\*.xls"') do set newest=%%i  
for /f "delims=" %%i in ('dir /b /od "%PFAD%%jahr%\*.xls"') do if /i "%%i" neq "%Akt%" set "Letzte=%%i"  
fc /b "%PFAD%%Akt%" "%PFAD%%jahr%\%Letzte%" >nul || copy /y "%PFAD%%Akt%" "%PFAD%%jahr%\%jahr%%monat%%tag%.xls" >nul  
c:\batch\blat\blat.exe %body% -subject "LISTE" -attach %PFAD%%Akt% -to ich@ich.de -server EMAILSERVER  

:ende
echo ENDE

Funktioniert einwandfrei. Das einzige Problem, was ich jetzt habe, ist, dass die Datei auch versendet wird, wenn sich NICHTS geändert hat.
Das heisst, dass ich die Datei auch am Wochenende erhalte.

Vielen Dank noch mal für die Super Hilfe hier im Forum.
Bin immer wieder gerne hier.

Webbi
50496
50496 16.07.2007 um 12:42:05 Uhr
Goto Top
Ich würde die letzten Zeilen wie folgt ändern:


goto :ende
:Kopieren
copy /y "%PFAD%%Akt%" "%PFAD%%jahr%\%jahr%%monat%%tag%.xls" >nul
c:\batch\blat\blat.exe %body% -subject "LISTE" -attach %PFAD%%Akt% -to ich@ich.de -server EMAILSERVER

:ende
echo ENDE



Ungetestet!
Webbi
Webbi 16.07.2007 um 14:54:29 Uhr
Goto Top
Hallo erstaugust

Super! Funktioniert einwandfrei.

@Biber: Ich denke mal du kannst den Beitrag wieder schliessen!
Vielen Dank noch mal.

Webbi