Per Batch automatisch Dateien vom Vormonat mit rar komprimieren
Hallo,
ich habe gestern vergebens versucht, eine *.bat zu Erstellen, mit der ich aus einem Ordner Dateien vom Vormonat ermitteln konnte, diese mit rar komprimieren konnte und anschliessend verschieben, wobei die komprimierten dateien gelöscht werden. Das ganze soll jeden Monat gemacht werden, z.B. am 07. des fFolgemonats.
Bei meiner verzweifelten Suche bin ich auf dieses forum gestossen, aber leider nichts passendes gefunden. Ich schreibe eigentlich zum ersten mal eine bat. Ich bin soweit gekommen, dass ich einen Ordner komprimieren konnte und auch sagen wo dieser abgelegt werden soll. Aber ich denke mal, wenn ich eine Datei von Rechner 1 auf Rechner 2 ablegen möchte, dann ist es empfehlenswert, die rar-Datei erst auf Rechner1 zu erstellen und erst nach Fertigstellung auf Rechner 2 verschieben, oder?
Achja, ist es möglich, dass die erstellte Rar den Namen: Jahr-Monat.rar bekommt? Dann wäre das super.
Wäre euch dankbar für eure Hilfe
Gruss
chappy
ich habe gestern vergebens versucht, eine *.bat zu Erstellen, mit der ich aus einem Ordner Dateien vom Vormonat ermitteln konnte, diese mit rar komprimieren konnte und anschliessend verschieben, wobei die komprimierten dateien gelöscht werden. Das ganze soll jeden Monat gemacht werden, z.B. am 07. des fFolgemonats.
Bei meiner verzweifelten Suche bin ich auf dieses forum gestossen, aber leider nichts passendes gefunden. Ich schreibe eigentlich zum ersten mal eine bat. Ich bin soweit gekommen, dass ich einen Ordner komprimieren konnte und auch sagen wo dieser abgelegt werden soll. Aber ich denke mal, wenn ich eine Datei von Rechner 1 auf Rechner 2 ablegen möchte, dann ist es empfehlenswert, die rar-Datei erst auf Rechner1 zu erstellen und erst nach Fertigstellung auf Rechner 2 verschieben, oder?
Achja, ist es möglich, dass die erstellte Rar den Namen: Jahr-Monat.rar bekommt? Dann wäre das super.
Wäre euch dankbar für eure Hilfe
Gruss
chappy
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 143100
Url: https://administrator.de/contentid/143100
Ausgedruckt am: 22.11.2024 um 16:11 Uhr
72 Kommentare
Neuester Kommentar
Hallo chappy!
Etwas zum Testen für Zwischendurch:
"WinRar" kennt übrigens auch ein "m"-Kommando - wie verlässlich das funktioniert, kann ich allerdings nicht abschätzen ...
Grüße
bastla
[Edit] Fehlenden "\" nach "%%b" sowie Leerzeichen als zusätzlichen Delimiter ergänzt [/Edit]
Etwas zum Testen für Zwischendurch:
@echo off & setlocal
set "Quelle=U:\Daten_Lahoucine\Datenpool\Komprimier_Test\Test_Daten\*.*"
set "Ziel=U:\Daten_Lahoucine\Datenpool\Komprimier_Test\Monate"
set "Log=U:\Daten_Lahoucine\Datenpool\Komprimier_Test\test.log"
del "%Log%" 2>nul
for %%i in ("%Quelle%") do for /f "tokens=1-3 delims=. " %%a in ("%%~ti") do xcopy "%%i" "%Ziel%\%%c-%%b\">>"%Log%"
echo Die Daten wurden kopiert!
echo.
pushd "%Ziel%"
for /d %%i in (*.*) do C:\Programme\WinRAR\WinRAR.exe a "%%i.rar" "%%i\*.*"
popd
echo.
echo daten wurden archiviert
Grüße
bastla
[Edit] Fehlenden "\" nach "%%b" sowie Leerzeichen als zusätzlichen Delimiter ergänzt [/Edit]
Hallo chappy!
Zum Testen von Batches grundsätzlich per "Start / Ausführen... / cmd" ein CMD-Fenster öffnen und von dort den Batch starten (die Batchdatei kannst Du dazu auch aus dem Explorer in das CMD-Fenster ziehen) - so siehst Du schon einmal Fehlermeldungen ...
Wenn das noch nicht genügt, dann aus dem "
Grüße
bastla
P.S.:
Zum Testen von Batches grundsätzlich per "Start / Ausführen... / cmd" ein CMD-Fenster öffnen und von dort den Batch starten (die Batchdatei kannst Du dazu auch aus dem Explorer in das CMD-Fenster ziehen) - so siehst Du schon einmal Fehlermeldungen ...
Wenn das noch nicht genügt, dann aus dem "
echo off
" ein "echo on
" machen - so wird jeder Befehl vor der Ausführung angezeigt, und Du kannst genauer nachvollziehen, wo es klemmt. Wenn Du noch im CMD-Fenster links in der Titelleiste per Rechtsklick das Systemmenü öffnest und dort "Eigenschaften / Layout" wählst, kannst Du die "Fensterpuffergröße" bis auf 9999 Zeilen hochschrauben, um entsprechend weit nach oben scrollen zu können. Schließlich noch der Hinweis auf den Befehl "cls
", mit dem Du den Inhalt des Fenster (vor dem nächsten Testlauf) löschen kannst ...Grüße
bastla
P.S.:
Es wird nur ein Ordner Monat erstellt, aber sonst keine rar erstellt. Ich habe erwartet, dass mit dem batch die Dateien je nach ihren Erstellungs-Monaten zu einer JJJJ-MM.rar komprimiert werden.
Bei 0 kopierten Dateien sollte das Ergebnis nicht sooo überraschend sein ...
Hallo chappy!
Leider fehlt noch ein Leerzeichen bei der Angabe des Trennzeichens - daher sollte die Zeile 7 so aussehen (das eigentlich überflüssige "/Y" habe ich auch gleich entfernt und beides auch oben nachgebessert):
Den Ordner "Monate" habe ich nur verwendet, damit die Dateien nicht unterhalb des Quellpfades abgelegt und so vielleicht mehrmals verarbeit werden (daher wäre auch "D:\Monate" besser) - Du kannst aber jeden beliebigen Namen dafür nehmen ...
Interhalb dieses Ordners sollten dann die einzelnen "Monatsordner" (wie eben "2010-04") entstehen, deren Inhalte letztlich zu einem ".rar"-File zusammengefasst werden.
Noch ein Nachtrag: Das erstellte Log wird mit der folgenden Version der oben angeführten Zeile etwas aussagekräftiger:
Zum Prüfen der gepackten Datei: Sicher könntest Du nur sein, wenn Du für die zu packenden Dateien Prüfsummen (zB als MD5 - eines von vielen dafür verwendbaren (Kommandozeilen-)Programmen findest Du mit fciv auch bei MS, ansonsten etwa md5deep) erstellst, die ".rar"-Datei an einem anderen Ort wieder entpackst und die Prüfsummen der entpackten Dateien mit jenen der Originaldateien vergleichst - ansonsten musst Du Dich darauf verlassen, abzufragen, ob "rar.exe" mit einem Errorlevel <> 0 (=Fehler) beendet wurde - eine solche Abfrage könnte etwa so realisiert werden:
Hinsichtlich des Übertragens der ".rar"-Datei gilt die selbe Überlegung wie für deren Inhalt: Der Vergleich von Checksummen für Original und Kopie kann Dir Sicherheit geben, alternativ dazu (für einzelne Dateien) auch ein "
Grüße
bastla
Leider fehlt noch ein Leerzeichen bei der Angabe des Trennzeichens - daher sollte die Zeile 7 so aussehen (das eigentlich überflüssige "/Y" habe ich auch gleich entfernt und beides auch oben nachgebessert):
for %%i in ("%Quelle%") do for /f "tokens=1-3 delims=. " %%a in ("%%~ti") do xcopy "%%i" "%Ziel%\%%c-%%b\">>"%Log%"
Interhalb dieses Ordners sollten dann die einzelnen "Monatsordner" (wie eben "2010-04") entstehen, deren Inhalte letztlich zu einem ".rar"-File zusammengefasst werden.
Noch ein Nachtrag: Das erstellte Log wird mit der folgenden Version der oben angeführten Zeile etwas aussagekräftiger:
for %%i in ("%Quelle%") do for /f "tokens=1-3 delims=. " %%a in ("%%~ti") do xcopy /f "%%i" "%Ziel%\%%c-%%b\"|findstr /v /c:"Datei(en) kopiert">>"%Log%"
C:\Programme\WinRAR\WinRAR.exe a "%%i.rar" "%%i\*.*" && echo Bei "%%i" alles OK! || (echo Fehler beim Packen von "%%i" aufgetreten! & goto :Fehlerbehandlung)
fc /b
" ...Grüße
bastla
Hallo chappy!
Meine Anmerkung hatte sich jedenfalls schlicht und einfach auf "Ich habe erwartet, dass mit dem batch die Dateien je nach ihren Erstellungs-Monaten zu einer JJJJ-MM.rar komprimiert werden." bezogen - eine Erwartung, die für genau 0 Dateien (von Dir unmittelbar vorher genannt) tatsächlich nicht leicht erfüllt werden konnte ...
Grüße
bastla
wenn du schon so lachst, ...
Ich werde Dir jetzt nicht die Bedeutung von Smilies erklären (aber gerne darauf hinweisen, dass ich nicht gelacht habe) ...... dann war das von dir wohl gewollt, oder?
Was Dich zu dieser Mutmaßung veranlasst, kann ich mir zwar nicht vorstellen, aber wenn Du oben einen Pfad "U:\Daten_Lahoucine\Datenpool\Komprimier_Test\Test_Daten\*.*" für die Quelldaten angibst und kurz darauf mit "D:\Komprimier-Test\*.*" testest, könnte ich mir schon vorstellen, warum keine Daten gefunden wurden.Meine Anmerkung hatte sich jedenfalls schlicht und einfach auf "Ich habe erwartet, dass mit dem batch die Dateien je nach ihren Erstellungs-Monaten zu einer JJJJ-MM.rar komprimiert werden." bezogen - eine Erwartung, die für genau 0 Dateien (von Dir unmittelbar vorher genannt) tatsächlich nicht leicht erfüllt werden konnte ...
Grüße
bastla
Hallo chappy!
abzuändern - zusätzlich müsste noch ein Programmteil ":Fehlerbehandlung" geschrieben werden ...
Noch besser (weil dadurch im Archiv kein Unterordner erzeugt wird) wäre übrigens die Schreibweise
Grüße
bastla
Für die Prüfung: soll ich da diese Zeilen:
zur batch unten dranhängen?
Nein - wenn Du das so machen wolltest (war eher als Demo gedacht), wäre die Zeile 12 aufzur batch unten dranhängen?
for /d %%i in (*.*) do C:\Programme\WinRAR\WinRAR.exe a "%%i.rar" "%%i\*.*" && echo Bei "%%i" alles OK! || (echo Fehler beim Packen von "%%i" aufgetreten! & goto :Fehlerbehandlung)
Noch besser (weil dadurch im Archiv kein Unterordner erzeugt wird) wäre übrigens die Schreibweise
for /d %%i in (*.*) do C:\Programme\WinRAR\WinRAR.exe a -ep "%%i.rar" "%%i\*.*" && echo Bei "%%i" alles OK! || (echo Fehler beim Packen von "%%i" aufgetreten! & goto :Fehlerbehandlung)
bastla
Hallo chappy!
Eine dementsprechend adaptierte (aber nicht getestete) Version würde dann etwa so aussehen:
Es bleiben zwar (noch) die leeren Monatsordner bestehen, aber diese ließen sich beim nächsten Start des Batches mit (einzufügen nach Zeile 5)
eliminieren (wobei nur tatsächlich leere Ordner gelöscht würden).
Grüße
bastla
Ausserdem, möchte ich die gepackten rar-Dateien in Ordner D:\Komprimier-Test\Archiv\Archiv kopieren und die kopierten Dateien, sowohl Ordner Monat, als auch die die schon behandelten Dateien im Ordner D:\Komprimier-Test\*.* löschen. Ich denke es macht Sinn, direkt, nach dem die Dateien in den Monat\Unterordner kopiert wurden zu löschen, oder was meinst du?
Eigentlich wäre die Strategie dann: die Originaldateien in den passenden "Monatsordner" nicht kopieren, sondern verschieben und zum Packen das Kommando "m" verwenden (wodurch die erfolgreich gepackten Dateien von "WinRar" selbst gelöscht werden sollten - zur Zuverlässigkeit dieses Vorgangs kann ich allerdings nichts wirklich Fundiertes sagen) ...Eine dementsprechend adaptierte (aber nicht getestete) Version würde dann etwa so aussehen:
@echo off & setlocal
set "Quelle=D:\Komprimier-Test\*.*"
set "Ziel=D:\Monate"
set "Log=D:\test.log"
for /f "tokens=1-3 delims=. " %%a in ("%date%") do set "MonatAktuell=%%c-%%b"
del "%Log%" 2>nul
for %%i in ("%Quelle%") do for /f "tokens=1-3 delims=. " %%a in ("%%~ti") do if "%%c-%%b" neq "%MonatAktuell%" (
md "%Ziel%\%%c-%%b\" 2>nul
move "%%i" "%Ziel%\%%c-%%b\" && >>"%Log%" echo "%%i" nach "%Ziel%\%%c-%%b" verschoben
)
echo Die Daten wurden verschoben!
echo.
pushd "%Ziel%"
for /d %%i in (*.*) do C:\Programme\WinRAR\WinRAR.exe m -ep "%%i.rar" "%%i\*.*" && echo Bei "%%i" alles OK! || echo Fehler beim Packen von "%%i" aufgetreten!
popd
echo.
echo Daten wurden archiviert!
for /d %%i in ("%Ziel%\*.*") do rd "%%i"
Grüße
bastla
Hallo chappy!
Grüße
bastla
kann man das so einstellen, dass nach jedem Monat erst die Rar erstellt wird, der Ordner gelöscht /geleer wird und dann den nächsten Monat abarbeiten?
Sollte eigentlich genau so bereits laufen (die "for /d
"-Schleife geht alle Ordner = Monate durch, per "WinRar m
" wird der Ordner geleert und mit "rd
" entfernt) ...kann man eigentlich auch eine eMail an den Admin senden, wenn ein fehler auftritt??
Dazu findest Du unter dem Stichwort "blat" hier eine Menge Beispiele ...Grüße
bastla
Hallo chappy!
Da fehlte eine Klammer - richtig müsste die Zeile so aussehen:
Wenn Du Code postest, bitte zwischen "<code>" und "</code>"-Tags stellen - dann kann zB auch leichter auf Zeilennummern Bezug genommen werden ...
Grüße
bastla
Da fehlte eine Klammer - richtig müsste die Zeile so aussehen:
for /d %%i in (*.*) do C:\Programme\WinRAR\WinRAR.exe m -ep "%%i.rar" "%%i\*.*" && (echo Bei "%%i" alles OK! & rd "%%i") || echo Fehler beim Packen von "%%i" aufgetreten!
darf ich morgen mit dir rechnen?
Tagsüber werde ich leider nicht viel Zeit haben ...kann ich bei Fehler diee batch so steuern, dass ein erneueter Versuch zum packen gestartet wird? und nach dem 3ten versuch eine Mail an xxx@gmx.de gesendet wird??? gehtdas mit batch
Es geht einiges mit Batch - die Frage ist hier aber vor allem, wann "WinRar" die Dateien löscht (ich hoffe doch erst, wenn das komplette Archiv fehlerfrei erstellt wurde).Grüße
bastla
Hallo chappy!
Versuch es mal so:
Die Idee ist, für Fehler eine zusätzliche Logdatei ("%Err%") zu erstellen (das "Standard"-Log "%Log%" würde ich übrigens weiterhin nicht zu den Daten legen, sondern, so wie "%Err%", zumindest eine Ordnerebene höher platzieren) und am Ende des Batches zu überprüfen, ob diese Datei existiert - wenn ja, wäre der Inhalt in den Body einer Mail aufzunehmen und diese (auf welche Art und Weise auch immer) zu versenden ...
Grüße
bastla
[Edit] Schließende Klammer in Zeile 21 nachgetragen [/Edit]
Versuch es mal so:
@echo off & setlocal
set "Quelle=U:\Daten_L\Datenpool\Komprimier_Test\Daten\*.*"
set "Ziel=U:\Daten_L\Datenpool\Komprimier_Test\Monate"
set "Log=U:\Daten_L\Datenpool\Komprimier_Test\test.log"
set "Err=U:\Daten_L\Datenpool\Komprimier_Test\Fehler.log"
::for /d %%i in ("%Ziel%\*.*") do rd "%%i"
for /f "tokens=1-3 delims=. " %%a in ("%date%") do set "MonatAktuell=%%c-%%b"
del "%Log%" 2>nul
del "%Err%" 2>nul
for %%i in ("%Quelle%") do for /f "tokens=1-3 delims=. " %%a in ("%%~ti") do if "%%c-%%b" neq "%MonatAktuell%" (
md "%Ziel%\%%c-%%b\" 2>nul
move "%%i" "%Ziel%\%%c-%%b\" && (
>>"%Log%" echo "%%i" nach "%Ziel%\%%c-%%b" verschoben
) || (
>>"%Log%" echo Fehler beim Verschieben von "%%i" aufgetreten!
>>"%Err%" echo Fehler beim Verschieben von "%%i" aufgetreten!
)
)
echo Die Daten wurden verschoben!
echo.
pushd "%Ziel%"
for /d %%i in (*.*) do C:\Programme\WinRAR\WinRAR.exe m -ep -ilog%Ziel%\Error.log "%%i.rar" "%%i\*.*" && (
>>"%Log%" echo Bei "%%i" alles OK!
rd "%%i"
) || (
>>"%Log%" echo Fehler beim Packen von "%%i" aufgetreten!
>>"%Err%" echo Fehler beim Packen von "%%i" aufgetreten!
)
popd
echo.
echo Daten wurden archiviert!
if exist "%Err%" (
REM Mail senden
)
Grüße
bastla
[Edit] Schließende Klammer in Zeile 21 nachgetragen [/Edit]
Hallo chappy!
Die schließende Klammer in Zeile 21 ist leider auf der Strecke geblieben (ich korrigiere das oben auch noch) ...
Ob Du die Fehlermeldung von "WinRar" (in Zeile 26) und / oder per "
Grüße
bastla
Die schließende Klammer in Zeile 21 ist leider auf der Strecke geblieben (ich korrigiere das oben auch noch) ...
Ob Du die Fehlermeldung von "WinRar" (in Zeile 26) und / oder per "
echo
" in Zeile 31 erzeugen lässt, ist eigentlich für den Programmablauf egal (soferne "WinRar" tatsächlich nur im Fehlerfall in die Datei "%Err%" schreibt) ...Grüße
bastla
Moin chappy,
so wirst du kein brauchbares Ergebnis bekommen, denn
1) über den Weg "Outlook mit Parametern aufrufen" bekommst du zwar Outlook mit einer leeren Mail gestartet, auch den Empfänger virgeblendet mit Parameter /c und mit /a auch die Datei angehängt.... aber bekommst keinen Text in den Body der mail und automatisch versenden geht auch nicht. Und schon gar nicht unsichtbar im Hintergrund.
2) über den Weg "mailto://" aufrufen bekommst du zwar Recipient, Subject und Body hin und das Versenden ...aber ums Verrecken keinen Anhang
3 & 4) bleiben als nächstkomplexere Varianten der Weg über MAPI-Schnttstelle oder über ActiveX...
> Spätestens wenn du das als Info weitergibst, dann wird dir Blat.exe oder ein ahnliches Tool erlaubt werden.
Denn das wäre vollkommen unangemessen, da jetzt mit Hochsprachen und API-Aufrufen für diesen Dödelkrams anzufangen.
Grüße
Biber
so wirst du kein brauchbares Ergebnis bekommen, denn
1) über den Weg "Outlook mit Parametern aufrufen" bekommst du zwar Outlook mit einer leeren Mail gestartet, auch den Empfänger virgeblendet mit Parameter /c und mit /a auch die Datei angehängt.... aber bekommst keinen Text in den Body der mail und automatisch versenden geht auch nicht. Und schon gar nicht unsichtbar im Hintergrund.
2) über den Weg "mailto://" aufrufen bekommst du zwar Recipient, Subject und Body hin und das Versenden ...aber ums Verrecken keinen Anhang
3 & 4) bleiben als nächstkomplexere Varianten der Weg über MAPI-Schnttstelle oder über ActiveX...
> Spätestens wenn du das als Info weitergibst, dann wird dir Blat.exe oder ein ahnliches Tool erlaubt werden.
Denn das wäre vollkommen unangemessen, da jetzt mit Hochsprachen und API-Aufrufen für diesen Dödelkrams anzufangen.
Grüße
Biber
Hallo chappy!
Unter der Voraussestzung, dass das VBScript macht, was es soll, könnten die Logs so in den Body eingefügt werden:
Grüße
bastla
Unter der Voraussestzung, dass das VBScript macht, was es soll, könnten die Logs so in den Body eingefügt werden:
VBScript'==========================================================================
'
' NAME: MailUsingOutlook.vbs
'
' COMMENT: This script generates an e-mail using the Outlook client.
'
'==========================================================================
Verlauf = "U:\Daten_L\Datenpool\Komprimier_Test\Verlauf.log"
Fehler = "U:\Daten_L\Datenpool\Komprimier_Test\Fehler.log"
Set fso = CreateObject("Scripting.FileSystemObject"
BodyText = "Verlauf:" & vbCrLf & fso.OpenTextFile(Verlauf).ReadAll
BodyText = BodyText & vbCrLf & "==========================================================================" & vbCrLf
If fso.FileExists(Fehler) Then BodyText = "Fehler: " & BodyText & fso.OpenTextFile(Fehler).ReadAll
'Create an Outlook object
Dim Outlook 'As New Outlook.Application
Set Outlook = CreateObject("Outlook.Application")
'Create e new message
Dim Message 'As Outlook.MailItem
Set Message = Outlook.CreateItem(olMailItem)
With Message
.Subject = "Important message from a script!"
.Body = BodyText
'Set destination email address
.Recipients.Add ("k.myer@fabrikam.com")
'Set sender address.
Const olOriginator = 0
.Recipients.Add("sysadmin@fabrikam.com").Type = olOriginator
.Recipients.ResolveAll
'Send the Message
.Send
End With
bastla
Hallo chappy!
Kurze Anmerkung hinsichtlich der "Trickserei" mit 100+Monatszahl (bzw "
Grüße
bastla
PS. wenn ich anstelle des aktuellen Monats die letzten 3 Monate noch nicht archivieren möchte, wie schreib ich das?
In diesem Fall ändert sich die Logik des Vergleichs (und es wird eine Berechnung erforderlich) - wieder einmal ungetestet etwa so:@echo off & setlocal
set "Quelle=U:\Daten_L\Datenpool\Komprimier_Test\Daten\*.*"
set "Ziel=U:\Daten_L\Datenpool\Komprimier_Test\Monate"
set "Log=U:\Daten_L\Datenpool\Komprimier_Test\Verlauf.log"
set "Err=U:\Daten_L\Datenpool\Komprimier_Test\Fehler.log"
set "Msg=U:\Daten_L\Datenpool\Komprimier_Test\MailService.vbs"
set /a Vormonate=3
for /f "tokens=1-3 delims=. " %%a in ("%date%") do set "Monat=1%%b" & set "Jahr=%%c"
set /a Monat-=%Vormonate%
if %Monat% leq 101 (
set /a Monat+=12
set /a Jahr-=1
)
set "MonatAktuell=%Jahr%-%Monat:~-2%"
del "%Log%" 2>nul
del "%Err%" 2>nul
for %%i in ("%Quelle%") do for /f "tokens=1-3 delims=. " %%a in ("%%~ti") do if "%%c-%%b" leq "%MonatAktuell%" (
md "%Ziel%\%%c-%%b\" 2>nul
move "%%i" "%Ziel%\%%c-%%b\" && (
>>"%Log%" echo "%%i" nach "%Ziel%\%%c-%%b" verschoben
echo.
echo Daten wurden verschoben!
) || (
>>"%Log%" echo Fehler beim Verschieben von "%%i" aufgetreten!
>>"%Err%" echo Fehler beim Verschieben von "%%i" aufgetreten!
echo.
echo Datei "%%i" konnten nicht verschoben werden!
)
)
pushd "%Ziel%"
for /d %%i in (*.*) do C:\Programme\WinRAR\WinRAR.exe m -ep -ilog%Err% "%%i.rar" "%%i\*.*" && (
>>"%Log%" echo "%%i" wurde erfolgreich komprimiert!
rd "%%i"
echo.
echo Daten wurden archiviert!
) || (
>>"%Log%" echo Fehler beim Packen von "%%i" aufgetreten!
>>"%Err%" echo Fehler beim Packen von "%%i" aufgetreten!
echo.
echo Datei "%%i" konnten nicht archiviert werden!
)
popd
if exist "%Err%" (
cscript //nologo %Msg% "%Err%"
)
1%%b
"): Da in Batch eine mit 0 beginnende Zahl als Oktalzahl interpretiert wird, kann mit "08" und "09" nicht gerechnet werden (da Oktalzahlen nur die Ziffern 0 bis 7 verwenden). Als Workaround wird zunächst der Monatszahl eine 1 vorangestellt, was zu Werten zwischen 101 und 112 führt, und damit gerechnet (zB -3). Um dann wieder zu einer Zahl mit einer führenden Null zu kommen (wie sie das Dateidatum enthält), werden nur die letzten beiden Stellen verwendet (der "Hunderter" wird damit praktisch wieder abgezogen)Grüße
bastla
Hallo chappy!
Fangen wir am Ende an:
zu ändern und der Batch etwa so zu starten (vorzugsweise aus einem weiteren Batch):
Auf diese Art brauchst Du für jeden Vorgang nur eine zusätzliche Zeile. Soferne auch die Logfiles etc jeweils unterschiedlich sein sollen, stehen noch die Parameter %3 bis %9 zur Verfügung.
(und in Zeile 1 "
Noch ein Unterschied zur vorigen Version: In Zeile 20 wird mit "
Zur Fehlermeldung: Diese entsteht ja beim Auslesen des Dateidatums - insofern wäre es interessant, für welche Datei der Fehler aufgetreten ist. Bisher war ich davon ausgegangen, dass es keine Unterordner im Quellordner gibt - war das in diesem Fall anders?
Grüße
bastla
Fangen wir am Ende an:
kann ich eigentlich mehrere Quell- und Zielverzeichnisse eingeben? Oder wie mache ich das?
Du kannst den Batch mit Parametern aufrufen - dazu wären dann die Zeilen 3 und 4 zB aufset "Quelle=%~1"
set "Ziel=%~2"
D:\Batches\Komprimieren.cmd "U:\Daten_L\Datenpool\Komprimier_Test\Daten\*.*" "U:\Daten_L\Datenpool\Komprimier_Test\Monate"
@bastla Deinen Code habe ich noch nicht ausgetestet. Kannst du mir hierzu was sagen?
Wenn Du nicht nur den aktuellen Monat ausschließen willst, musst Du eine Berechnung durchführen, und da sich bei einem Abstand von 3 Monaten auch ein Jahreswechsel ergeben kann (im März wären erst die Daten des Dezembers aus dem Vorjahr zu verarbeiten) braucht es ein wenig mehr Code - Du kannst aber einfach in die Zeile 17echo %MonatAktuell% & goto :eof
echo on
") schreiben und den Batch von der Kommandozeile starten - sollte dann eigentlich nachvollziehbar sein.Noch ein Unterschied zur vorigen Version: In Zeile 20 wird mit "
leq
" auf "kleiner-gleich" geprüft, während bisher auf "ungleich" (bezogen auf den derzeitigen Monat) abgefragt wurde.Zur Fehlermeldung: Diese entsteht ja beim Auslesen des Dateidatums - insofern wäre es interessant, für welche Datei der Fehler aufgetreten ist. Bisher war ich davon ausgegangen, dass es keine Unterordner im Quellordner gibt - war das in diesem Fall anders?
Grüße
bastla
Hallo chappy!
Die Logs werden bei jedem Start gelöscht (siehe Zeilen 34 und 35) - wenn also mehrere Durchläufe zusammengefasst werden sollen, darf das Löschen nur vor dem ersten erfolgen - auch das Versenden der Mail (ab Zeile 64) sollte dann nur einmal durchgeführt werden - bei meinem Vorschlag mit einem zweiten Batch sehr leicht zu realisieren, indem die angesprochenen Zeilen an Beginn bzw Ende dieses (zweiten) Batches verschoben werden.
Grüße
bastla
Die Logs werden bei jedem Start gelöscht (siehe Zeilen 34 und 35) - wenn also mehrere Durchläufe zusammengefasst werden sollen, darf das Löschen nur vor dem ersten erfolgen - auch das Versenden der Mail (ab Zeile 64) sollte dann nur einmal durchgeführt werden - bei meinem Vorschlag mit einem zweiten Batch sehr leicht zu realisieren, indem die angesprochenen Zeilen an Beginn bzw Ende dieses (zweiten) Batches verschoben werden.
In diesen Fällen wurden die Dateien nicht kopiert und nach dem ich überprüft habe, habe ich festgestellt, das diese alle von diesem Monat sind. ;ehr konnte ich nicht feststellen.
Das fiele ja eigentlich unter "works as designed" (wie Biber das zu formulieren pflegt) - es sollten ja die Dateien dieses Monats ausgespart werden ...Grüße
bastla
Hallo chappy!
Für das Übergeben von Quelle und Ziel bietet sich eine Konfigurationsdatei (siehe Variable %Pfade%) mit folgendem Aufbau an:
Das Trennzeichen (im Batch die Variable %Delim%) "§" kannst Du selbst so wählen, dass es in keinem der Pfade vorkommt ("|" solltest Du zB dabei aber besser vermeiden).
Wenn gewährleistet wäre, dass der Ordner "Monate" immer "neben" dem Quellordner liegt, ließe sich das Ermitteln des Zielpfades zwar ebenfalls im Batch durchführen, aber mit der expliziten Angabe bleibst Du etwas flexibler ...
Ab Zeile 27 sähe der Batch dann (völlig ungetestet) so aus:
Zu Zeile 15: Falls aus einer Zeile der "Pfade"-Datei nur ein einziger Pfad gelesen werden konnte (und daher die Variable %%r keinen Inhalt hat), wird die Verarbeitung übersprungen.
Grüße
bastla
Für das Übergeben von Quelle und Ziel bietet sich eine Konfigurationsdatei (siehe Variable %Pfade%) mit folgendem Aufbau an:
U:\Daten_L\Datenpool\Komprimier_Test\Daten\*.*§U:\Daten_L\Datenpool\Komprimier_Test\Monate
W:\hPFC-Tool\Out\EHS\Archiv\*.*§W:\hPFC-Tool\Out\EHS\Monate
...§...
Letzte Quellenangabe§Letzter Zielpfad
Wenn gewährleistet wäre, dass der Ordner "Monate" immer "neben" dem Quellordner liegt, ließe sich das Ermitteln des Zielpfades zwar ebenfalls im Batch durchführen, aber mit der expliziten Angabe bleibst Du etwas flexibler ...
Ab Zeile 27 sähe der Batch dann (völlig ungetestet) so aus:
set "Delim=§"
set "Pfade=U:\Daten_L\Datenpool\Komprimier_Test\Pfade.txt"
set "Log=U:\Daten_L\Datenpool\Komprimier_Test\Verlauf.log"
set "Err=U:\Daten_L\Datenpool\Komprimier_Test\Fehler.log"
set "Msg=U:\Daten_L\Datenpool\Komprimier_Test\MailService.vbs"
for /f "tokens=1-3 delims=. " %%a in ("%date%") do set "MonatAktuell=%%c-%%b"
del "%Log%" 2>nul
del "%Err%" 2>nul
:: Zusaetzliche Schleife über alle Zeilen der "Pfade"-Datei
:: %Quelle% wird dabei durch %%q\*.* und %Ziel% durch %%r ersetzt
for /f "usebackq tokens=1-2 delims=%Delim%" %%q in ("%Pfade%") do (
REM Nur bearbeiten, wenn auch ein Zielpfad vorhanden ist
if "%%r" neq "" (
for %%i in ("%%q\*.*") do for /f "tokens=1-3 delims=. " %%a in ("%%~ti") do if "%%c-%%b" neq "%MonatAktuell%" (
md "%%r\%%c-%%b\" 2>nul
move "%%i" "%%r\%%c-%%b\" && (
>>"%Log%" echo "%%i" nach "%%r\%%c-%%b" verschoben
echo.
echo Daten wurden verschoben!
) || (
>>"%Log%" echo Fehler beim Verschieben von "%%~fi" aufgetreten!
>>"%Err%" echo Fehler beim Verschieben von "%%~fi" aufgetreten!
echo.
echo Datei "%%~fi" konnten nicht verschoben werden!
)
)
pushd "%%r"
for /d %%i in (*.*) do C:\Programme\WinRAR\WinRAR.exe m -ep -ilog%Err% "%%i.rar" "%%i\*.*" && (
>>"%Log%" echo "%%~fi" wurde erfolgreich komprimiert!
rd "%%i"
echo.
echo Daten wurden archiviert!
) || (
>>"%Log%" echo Fehler beim Packen von "%%~fi" aufgetreten!
>>"%Err%" echo Fehler beim Packen von "%%~fi" aufgetreten!
echo.
echo Dateien in "%%~fi" konnten nicht archiviert werden!
)
popd
)
)
if exist "%Err%" (
::U:\Daten_L\Datenpool\Komprimier_Test\MailService.vbs
cscript //nologo %Msg% "%Err%"
)
Bekommt das Zeile 66 dann auch mit, in welchem verzeichnis der Fehler liegt?
Zeile 66 gibt ja nur mehr aus, was in Zeile 44 bzw 57 in die Fehlerdatei geschrieben wurde - daher ist in diesen Zeilen anzusetzen, indem der komplette Pfad mit "%%~fi
" erzeugt wird (alternativ wäre auch "%%r\%%i
" möglich).Grüße
bastla
Hallo chappy!
Wenn es den angegebenen Pfad nicht gibt, wurde der aktuelle Pfad als Quelle verwendet - eine Ersetzung der Zeilen 41 bis 53 durch
sollte das verhindern ...
Grüße
bastla
Wenn es den angegebenen Pfad nicht gibt, wurde der aktuelle Pfad als Quelle verwendet - eine Ersetzung der Zeilen 41 bis 53 durch
if exist "%%r" (
pushd "%%r"
for /d %%i in (*.*) do C:\Programme\WinRAR\WinRAR.exe m -ep -ilog%Err% "%%i.rar" "%%i\*.*" && (
>>"%Log%" echo "%%~fi" wurde erfolgreich komprimiert!
rd "%%i"
echo.
echo Daten wurden archiviert!
) || (
>>"%Log%" echo Fehler beim Packen von "%%~fi" aufgetreten!
>>"%Err%" echo Fehler beim Packen von "%%~fi" aufgetreten!
echo.
echo Dateien in "%%~fi" konnten nicht archiviert werden!
)
popd
)
"Vormonat=1" -> heisst es etwa, dass alle Daten archiviert werden, bis auf die vom Vormonat (jetzt Mai)?
Ja.Und wenn Vormonat=3 heisst es dann, alle Daten bis März? Der April nicht mehr?
Auch der März nicht mehr (die 3 Vormonate Mai, April, März werden ausgelassen) ...Grüße
bastla
Hallo chappy!
Neuer Versuch (diesmal gleich der gesamte Block ab Zeile 24):
Grüße
bastla
Neuer Versuch (diesmal gleich der gesamte Block ab Zeile 24):
for /f "usebackq tokens=1-2 delims=%Delim%" %%q in ("%Pfade%") do (
REM Nur bearbeiten, wenn auch ein Zielpfad vorhanden ist
if "%%r" neq "" if exist "%%r" (
for %%i in ("%%q\*.*") do for /f "tokens=1-3 delims=. " %%a in ("%%~ti") do if "%%c-%%b" neq "%MonatAktuell%" (
md "%%r\%%c-%%b\" 2>nul
move "%%i" "%%r\%%c-%%b\" && (
>>"%Log%" echo "%%i" nach "%%r\%%c-%%b" verschoben
echo.
echo Daten wurden verschoben!
) || (
>>"%Log%" echo Fehler beim Verschieben von "%%~fi" aufgetreten!
>>"%Err%" echo Fehler beim Verschieben von "%%~fi" aufgetreten!
echo.
echo Datei "%%~fi" konnten nicht verschoben werden!
)
)
pushd "%%r"
for /d %%i in (*.*) do C:\Programme\WinRAR\WinRAR.exe m -ep -ilog%Err% "%%i.rar" "%%i\*.*" && (
>>"%Log%" echo "%%~fi" wurde erfolgreich komprimiert!
rd "%%i"
echo.
echo Daten wurden archiviert!
) || (
>>"%Log%" echo Fehler beim Packen von "%%~fi" aufgetreten!
>>"%Err%" echo Fehler beim Packen von "%%~fi" aufgetreten!
echo.
echo Dateien in "%%~fi" konnten nicht archiviert werden!
)
popd
)
)
if exist "%Err%" (
cscript //nologo %Msg% "%Err%"
)
bastla
Hallo chappy!
noch einen "
ersetzen) spendieren - schneller wird's damit aber sicher nicht ...
Grüße
bastla
packt die batch jede einzelne Datei an und prüft, ob die im jeweiligen Gültigkeitsbereich (Datum) liegt?
Ja - geht leider nicht anders ...wenn ich nämlich echo off mache, dann sieht man gar nichts und man hat den Eindruck, dass gar nicht gearbeitet wird.
Du könntest der Zeilefor %%i in ("%%q\*.*") do for /f "tokens=1-3 delims=. " %%a in ("%%~ti") do if "%%c-%%b" neq "%MonatAktuell%" (
else
"-Zweig (in meinem letzten Codeschnipsel müsstest Du dazu die Zeile 16 etwa durch) else (
echo Nicht bearbeitet: %%c-%%b-%%a_%%i
)
Grüße
bastla
Hallo chappy!
Das VBScript heiße zwar "Heute", ist aber dafür gedacht, ein Datum für eine bestimmte Anzahl von Tagen vor oder nach dem aktuellen Datum zu ermitteln (und bräuchte dafür einen zusätzlichen Parameter) - daher genügt:
Wie Dir vielleicht aufgefallen ist, habe ich die Aufteilung der "
Grüße
bastla
Das VBScript heiße zwar "Heute", ist aber dafür gedacht, ein Datum für eine bestimmte Anzahl von Tagen vor oder nach dem aktuellen Datum zu ermitteln (und bräuchte dafür einen zusätzlichen Parameter) - daher genügt:
::---CopyVonHeute.bat
@echo off & setlocal
set "Quelle=\\server1\rechner1\*.csv"
set "Ziel=\\server2\rechner2\test"
set "Heute=%date%"
for /f "tokens=3,*" %%i in ('dir /a-d "%Quelle%" ^|find "%Heute%"') do copy "%Quelle%\%%j" "%Ziel%"
::----CopyVonHeute.bat
dir
"-Zeile so angepasst, dass auch Dateinamen mit Leerzeichen richtig verarbeitet werden ...Grüße
bastla