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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 52078
Url: https://administrator.de/contentid/52078
Ausgedruckt am: 19.11.2024 um 20:11 Uhr
24 Kommentare
Neuester Kommentar
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:
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:
und was meinst du mit
nur mit einem kleinen Fehler, dass er fragt Datei
oder Verzeichnis! ;(
grüße
TomTom
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
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 ...
aber zum thema alter datei usw.
http://de.wikibooks.org/wiki/Batch-Programmierung:_Beispiele#Dateiinfor ...
Hi,
also ich habe einfach mal den Code von oben genommen und angepasst:
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
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
)
Grüße
Dani
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?
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
Hallo Webbi1976!
Eigentlich gäbe es ja "fc" zum Vergleichen von Dateien, daher könnte eine Lösung so aussehen:
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
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
- 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
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...
Die einzigen Unterschiede in meiner Variante wären:
- ich hätte genauso die neueste 2007*.xls ermittelt:
...und im zweiten Schritt diese neueste 2007*.xls mit der Aktuell.xls verglichen:
... wobei die verglichenen Strings %~zti [definitiv gleich %~tzi] so was in der Art sind:
Gruss
Biber
diese Strategie wollte ich auch gerade empfehlen.
Dann kann ich mich ja kürzer fassen und lieber was zu Dutum-Uhrzeit-Größe schreiben...
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
)
>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
@Biber
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
diese Strategie wollte ich auch gerade empfehlen.
Inzwischen schaue ich Dir ja schon ne ganze Weile über die Schulter ... - 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
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:
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
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
@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.
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
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
Hallo Webbi1976!
Schuld an den überzähligen Dateien ist die Zeile
Diese Zeile wird ohne Bedingung (also immer) ausgeführt.
Ersetze einfach diese und die vorhergehende "fc-"Zeile durch die eine Zeile
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 ...
Schuld an den überzähligen Dateien ist die Zeile
copy %PFAD%\%Akt% %PFAD%\%jahr%\%jahr%%monat%%tag%.xls
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
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 ...
Hallo Webbi1976!
Versuch es bitte so:
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]
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
Grüße
bastla
[Edit] Existenzprüfung ("if not exist ...") auf Variable umgestellt und noch einige Anführungszeichen ergänzt. [/Edit]
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
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
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!
: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!