Batch-Datei die Nach Datums-Kriterium Kopiert, zu einem RAR-Archiv hinzufügt und die nicht archivierten dateien löscht!
Hallo zusammen,
ich hab folgendes Problem...
Ich möchte Monatlich eine kleine Datensicherung auf eine externe USB-Platte machen. Dazu muss ich jedes mal einzeln in die verzeichnisse und die dateien suchen, verzippen und kopieren! Echt nervig! Dann habe ich mir gedacht ich könnte das ganze doch automatisieren und ich hab mich an eine batch gewagt! Naja bin ein absoluter leihe auf diesem Gebiet!
Ich habe mir jetzt schon ein Grundgerüst aufgebaut und mein kleines Programm kopiert dateien von a nach b, verzippt sie und löscht die nicht archivierten Dateien danach wieder! Jetzt fehlt mir noch die Filterung der dateien! in dem Ordner aus dem ich kopieren sind dateien des ganzen jahres vorhanden! ich möchte aber nur den letzten Monat sichern! Wie stelle ich das an? Wie mache ich so eine bedingung!?
Komme echt nicht weiter!
Hier mal mein Code bis jetzt!
@echo OFF
CLS
REM ------------------------------------------------------------
REM Name: copy_rar_del.bat
REM Autor: csl
REM Datum: 06.03.09
REM ------------------------------------------------------------
:: Kopieren der Dateien von a nach b
ECHO Die Datensicherung wird gestartet ..
ECHO.
pause
XCOPY C:\all\*.* C:\Dokume~1\csl\Desktop\test\*.* /V
Echo.
Echo Die Daten wurden gesichert!
:: pause
:: Die Dateien zu einem neuen Winrar-Archiv hinzufügen!
ECHO Die Daten werden zu Archiv hinzugefuegt
pause
ECHO.
cd \
cd C:\Dokume~1\csl\Desktop\test\
C:\Programme\WinRAR\WinRAR.exe a test.rar
echo.
echo Daten wurden Archiviert
:: pause
:: Aufruf der Loeschen.bat zum loeschen der nicht archivierten Dateien
call C:\Dokume~1\csl\Desktop\loeschen.bat
REM -------------------------- E O F ---------------------------
wäre über jede hilfe sehr dankebar!!
greets Sloddi
ich hab folgendes Problem...
Ich möchte Monatlich eine kleine Datensicherung auf eine externe USB-Platte machen. Dazu muss ich jedes mal einzeln in die verzeichnisse und die dateien suchen, verzippen und kopieren! Echt nervig! Dann habe ich mir gedacht ich könnte das ganze doch automatisieren und ich hab mich an eine batch gewagt! Naja bin ein absoluter leihe auf diesem Gebiet!
Ich habe mir jetzt schon ein Grundgerüst aufgebaut und mein kleines Programm kopiert dateien von a nach b, verzippt sie und löscht die nicht archivierten Dateien danach wieder! Jetzt fehlt mir noch die Filterung der dateien! in dem Ordner aus dem ich kopieren sind dateien des ganzen jahres vorhanden! ich möchte aber nur den letzten Monat sichern! Wie stelle ich das an? Wie mache ich so eine bedingung!?
Komme echt nicht weiter!
Hier mal mein Code bis jetzt!
@echo OFF
CLS
REM ------------------------------------------------------------
REM Name: copy_rar_del.bat
REM Autor: csl
REM Datum: 06.03.09
REM ------------------------------------------------------------
:: Kopieren der Dateien von a nach b
ECHO Die Datensicherung wird gestartet ..
ECHO.
pause
XCOPY C:\all\*.* C:\Dokume~1\csl\Desktop\test\*.* /V
Echo.
Echo Die Daten wurden gesichert!
:: pause
:: Die Dateien zu einem neuen Winrar-Archiv hinzufügen!
ECHO Die Daten werden zu Archiv hinzugefuegt
pause
ECHO.
cd \
cd C:\Dokume~1\csl\Desktop\test\
C:\Programme\WinRAR\WinRAR.exe a test.rar
echo.
echo Daten wurden Archiviert
:: pause
:: Aufruf der Loeschen.bat zum loeschen der nicht archivierten Dateien
call C:\Dokume~1\csl\Desktop\loeschen.bat
REM -------------------------- E O F ---------------------------
wäre über jede hilfe sehr dankebar!!
greets Sloddi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 110889
Url: https://administrator.de/contentid/110889
Ausgedruckt am: 22.11.2024 um 21:11 Uhr
24 Kommentare
Neuester Kommentar
Hallo Sloddi und willkommen im Forum!
Die im Vormonat geänderten oder erstellten Dateien kannst Du etwa so kopieren:
Das "echo" vor dem "copy" soll (zum Testen) die Kopierbefehle nur anzeigen; wenn Du es weglässt wird tatsächlich kopiert (dann könntest Du am Ende der Zeile noch ">nul" hinzufügen, damit nicht für jede Datei "1 Datei kopiert." angezeigt wird).
Grüße
bastla
Die im Vormonat geänderten oder erstellten Dateien kannst Du etwa so kopieren:
@echo off & setlocal
set "Quelle=C:\all\*.*"
set "Ziel=C:\Dokume~1\csl\Desktop\test\"
::Jahr aus aktuellem Datum ermitteln (Voraussetzung: die Jahreszahl wird mit "echo %date%" vierstellig angezeigt)
set J=%date:~-4%
::Vormonat + 100 berechnen (damit die führende Null erhalten bleibt)
set /a VM=1%date:~-7,2%-1
::die beiden letzten Stellen ergeben die Monatszahl
set "VM=%VM:~-2%"
::Monatszahl "00" bedeutet "Vormonat war Dezember", daher: Monat auf 12 setzen und Jahr reduzieren
if "%VM%"=="00" (
set "VM=12"
set /a J-=1
)
::Alle Dateien der "Quelle" einzeln durchgehen, und bei Vorhandensein von ".Monat.Jahr" im Dateidatum kopieren
for %%i in ("%Quelle%") do echo %%~ti|findstr "\.%VM%\.%J%">nul && echo copy "%%i" "%Ziel%"
Grüße
bastla
Hallo Sloddi!
Na gut - dann weiter:
müsste, richtige Inhalte von %VM% und %J% (also "02" und "2009") vorausgesetzt, eine Liste von Dateidatumswerten (ohne Dateinamen) aus dem Feber 2009 ausgeben (geprüft wird auf das Vorhandensein von ".02.2009").
Grüße
bastla
Na gut - dann weiter:
for %%i in ("%Quelle%") do echo %%~ti|findstr "\.%VM%\.%J%"
Grüße
bastla
Moin Sloddi,
eins der angenehmen Features bei Batch-Befehlen ist, dass sich durchaus einzelne (Teil-)Zeilen am CMD-Prompt testen lassen.
Also bitte taste Dich wie folgt heran:
Grenze den Fehler am CMD-Prompt ein:
Statt des Batch-Befehls for %%i in ("%Quelle%") do echo %%~ti|findstr "\.%VM%\.%J%" erstmal bröckchenweise
Wenn in beiden Fällen mit festen Werten für %Quelle%, %VM%, %J% Daten angezeigt werden,
> dann überprüfen ob diese drei Variablen richtig gesetzt sind.
Grüße
Biber
eins der angenehmen Features bei Batch-Befehlen ist, dass sich durchaus einzelne (Teil-)Zeilen am CMD-Prompt testen lassen.
Also bitte taste Dich wie folgt heran:
Grenze den Fehler am CMD-Prompt ein:
Statt des Batch-Befehls for %%i in ("%Quelle%") do echo %%~ti|findstr "\.%VM%\.%J%" erstmal bröckchenweise
for %i in ("C:\bla\Test\*.*") do echo %~ti
--- wenn Daten kommen...--
for %i in ("C:\bla\Test\*.*") do @echo %~ti|findstr "\.06\.08"
> dann überprüfen ob diese drei Variablen richtig gesetzt sind.
Grüße
Biber
Hallo Sloddi!
Es sollte eigentlich genügen, eine weitere Schleife für die Unterordner des Quellordners hinzuzufügen - ungetestet sähe das dann so aus:
Grüße
bastla
P.S.: Da ich es bisher sträflicher Weise verabsäumt habe, erst jetzt der Hinweis auf die Möglichkeit der -Formatierung ...
Es sollte eigentlich genügen, eine weitere Schleife für die Unterordner des Quellordners hinzuzufügen - ungetestet sähe das dann so aus:
@echo off & setlocal
set "Quelle=C:\all\*.*"
set "Ziel=C:\Dokume~1\csl\Desktop\test\"
::Jahr zweistellig aus aktuellem Datum ermitteln
set J=%date:~-2%
::Vormonat + 100 berechnen (damit die führende Null erhalten bleibt)
set /a VM=1%date:~-7,2%-1
::die beiden letzten Stellen ergeben die Monatszahl
set "VM=%VM:~-2%"
::Monatszahl "00" bedeutet "Vormonat war Dezember", daher: Monat auf 12 setzen und Jahr reduzieren
if "%VM%"=="00" (
set "VM=12"
set /a J-=1 )
::Alle Dateien der "Quelle" einzeln durchgehen, und bei Vorhandensein von ".Monat.Jahr" im Dateidatum kopieren
for %%i in ("%Quelle%") do echo %%~ti|findstr "\.%VM%\.%J%">nul && xcopy /Y "%%i" "%Ziel%"
::Alle Unterordner der "Quelle" einzeln durchgehen, und bei Vorhandensein von ".Monat.Jahr" im Ordnerdatum gesamte Ordnerstruktur kopieren
for /d %%i in ("%Quelle%") do echo %%~ti|findstr "\.%VM%\.%J%">nul && xcopy /E /Y "%%i" "%Ziel%"
bastla
P.S.: Da ich es bisher sträflicher Weise verabsäumt habe, erst jetzt der Hinweis auf die Möglichkeit der -Formatierung ...
Hallo Sloddi!
Zum Löschen aller Dateien außer jener eines bestimmten Typs (.rar, im Beispiel als Variable festgelegt) gäbe es mehrere Möglichkeiten - der Einfachheit halber wird jeweils vorausgesetzt, dass es um die Dateien des aktuellen Ordners geht, was sich vorweg so erreichen lässt:
Funktionieren sollten alle folgenden Varianten:
Noch als Nachtrag zu oben:
Das %%i in der Schleife entspricht jeweils einem Unterordner mit vollständiger Pfadangabe.
Für einen solchen Pfad gibt es eine Zerlegungsmöglichkeit in seine Einzelteile
Laufwerk (%%~di für drive),
Pfad (%%~pi),
(Datei-)Name (%%~ni) und
Typ (%%~xi für extension)
- siehe dazu "for /?" gegen Ende.
Diese Teile lassen sich auch kombiniert angeben, wodurch also "%%~nxi" Name und Typ liefert (Typ ist dabei, damit Ordnernamen, die einen oder mehrere Punkte enthalten, vollständig erfasst werden, da ansonsten der Teil nach dem letzten Punkt verloren ginge).
Damit wird also "xcopy" beauftragt, im Zielordner den Unterordner anzulegen. Da dieser vermutlich noch nicht existiert, muss "xcopy" auch mitgeteilt werden, dass es sich beim Ziel um einen Ordner und keine Datei handelt - ansonsten käme die Frage:
Mit dem "\" am Ende des Kopierzieles wird festgelegt, dass das Ziel ein Ordner ist.
Grüße
bastla
Zum Löschen aller Dateien außer jener eines bestimmten Typs (.rar, im Beispiel als Variable festgelegt) gäbe es mehrere Möglichkeiten - der Einfachheit halber wird jeweils vorausgesetzt, dass es um die Dateien des aktuellen Ordners geht, was sich vorweg so erreichen lässt:
@echo off & setlocal
::in den Ordner wechseln
cd /d "C:\Dokume~1\csl\Desktop\test"
::Typ der nicht zu löschenden Dateien festlegen
set "Excl=.rar"
- in einer Schleife alle Dateien auf den Typ hin untersuchen und .rar-Dateien nicht löschen:
for /f "delims=" %%i in ('dir *.* /b /a-d') do if /i "%%~xi" neq "%Excl%" del "%%i"
- per "findstr" die nicht zu löschenden Dateien ausfiltern:
for /f "delims=" %%i in ('dir *.* /b /a-d^|findstr /i /e /v "%Excl%"') do del "%%i"
- die nicht zu löschenden Dateien verstecken, die "sichtbaren" löschen und die versteckten Dateien wieder sichtbar machen:
attrib +h *%Excl%
del /q *.*
attrib -h *%Excl%
Noch als Nachtrag zu oben:
Aber kannst du mir vllt kurz erklären was %~nxi\ ausmacht? oder bewirkt? und warum du es genommen hast!?
Eigentlich sind es ja zwei Teile "%%~nxi" und "\" ...Das %%i in der Schleife entspricht jeweils einem Unterordner mit vollständiger Pfadangabe.
Für einen solchen Pfad gibt es eine Zerlegungsmöglichkeit in seine Einzelteile
Laufwerk (%%~di für drive),
Pfad (%%~pi),
(Datei-)Name (%%~ni) und
Typ (%%~xi für extension)
- siehe dazu "for /?" gegen Ende.
Diese Teile lassen sich auch kombiniert angeben, wodurch also "%%~nxi" Name und Typ liefert (Typ ist dabei, damit Ordnernamen, die einen oder mehrere Punkte enthalten, vollständig erfasst werden, da ansonsten der Teil nach dem letzten Punkt verloren ginge).
Damit wird also "xcopy" beauftragt, im Zielordner den Unterordner anzulegen. Da dieser vermutlich noch nicht existiert, muss "xcopy" auch mitgeteilt werden, dass es sich beim Ziel um einen Ordner und keine Datei handelt - ansonsten käme die Frage:
Ist das Ziel DeinOrdnername ein Dateiname
oder ein Verzeichnisname
(D = Datei, V = Verzeichnis)?
Grüße
bastla
Moin Sloddi,
Ich will da ja nicht reinreden, aber...
Der Zeitpunkt des Umsteigens auf ein professionelles Backuptool (= eines, das Features wie Datenkompression, logging, inkrementelle Sicherungen durchdeklinieren und nicht nur simulieren kann) hängt sicherlich vor allem von 3 Störgrößen maßgeblich ab:
Soll heißen:
In Deinem Beispiel-Fall würde ich behaupten, hier sollte der Kunde auf die Notwendigkeit einer Profi-Lösung hingewiesen (oder zumindest vorbereitet) werden.
Grüße
Biber
[Eröffnungspost:] Ich möchte Monatlich eine kleine Datensicherung auf eine externe USB-Platte machen.
[eine Woche später] ....vllt überfordert mit andie 50.000 Dateien? Zuviel zu durchsuchen vllt.? Die batch muss ca. 3.000 Dateien und ordner aus 50.000 filtern!...
Ich will da ja nicht reinreden, aber...
Der Zeitpunkt des Umsteigens auf ein professionelles Backuptool (= eines, das Features wie Datenkompression, logging, inkrementelle Sicherungen durchdeklinieren und nicht nur simulieren kann) hängt sicherlich vor allem von 3 Störgrößen maßgeblich ab:
- dem Datenvolumen resp der Zeit eines Sicherungslauf und der Zeitdauer der eingeschränkten Verfügbarkeit/Produktivsystemausfalls durch den Sicherungslauf
- der Wichtigkeit ("Unersetzbarkeit") der Daten
- dem ohne Gewaltanwendung freikeilbaren Budget des Auftraggebers
Soll heißen:
- wenn der Kunde kein Geld für vernünftiges Werkzeug ausgeben will und die Daten ersetzbar sind und ein eingeschränkter Zugriff während eines Sicherungslaufs kein Thema ist--> dann bleib bei einem Batchkonstrukt
- wenn es aber soooo lange dauert, dass ihr evtl erst nach Stunden erfahrt, ob es denn überhaupt funktioniert hat oder ob die Batch nie wiederkehren wird ---> nehmt Geld in die Hand und steigt um auf Profi- statt Baumarkt-Tools
In Deinem Beispiel-Fall würde ich behaupten, hier sollte der Kunde auf die Notwendigkeit einer Profi-Lösung hingewiesen (oder zumindest vorbereitet) werden.
Grüße
Biber
Hallo Sloddi!
Eigentlich sieht das eher danach aus, als würde der Batch durchlaufen und nur eben keine Dateien zum Kopieren finden ...
Versuch es so: Lass durch die neue Zeile 30 mit
Vormonat und Jahr ausgeben und danach den Batch beenden (die Zeile brauchst Du danach nicht mehr).
Falls die Ausgabe so aussieht (ohne irgendwelche Leerzeichen zwischendrin):
versuch als Nächstes direkt an der Kommandozeile den Befehl:
Damit sollte für alle passenden Dateien des Ordners Dateidatum und Dateiname ausgegeben werden.
Soferne das funktioniert, kannst Du obige Zeile ersatzweise als Zeile 31 und ein "goto :eof" als Zeile 32 (vorübergehend) einbauen - es sollte dann die selbe Ausgabe erzielt werden.
Danach sehen wir weiter ...
Grüße
bastla
Eigentlich sieht das eher danach aus, als würde der Batch durchlaufen und nur eben keine Dateien zum Kopieren finden ...
Versuch es so: Lass durch die neue Zeile 30 mit
echo #%VM%#%J%# & goto :eof
Falls die Ausgabe so aussieht (ohne irgendwelche Leerzeichen zwischendrin):
#02#2009#
for %%i in ("C:\all\*.*") do echo %%~ti#%%i|findstr "\.02\.2009"
Soferne das funktioniert, kannst Du obige Zeile ersatzweise als Zeile 31 und ein "goto :eof" als Zeile 32 (vorübergehend) einbauen - es sollte dann die selbe Ausgabe erzielt werden.
Danach sehen wir weiter ...
Grüße
bastla