chappy
Goto Top

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

Content-Key: 143100

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

Printed on: April 23, 2024 at 10:04 o'clock

Member: bastla
bastla May 19, 2010, updated at Oct 18, 2012 at 16:42:11 (UTC)
Goto Top
Hallo chappy und willkommen im Forum!

Vielleicht hilft Dir dieser Beitrag ...

Grüße
bastla
Member: chappy
chappy May 19, 2010 at 09:00:37 (UTC)
Goto Top
Hallo bastla,

ich habe mir diesen Beitrag angeschaut und auch ausprobiert, aber leider komme ich nicht zum gewünschten Ziel. In meinem Ordner befinden sich Dateien aus verschiedenen Monaten. DIese sollen nun jeweils pro Monat in eine rar zusammen gepackt werden, z.B. 2009-10.rar für Oktober.2009 und dann auf einen anderen Rechner verschoben werden. Und die fertige rar muss dann auf einen zweiten rechner geschoben werden. nicht zu vergessen, das die nun in rar befindlichen Dateien auch dann gelöscht werden müssen, wenn diese gepackt wurden. Mit dem Teil klappt das nicht

@echo off & setlocal
set "Quelle=D:\Komprimier-Test\*.*"
set "Ziel=D:\Komprimier-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%" >> D:\Komprimier-Test\test.log

::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%\%%~nxi\"

echo Die Daten wurden kopiert!

Echo.

cd \
cd %Ziel%
C:\Programme\WinRAR\WinRAR.exe a test.rar

echo.

echo daten wurden Archiviert

hier wird alles in test.rar geschrieben, was ja nicht sein sollte.

Ich hoffe du kannst mir da weiterhelfen.

Danke schon mal für deine Antwort
Member: chappy
chappy May 19, 2010, updated at Oct 18, 2012 at 16:42:12 (UTC)
Goto Top
kann denn niemand helfen?

Ich habe es mir folgendermaßen überlegt::

Schritt1: Komprimiere alle Daten aus dem Vormonat mm zur jjjj-mm.rar
Schritt2: Prüfung: komprimierung erfolgreich?
- - - - -> JA: gehe zu Schritt3 weiter
- - - - -> NEIN: gehe zu Schritt2 zurück
Schritt3: Kopiere erstellte jjjj-mm.rar von Rechner1 zu Rechner2
Schritt4: Prüfung: Kopiervorgang erfolgreich?
- - - - -> JA: gehe zu Schritt5 weiter
- - - - -> NEIN: gehe zu Schritt3 zurück
Schritt5: Lösche auf Rechner1 alle Daten aus dem Vormonat mm und die erstellte jjjj-mm.rar

geht das? Wäre auch schön, wenn man das automatisch jeden Monat ausführen lassen könnte, aber ich glaube das geht nicht mit batch, richtig?

Ähnliches hierzu habe ich unter folgenden Link gefunden:
Batch Datei WinRAR

Ich hoffe, dass mir hier jemand weiterhelfen kann

Gruss eure
chappy
Member: bastla
bastla May 19, 2010 at 14:02:31 (UTC)
Goto Top
Hallo chappy!

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
"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]
Member: chappy
chappy May 19, 2010 at 15:19:24 (UTC)
Goto Top
Hallo bastla,

erst einmal Herzlichen Dank für deine Unterstützung.

Ich habe das ganze ausprobiert, doch leider passiert da nichts. in der log-Datei wurde lediglich reingeschrieben, dass 0 Dateien kopiert wurden. Wärend das dos-Fenster aufblinkt, konnte ich kurz lesen, dass das Verzeichnis nicht gefunden werden konnte. Ist es möglich, im nachhinein zu sehen, was in dem Dos-Fenster stand? Es geht einfach viel zu schnell zu und ich kann nicht erkennen, was da stand.

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.

face-sad schade hat nicht geklappt hast du eine Idee, warum?

Danke dir und lieben Gruss eure
chappy
Member: bastla
bastla May 19, 2010 at 15:30:42 (UTC)
Goto Top
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 "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 ... face-wink
Member: chappy
chappy May 19, 2010 at 17:07:42 (UTC)
Goto Top
Hallo Bastla,

erst eimal danke für deine Tipps, die haben mir schon mal weitergeholfen. Also ich habe es noch einmal getestet und in cmd steht folgendes:
C:\Dokumente und Einstellungen\Administrator>for /F "tokens=1-3 delims=." %a in ("02.05.2010 17:42") do xcopy /Y "D:\Komprimier-Test\308.txt" "D:\Komprimier-Test\Monate\%c-%b\" 1>>"D:\Komprimier-Test\test.log"

C:\Dokumente und Einstellungen\Administrator>xcopy /Y "D:\Komprimier-Test\308.txt" "D:\Komprimier-Test\Monate\2010 17:42-05\" 1>>"D:\Komprimier-Test\test.log"
Fehler beim Erstellen der Datei - Der Verzeichnisname ist ungültig.

Verzeichnis kann nicht erstellt werden - D:\Komprimier-Test\Monate\2010 17:42-05

C:\Dokumente und Einstellungen\Administrator>for /F "tokens=1-3 delims=." %a in ("23.04.2010 19:13") do xcopy /Y "D:\Komprimier-Test\auto fiesta.txt" "D:\Komprimier-Test\Monate\%c-%b\" 1>>"D:\Komprimier-Test\test.log"

C:\Dokumente und Einstellungen\Administrator>xcopy /Y "D:\Komprimier-Test\auto fiesta.txt" "D:\Komprimier-Test\Monate\2010 19:13-04\" 1>>"D:\Komprimier-Test\test.log"
Fehler beim Erstellen der Datei - Der Verzeichnisname ist ungültig.

Verzeichnis kann nicht erstellt werden - D:\Komprimier-Test\Monate\2010 19:13-04

vielleicht habe ich das miss verstanden, aber ich habe das Gefühl, das hier erst ein Ordner 2010 erstellt wird oder?

Der Code:
@echo on & setlocal
set "Quelle=D:\Komprimier-Test\*.*"
set "Ziel=D:\Komprimier-Test\Monate"
set "Log=D:\Komprimier-Test\test.log"
del "%Log%" 2>nul
for %%i in ("%Quelle%") do for /f "tokens=1-3 delims=." %%a in ("%%~ti") do xcopy /Y "%%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

entnehme ich, das du einen Ordner Monat erstellst, dann noch einen Ordner mit Jahr!?!? Da sollte genau die 2010-04.rar hin, dass hatte ich gedacht oder wie soll ich den code verstehen? Habe bislang noch nie ein script geschrieben und kann es daher auch schwer lesen.

Dank dir
Member: chappy
chappy May 19, 2010 at 17:15:33 (UTC)
Goto Top
nochmals ich, habe da noch ein paar Fragen:

1. ist es möglich, zu prüfen, ob das packen erfolgreich abgeschlossen wurde?
1a. wenn ja, ist es auch möglich, bei nicht erfolgreich abgeschlossenen pscken in rar, dass packen zu wiederholen?

2. kann auch geprüft werden, ob eine Datei erfolgreich auf einen anderen Rechner übertragen wurde?
2a. wenn ja, kann bei fehlschlag die rar-Datei nochmals kopiert/übertragen werden?

3. ist es eigentlich begrenzt, wie gross die Rar-Datei sein darf? Oder kann man da so viel reinpacken, wie man nur möchte?

Ich bedanke mich vorab für deine Mühe und Geduld. Leider brauch ich diese Antworten für morgen. Wäre prima, wenn ich bis morgen 15Uhr auch was lauffähiges hätte.

Gruss die verzweifelte
chappy
Member: chappy
chappy May 19, 2010 at 17:17:43 (UTC)
Goto Top
und warum hat er nichts kopiert? wenn du schon so lachst, dann war das von dir wohl gewollt, oder?
Member: bastla
bastla May 19, 2010 at 17:24:18 (UTC)
Goto Top
Hallo chappy!

Leider fehlt noch ein Leerzeichen bei der Angabe des Trennzeichens face-sad - 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%"
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:
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%"
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:
C:\Programme\WinRAR\WinRAR.exe a "%%i.rar" "%%i\*.*" && echo Bei "%%i" alles OK! || (echo Fehler beim Packen von "%%i" aufgetreten! & goto :Fehlerbehandlung)
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 "fc /b" ...

Grüße
bastla
Member: bastla
bastla May 19, 2010 at 17:33:22 (UTC)
Goto Top
Hallo chappy!
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
Member: chappy
chappy May 19, 2010 at 18:16:19 (UTC)
Goto Top
Da mit dem Pfad, habe ich schon extra gemacht. Ich habe nun einen anderen Pfad, da ich nun von meinem Laptop aus probiere. In dem Pfad: liegen auch mehrere Dateien mit verschiedenen Monaten und habe darauf gehoft, dass ich diese in die entsprechende Rar bekomme. Aber leider wurde hier nur der Ordner angelegt und das wars. nichts weiteres ist passiert. versuche jetzt mal deine Korrektur aus.

Für die Prüfung: soll ich da diese Zeilen:


zur batch unten dranhängen?

Dank dir und Grüsse

chappy,

PS. habe vor lauter Verzweifelung deinen Smily falsch gedeutet. Lag an meinen Augen. Sorry :-P
Member: bastla
bastla May 19, 2010 at 18:20:38 (UTC)
Goto Top
Hallo chappy!
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 auf
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)
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
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)
Grüße
bastla
Member: chappy
chappy May 19, 2010 at 18:27:36 (UTC)
Goto Top
wow es funktioniert. Ich bin baffffff!!! Herzlichen Dank!!

aber es gibt noch ein kleines Problem. Ich möchte nicht, dass die Daten vom aktuellen Monat gepackt werden, denn das soll erst im nächsten Monat passieren. Sonst überschreibe ich ja die rar beim nachfolgenden kopieren. Du verstehst?

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?

Habe nur Angst, dass wenn die rar-Datei erstellt wird, diese fehlschlägt und die Daten dann verloren gehen. Also dürfen nur die Ordner unter Monat gelöscht werden, die auch eine zugehörige rar haben.

Verstehst du, was ich meine?

Gruss und einen Mega Dank
chappy
Member: chappy
chappy May 19, 2010 at 18:39:31 (UTC)
Goto Top
Hallo bastla,

das sieht wirklich wunderbar aus, das die direkt ohne Unterordner in die Rar geschrieben werden ist genau was ich mir vorgestelllt habe.

Bis jetzt funktioniert es mal super.

Zum Thema Fehlerbehandlung: wie kann ich da reinschreiben, dass bei nicht erstellen einer rar-Datei, die fehlgeschlagene rar zu wiederholen?
oder kann man nicht angeben, welche rar wiederholt werden soll?

meiner Meinung nach, ist es besser, erst alle rar zu Archiv zu verschieben und zu jeder rar den passenden Ordner löschen. Der Ordner, der nicht gelöscht wurde, bedeutet, das hier die Rar nicht erstellt wurde oder ein fehler aufgetreten ist und muss wiederholt werden, bis der Ordner Monat leer ist. geht das überhaupt?

Lieben dank an dich
chappy

PS. leider weiss ich nicht genau, was man alles mit der batch machen kann und vorallem wie formulieren - -sorry - echt schade
Member: bastla
bastla May 19, 2010 at 18:52:07 (UTC)
Goto Top
Hallo chappy!
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!
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)
for /d %%i in ("%Ziel%\*.*") do rd "%%i"
eliminieren (wobei nur tatsächlich leere Ordner gelöscht würden).

Grüße
bastla
Member: chappy
chappy May 19, 2010 at 20:25:04 (UTC)
Goto Top
es sieht wirklich immer besser aus, ich danke dir vom ganzen Herzen Bastla.

ich habe aber auch eine Frage:

1. ist es nicht möglich, die leeren Ordner nach Erstellung der zugehörigen rar zu löschen?
2. soweit ich das gesehen habe, werden die rar-Dateien nicht ausgegeben, sobald ein Fehler auftritt, aber werde es jetzt noch einmal Testen.

bis gleich

LG
chappy
Member: bastla
bastla May 19, 2010 at 20:30:31 (UTC)
Goto Top
Hallo chappy!

1. sollte sich so machen lassen:
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!
Grüße
bastla
Member: chappy
chappy May 19, 2010 at 20:56:42 (UTC)
Goto Top
Hallo,

hallo 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? Dann ist man nämlich sicher, dass auf jeden Fall für den Fehlerfreien Ordner eine rar erstellt wird, oder was meinst du zu meiner Überlegung?

Eine weitere Frage ist, was soll mit der fehlerhaften rar passieren? das solange versucht wird zu komprimieren, bis nur leere Ordner vorhanden sind, dh. es wird immer auf volle Ordner geprüft (daran erkennt man ja welcher Monat fehlgeschlagen ist) und dann nochmals versuch eine rar zu erstellen. kann man eigentlich auch eine eMail an den Admin senden, wenn ein fehler auftritt??

Gruss
chappy
Member: bastla
bastla May 19, 2010 at 21:00:28 (UTC)
Goto Top
Hallo chappy!
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
Member: chappy
chappy May 19, 2010 at 21:05:51 (UTC)
Goto Top
hmmmm,

nach dem ich das versucht habe, kommt folgende Meldung:

Bei "2009-01" alles OK!
Das System kann die angegebene Datei nicht finden.
Fehler beim Packen von "2009-01" aufgetreten!
Bei "2009-02" alles OK!
Das System kann die angegebene Datei nicht finden.
Fehler beim Packen von "2009-02" aufgetreten!
Bei "2009-04" alles OK!
Das System kann die angegebene Datei nicht finden.
Fehler beim Packen von "2009-04" aufgetreten!
Bei "2010-04" alles OK!
Das System kann die angegebene Datei nicht finden.
Fehler beim Packen von "2010-04" aufgetreten!

Aber es passiert das gleiche, es werden rar erstellt und auch richtig, aber die Ordner werden nicht gelöscht, sondern bleiben leer. Weshalb nun diese Fehlermeldung kommt, habe ich nicht verstanden. Du etwa??

Dank dir
LG
chappy
Member: chappy
chappy May 19, 2010 at 21:08:46 (UTC)
Goto Top
Zitat von @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 "WinRarm" wird der Ordner geleert und mit "rd" entfernt) ...

hmm leider ist das nicht der Fall. Ich sende dir nochmals den code, wie er momentan ausschaut:
@echo off & setlocal
set "Quelle=D:\Komprimier-Test\Test-Daten\*.*"
set "Ziel=D:\Komprimier-Test\Monate"
set "Log=D:\Komprimier-Test\test.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
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%"
popd
echo.

echo Daten wurden archiviert!


danke

PS. musst du nicht schlafen gehen? Ist doch spät!!! Wenn wir das heut net schaffen sollten, darf ich morgen mit dir rechnen? Ich will morgen an grosse Datenmengen ran, um zu wissen, wann die rar abbricht. Hier habe ich momentan nur paar Daten an denen ich das ausprobiere.

Du bist echt klasse kann dir nicht oft genug für deine Unterstützung danken

LG
chappy
Member: chappy
chappy May 19, 2010 at 21:16:51 (UTC)
Goto Top
ich blödian habe eine ( vergessen, daher die Fehlermeldung!! Sorry mein Fehler!!!

Läuft bisher wie es soll. Morgen muss ich das mit dem Fehler probieren und sehen, wie zu verfahren ist.

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

Dank und lieben Dank
chappy

PS. muss erst morgen Fehler provozieren, dann kann ich mehr sagen, aber ich bräuchte definitiv so eine onstellation. Schlaf gut du Genie face-smile
Member: bastla
bastla May 19, 2010 at 21:17:47 (UTC)
Goto Top
Hallo chappy!

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!
Wenn Du Code postest, bitte zwischen "<code>" und "</code>"-Tags stellen - dann kann zB auch leichter auf Zeilennummern Bezug genommen werden ...
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
Member: chappy
chappy May 19, 2010 at 21:21:39 (UTC)
Goto Top
sehe obigen Beitrag face-smile

schade, aber vielleicht brauch ich auch die Zeit face-smile
Member: chappy
chappy May 19, 2010 at 21:23:49 (UTC)
Goto Top
genau das möchte ich morgen in Erfahrung bringen. Sinn macht es ja alle mal, daher hatte ich am Anfang gedacht erst einmal kopieren und wenn rar trotz Fehler löscht, dann hat man noch die alten Daten.
Member: bastla
bastla May 19, 2010 at 21:26:53 (UTC)
Goto Top
Hallo chappy!

Na dann schaun mer mal ...

Gute Nacht für heute. face-smile

P.S.: Ich zweifle etwas daran, dass Genialität anhand ziemlicher dummer Fehler / Ungenauigkeiten zu erkennen wäre ...
Member: chappy
chappy May 19, 2010 at 21:30:20 (UTC)
Goto Top
meiner Meinung nach - definitiv ja!

Gute Nacht face-smile
Member: chappy
chappy May 20, 2010 at 11:11:45 (UTC)
Goto Top
Moin moin bastla

habe herausgefunden, dass rar keine bestimmte Grössen-Begrenzung hat, daher haben wir freie Bahn.

zum anderen habe ich vergebens versucht einen Fehler nachzubilden, aber das ging leider nicht. Habe nur lesen, dass der m-Befehl, NUR erfolgreich gepackte Dateien löscht, sonst nicht. Damit muss ich jetzt nun leben.

Nun fehlen mir noch zwei Schritte:

1. Wenn eine Datei nicht verschoben werden konnte, soll eine Error-Log erstellt werden, die per eMail an admin@email.de geht und der Prozess abgebrochen werden.

2. das gleiche, wenn eine rar-Datei nicht erstellt werden konnte, dann soll das ignoriert werden, bis alle Ordner fertig sind und am Ende eine Error-Log erstellt werden, die an admin@email.de gehen soll mit der entsprechenden Fehlermeldung.

Jetzt ist die grosse Frage: Geht das mit batch? Wenn ja, wie geht das, ich werde es mal ausprobieren und heraussuchen, wie man überhaupt emails per batch versenden kann und dann noch einen Anhang dazu. Werde meine kläglichen Versuch dann posten ;) Für Tipps bin ich natürlich dankbar

Gruss
chappy
Member: chappy
chappy May 20, 2010 at 12:16:41 (UTC)
Goto Top
Hallo Bastla,

ich habe den Code um die Fehlermeldung erweitert, aber irgenntwie wird keine Error.log erstellt. Ist der Code fehlerhaft? Ich weiss es nicht.

@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\Daten\test.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   
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 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\*.*" && (echo Bei "%%i" alles OK! & rd "%%i") || echo Fehler beim Packen von "%%i" aufgetreten!  
popd 
echo. 


echo Daten wurden archiviert!

was meinst du? Siehe Zeile 13 und 18 ist da was falsch?

Bezweckt war, dass ein Fehler ausgegeben wird, wenn (13) eine Datei nicht verschoben werden kann (18) beim packen ein Fehler entsteht
(13) kommt die Meldung: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird., aber der Prozess geht weiter ausser die betroffene Datei wird liegen gelassen. Beim nächsten Durchlauf wird diese zum bestehenden archiv hinzugefügt, was auch nicht schlecht ist.

Wenn aber alle Dateien, die verschoben werden müssten nicht verschoben werden können, da diese bearbeitet werden, bekomme ich dennoch die Meldung: Daten wurden verschoben, obwohl das nicht stimmt. Anschliessend wird versucht zu packen, das schlägt auch fehl, weil der erstellte Ordner leer ist. Dann kommt die Meldung "packen fehlgeschlagen", aber keine error.log was mit Zeile (18) beabsichtigt war.

Bzgl. EMAIL:

habe mich umgelesen wegen eMail und blat.exe. Ich habe das hier auf den Rechner nicht gefunden. Bei uns werden die eMails per Outlook versendet. kann ich dann diese per batch versendete eMail auch über outlook versenden, ohne etwas zu installieren? Wäre nämlich nicht erlaubt etwas fremdes zu installieren. Was habe ich da für Möglichkeiten? Habe gehört, dass es mit batch gar nicht geht?! Bin noch auf das gestossen, aber sagt mir nicht viel.

@echo off & setlocal

:: set the temp file location
set tempmail=%temp%\tempmail.%random%.txt

:: echo the basic headers to the temp file
echo To: "Scripting Test" ^<test@paulsadowski.com^> > %tempmail%  
echo From: "Me" ^<me@my.com^> >> %tempmail%  
echo Subject: Test2 >> %tempmail%

:: echo the blank line that separates the header from the body text
echo.>>%tempmail%

:: echo the body text to the temp file
echo First line of body text.>> %tempmail%
echo Second line of body text.>> %tempmail%

:: move the temp file to the mail pickup directory
:: adjust this location for your system
move %tempmail% c:\inetpub\mailroot\pickup
set tempmail=
endlocal 

Gruss
chappy

Fragen über Fragen, mein Gott alles sooo kompliziert face-sad
Member: bastla
bastla May 20, 2010 at 15:39:40 (UTC)
Goto Top
Hallo chappy!

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
)
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]
Member: chappy
chappy May 21, 2010 at 08:32:34 (UTC)
Goto Top
Hallo Bastla,

sorry, bin erst heute zum testen gekommen und leider sieht es schlecht aus. Ich weiss auch nicht wieso. Habe mal echo on gesetzt, um zu sehen, wo das skript sich aufhängt und es kommt bis Zeile 13. Da hört es auf und es passiert nichts, wieso auch immer. ich poste noch mal den code. Könntest du bitte nochmals die Zeile 26 dir anschauen? wollte da die Fehlermeldung von Rar mit abfangen und in die Error.log mit reinschreiben. Stimmt das so?:

@echo on & 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"   
 
::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%Err% "%%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 
)

hmmm, keine Ahnung

Gruss
chappy
Member: bastla
bastla May 21, 2010 at 09:01:43 (UTC)
Goto Top
Hallo chappy!

Die schließende Klammer in Zeile 21 ist leider auf der Strecke geblieben face-sad (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
Member: chappy
chappy May 21, 2010 at 09:25:06 (UTC)
Goto Top
Hallo Bastla,

das stimmt, habe es nicht gesehen. es funktioniert jetzt auch. Schlage mich gerade mit der eMail rum.

Gibt es eine Möglichkeit, eine email aus batch zu senden, ohne etwas zusätzliches zu installieren? mir steht outlook zur Verfügung, aber es funktioniert nicht. Habe nach MAPISend gesucht, habe ich nicht hier nur MAPISRVR face-sad

Habe das versucht:

@echo off & setlocal  

MAPISRVR -u "EXCHGCL3.genag.de" -r ext.l.l@email.com -s "Test Beispiel Betreff?" -m "Testbeispiel für Inhalt"  

weisst du woran es liegen könnte?
Member: bastla
bastla May 21, 2010 at 09:33:34 (UTC)
Goto Top
Hallo chappy!
weisst du woran es liegen könnte?
Leider nein - es sollte Dir aber doch eigentlich ein Admin sagen können, auf welche Art Du ihm eine Nachricht (per Script) senden kannst ...

Grüße
bastla
Member: chappy
chappy May 21, 2010 at 09:41:44 (UTC)
Goto Top
leider gibt es niemand der was sagen kann und aus der Outlook-Hilfe werde ich nicht schlau.

irgenntwie soll es auch für outlook diese Befehle /m /a /c und so weiter geben, aber ich finde die Bedeutung nicht und bekomme Sie auch nicht angesteuert face-sad

Versuche erst einmal mir selber eine Mail zu zu senden, aber das klappt leider auch nicht. hast du noch ne Idee, was man da machen könnte oder welche Alternative man da hätte?

Beispiel mit hilfe von http://www.outlook-tips.net/howto/commandlines.htm:

@echo off & setlocal  
set "Quelle=C:\Programme\Microsoft Office\Office11"    

"%Quelle%\Outlook.exe" /c ipm.note /m "person@email.com"   

Aber der erkennt den Pfad nicht, weil wohl "Microsoft Office" im Pfad auseinander geschrieben ist. bekomme die Meldung:

Der Befehl ""C:\Programme\Microsoft Office\Office11\Outlook.exe"" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

Warum?

Dank und Gruß
chappy
Member: chappy
chappy May 21, 2010 at 10:04:46 (UTC)
Goto Top
Sorry, pfad war falsch von mir, anstelle 11 muss 12 hin!!

wenn ich das ausführe, dann wird das outlock-Email_fenster gestartet, wobei die angegeben eMail_Adresse im "An"_Feld steht, die Fehler.log im Anhang abgelegt wird. so jetzt noch einen Standardtext!!!!! face-smile

vielleicht kommen wir der lösung näher face-smile auch wenn ich keine Ahnung vom skripten habe.

Hast du einen Vorschlag

Grüsse
chappy
Member: bastla
bastla May 21, 2010 at 10:41:57 (UTC)
Goto Top
Hallo chappy!

Sorry - Outlook ist nicht so meine Baustelle ... face-sad

Wenn der Rest soweit funktioniert, würde es sich eigentlich anbieten, diesen Thread hier zu schließen und einen neuen für das Thema "Mailversand" zu eröffnen ...

Grüße
bastla
Member: chappy
chappy May 21, 2010 at 11:15:22 (UTC)
Goto Top
Ja, ich denke mal, das dem so ist.

Ich bedanke mich ganz herzlich für deine Geduld, Mühe und vorallem Zeit die du investiert hast.

Mal schauen, wie das mit der Mail zu behandeln ist.

Herzlichen Dank und liebe Grüsse
chappy
Member: Biber
Biber May 21, 2010 at 11:20:31 (UTC)
Goto Top
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
Member: chappy
chappy May 21, 2010 at 11:37:43 (UTC)
Goto Top
soweit war ich fast, habe aber noch immer an meinen Kenntnissen und Fähigkeiten gezweifelt.
Es stellt sich die Frage, ob ich den inhalt aus der Log_datei als body verschieben kann oder halt den Link zur Fehler.log, dann könnten wir zu Lösung 2 greifen, oder?
Member: chappy
chappy May 21, 2010 at 12:49:21 (UTC)
Goto Top
Hey, dann stellt sich die Frage:

mit vbs kann man die mail versenden, oder? sehe:

VBScript'==========================================================================  
'  
' NAME: MailUsingOutlook.vbs  
'  
' COMMENT: This script generates an e-mail using the Outlook client.  
'  
'==========================================================================  

'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 = "This message was generated from a script using the Outlook client."  

	'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

wie kann ich das mit dem obigen code vereinen, so dass der error-File und Log-File mitgenommen wird? oder auch als Link versendet wird? Ist das überhaupt machbar?

grüsse eure verzweifelte
chappy
Member: bastla
bastla May 21, 2010 at 13:22:56 (UTC)
Goto Top
Hallo chappy!

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
Grüße
bastla
Member: chappy
chappy May 21, 2010 at 13:36:13 (UTC)
Goto Top
Hallo bastla,

super süss deine Mühe, leider hat dieser blöde script nicht gemacht, was ich wollte. Aber dafür habe ich was anderes jetzt. Schau mal:

Const olByValue = 1
Const olMailItem = 0
    
Dim oOApp 
Dim oOMail

Set oOApp = CreateObject("Outlook.Application")  
Set oOMail = oOApp.CreateItem(olMailItem)

With oOMail
    .To = "ext.d.wiggins@rheinenergie.com"  
    .Subject = "Dies ist der Betreff"  
    .Body = "Bei der Archivierung der Daten ist ein Fehler aufgetreten."  
    .Attachments.Add "U:\Daten_L\Datenpool\Komprimier_Test\Fehler.log", olByValue, 1  
    .Send
End With

ein kleine Frage noch, ist es möglich, mir die Variable aus dem batsch zu ziehen? sehe Zeile (15), da wollte ich jetzt net an mehreren Stellen was ändern wollen, daher die Frage: kann ich beide in eine datei legen? oder müssen die getrennt liegen und kann ich die Variable für den Pfad an die VBS weitergeben?

Gruss
chappy
Member: bastla
bastla May 21, 2010 at 13:45:03 (UTC)
Goto Top
Hallo chappy!

Du kannst das Script aus dem Batch mit
cscript //nologo D:\Mailscript.vbs "U:\Daten_L\Datenpool\Komprimier_Test\Fehler.log"
aufrufen und im Script mit
Attach = WScript.Arguments(0)
den Pfad in die Variable "Attach" übernehmen und dann per
.Attachments.Add Attach
hinzufügen.

Grüße
bastla
Member: chappy
chappy May 21, 2010 at 14:08:59 (UTC)
Goto Top
Hallo bastla,

leider bekomme ich dann keine Mail, weder versendet noch kommt was an face-sad.

Meldung:
U:\Daten_L\Datenpool\Komprimier_Test\MailService.vbs(9, 1) Laufzeitfehler in Microsoft VBScript: Objekt erforderlich: '[string: "U:\Daten_L\Datenpool"]'

der aktuelle code sieht so aus:

MailService:

Const olByValue = 1
Const olMailItem = 0
    
Dim oOApp 
Dim oOMail

Set oOApp = CreateObject("Outlook.Application")  
Set oOMail = oOApp.CreateItem(olMailItem)
Set Attach = WScript.Arguments(0)

With oOMail
    .To = "email@email.com"  
    .Subject = "Fehlermeldung - Bitte prüfen!"  
    .Body = "Bei der Archivierung der Daten ist ein Fehler aufgetreten."  
    '.Attachments.Add "U:\Daten_L\Datenpool\Komprimier_Test\Fehler.log", olByValue, 1  
	.Attachments.Add Attach
    .Send
End With

Archivier.bat:
@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"  
 
::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   
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%" (   
   ::U:\Daten_L\Datenpool\Komprimier_Test\MailService.vbs
   cscript //nologo %Msg% "%Err%"  
)

wo liegt das Problem schon wieder?? Liegt wohl in Zeile 9 vom vbs

grüsse
chappy
Member: bastla
bastla May 21, 2010 at 14:16:19 (UTC)
Goto Top
Hallo chappy!

War leider gerade abgelenkt und habe den Rest der Zeile 16 im Script unterschlagen - die ganze Zeile sollte
.Attachments.Add Attach, olByValue, 1
lauten ...

Grüße
bastla
Member: chappy
chappy May 21, 2010 at 14:23:16 (UTC)
Goto Top
Hatte ich bereits ausprobiert, aber das ist es nicht

ich sehe aber auch nicht, wo wir das Objekt weitergeben?! Oder den String ?!
Ist immer noch die gleiche Meldung
Member: bastla
bastla May 21, 2010 at 14:37:58 (UTC)
Goto Top
Hallo chappy!

Übergeben wird der Pfad (ein String) als Aufrufparameter des Scripts in der Batch-Zeile
cscript //nologo %Msg% "%Err%"
Mit der Zeile 9 hattest Du übrigens recht - Du hast da ein für einen String (in VBS) unnötiges "Set" dazuerfunden ... face-wink

Grüße
bastla
Member: chappy
chappy May 21, 2010 at 14:52:47 (UTC)
Goto Top
Oh je, ich dachte, das wäre erforderlich gewesen, um die Variable Attach zu setzen face-smile

Sorry sorry, jetzt geht es auch!

SUPPPPPERR ihr Lieben

ein Herzliches Danke schön und ein schönes Wochenende wünsche ich euch.

Eure
chappy

PS. wenn ich anstelle des aktuellen Monats die letzten 3 Monate noch nicht archivieren möchte, wie schreib ich das?
%aktuelleMonat% - 3
etwa so?
Member: bastla
bastla May 21, 2010 at 16:38:48 (UTC)
Goto Top
Hallo chappy!
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%"  
)
Kurze Anmerkung hinsichtlich der "Trickserei" mit 100+Monatszahl (bzw "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
Member: chappy
chappy May 25, 2010 at 08:30:35 (UTC)
Goto Top
Hallo,

habe mal angefangen, dass Progrämmchen etwas mehr zu testen und dabei habe ich die folgende Meldung bekommen:

Die folgende Verwendung des Pfadoperators zur Ersetzung eines Batchparameters
ist ungültig: %~ti") do if "%%c-%%b" neq "%MonatAktuell%" (


Geben Sie CALL /? oder FOR /? ein, um herauszufinden, welche Formate gültig
sind.
Syntaxfehler.

Was heisst das. Ich habe die von mir zuletzt gepostete Version. @bastla Deinen Code habe ich noch nicht ausgetestet. Kannst du mir hierzu was sagen?

Vielleicht mehr zum Ablauf: In dem Quell-Ordner waren alle möglichen Daten drin. Es wurden alle verschoben ausser die von diesem Monat. Dann kam diese Fehlermeldung und es wurde nicht gepackt.

Gruss
chappy

PS: kann ich eigentlich mehrere Quell- und Zielverzeichnisse eingeben? Oder wie mache ich das? muss ich etwa für jedes Verzeichnis eine eigene bat ablegen?
Member: bastla
bastla May 25, 2010 at 09:20:59 (UTC)
Goto Top
Hallo chappy!

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 auf
set "Quelle=%~1"  
set "Ziel=%~2"  
zu ändern und der Batch etwa so zu starten (vorzugsweise aus einem weiteren Batch):
D:\Batches\Komprimieren.cmd "U:\Daten_L\Datenpool\Komprimier_Test\Daten\*.*" "U:\Daten_L\Datenpool\Komprimier_Test\Monate"
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.
@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 17
echo %MonatAktuell% & goto :eof
(und in Zeile 1 "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
Member: chappy
chappy May 25, 2010 at 09:33:54 (UTC)
Goto Top
Zitat von @bastla:
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?

eins nach dem anderen. Also einen Unterordner gab es in diesem Fall nicht und von der Verzeichnisstruktur eigentlich auch wie gehabt. Deswegen habe ich es auch nicht verstanden. 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.

Habe dann die Dateien des Aktuellen Ordner heraus gelöscht und nochmals die bat angestossen, damit cie Dateien komprimiert werden.
Habe allerdings gesehen, das sehr oft die Fehlermeldung kam, dass die Datei nicht verschoben werden konnte, da diese von einem anderen prozess benutzt wird, aber das kann gar nicht sein!

Gruss
chappy

PS: Bisher habe ich die Pfade immer so hineingelegt und konnte aber aus der Log Datei nicht finden, welche Daten nicht verschoben wurden. Weiss auch nicht, ob diese jedes mal überschrieben wird, gleichers für die Error.log. Muss ich für jeden Pfad eine Eigene anlegen?

So sieht es bisher aus, ich habe immer auskomentiert und die batch im euen cmd-fenster angestossen (deswegen wahrscheinlich gegenseitiges Überschreiben)

@echo off & setlocal  
 
::set "Quelle=U:\Daten_L\Datenpool\Komprimier_Test\Daten\*.*"    
::set "Ziel=U:\Daten_L\Datenpool\Komprimier_Test\Monate"    

set "Quelle=W:\hPFC-Tool\Out\EHS\Archiv\*.*"    
set "Ziel=W:\hPFC-Tool\Out\EHS\Monate"    

::set "Quelle=W:\hPFC-Tool\Out\IPM\done\*.*"    
::set "Ziel=W:\hPFC-Tool\Out\IPM\Monate"    

::set "Quelle=W:\hPFC-Tool\Out\RETweb\Kurzfristprognose\Archiv\*.*"    
::set "Ziel=W:\hPFC-Tool\Out\RETweb\Kurzfristprognose\Monate"    

::set "Quelle=W:\hPFC-Tool\Out\RETweb\Prognose\*.*"    
::set "Ziel=W:\hPFC-Tool\Out\RETweb\Prognose\Monate"    

::set "Quelle=W:\hPFC-Tool\Out\RETweb\IntradayAfterday\Archiv\*.*"    
::set "Ziel=W:\hPFC-Tool\Out\RETweb\IntradayAfterday\Monate"   

::set "Quelle=W:\hPFC-Tool\Out\DM\Archiv\*.*"    
::set "Ziel=W:\hPFC-Tool\Out\DM\Monate"    

::set "Quelle=W:\hPFC-Tool\Out\RETweb\Back2Back\Old\*.*"    
::set "Ziel=W:\hPFC-Tool\Out\RETweb\Back2Back\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"  
 
::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   
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%" (   
   ::U:\Daten_L\Datenpool\Komprimier_Test\MailService.vbs
   cscript //nologo %Msg% "%Err%"  
)
Member: bastla
bastla May 25, 2010 at 09:46:59 (UTC)
Goto Top
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.
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
Member: chappy
chappy May 25, 2010 at 10:29:30 (UTC)
Goto Top
Zitat von @bastla:

Das fiele ja eigentlich unter "works as designed" (wie
Biber das zu formulieren pflegt) - es sollten ja die Dateien
dieses Monats ausgespart werden ...

Das ist mir ja schon klar, nur dass dann eine Fehlermeldung ausgegeben wird, wo kein Fehler ist,, das war nicht gewollt! Verstehst du?

LG
chappy
Member: chappy
chappy Jun 04, 2010 at 14:02:02 (UTC)
Goto Top
Hallo bastla,

kannst du mir nochmals sagen, wie ich das machen kann, wenn ich in verschiedenen Verzeichnissen archivieren möchte?

Oben im Code in der Zeile 3 bis 25 habe ich jeweils die Verzeichnisse, wo die Daten liegen und wohin das ganze gepackt werden soll. Ich habe diese bislang immer auskommentiert, bis ich alle durchlaufen lassen habe. Jetzt wollte ich nicht für jedes verzeichnis eine eigene Datei hinterlegen, daher meine Frage, wie soll ich das machen?

Wie ich dich verstanden habe, muss ich die Zeilen 3 bis 25 in eine eigene Verzeichnis.bat-Datei schreiben, oder? Wie sieht dann die Zeile 27 und 29 aus? die werden wohl auch in andere Verzeichnisse geschrieben, oder? Bekommt das Zeile 66 dann auch mit, in welchem verzeichnis der Fehler liegt? Könnest du mir bitte nochmals weiterhelfen?

Liebe Grüsse
chappy
Member: bastla
bastla Jun 04, 2010 at 16:50:41 (UTC)
Goto Top
Hallo chappy!

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
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:
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%"  
)
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.
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
Member: chappy
chappy Jun 09, 2010 at 10:22:25 (UTC)
Goto Top
Hallo bastla,

sorry, dass ich mich später melde. ich habe mal das ganze nochmals angepasst und es sieht wie folgt aus:

Pfade.txt
W:\DM\Out\Bestellbestaetigung\Gas\*.*§W:\DM\Out\Bestellbestaetigung\Gas\Archiv

W:\DM\Out\Bestellbestaetigung\Strom\*.*§W:\DM\Out\Bestellbestaetigung\Strom\Archiv

W:\DM\Out\EHS\Ablage\done\*.*§W:\DM\Out\EHS\Ablage\done\Archiv

W:\DM\Out\iOPT\Original\Done\*.*§W:\DM\Out\iOPT\Original\Done\Archiv

W:\hPFC-Tool\Out\DM\*.*§W:\hPFC-Tool\Out\DM\Archiv

MonatsarchivierungVariabel.bat
@echo off & setlocal   

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"   

set /a Vormonate=1 
 
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   
 
:: 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%" (    
   cscript //nologo %Msg% "%Err%"   
)

wenn ich dann die bat starte, bekomme ich die Meldung:

U:\>U:\Daten_L\Datenpool\Komprimier_Test\MonatsarchivierungVariabel.bat
Das System kann den angegebenen Pfad nicht finden.

Dateien in "U:\Daten_L" konnten nicht archiviert werden!
Das System kann den angegebenen Pfad nicht finden.

Dateien in "U:\Daten_L" konnten nicht archiviert werden!

obwohl ich den Pfad U\Daten_L gar nicht archivieren möchte. Warum bekomme ich dann diese Meldung??

eine Weitere Frage zum Verständnis bzgl. Zeile 9:
"Vormonat=1" -> heisst es etwa, dass alle Daten archiviert werden, bis auf die vom Vormonat (jetzt Mai)? Und wenn Vormonat=3 heisst es dann, alle Daten bis März? Der April nicht mehr?

Bedanke mich vorab für deine Antwort und Mühe.

Gruss
chappy
Member: bastla
bastla Jun 09, 2010 at 11:09:34 (UTC)
Goto Top
Hallo chappy!

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
        )
sollte das verhindern ...
"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
Member: chappy
chappy Jun 09, 2010 at 12:28:10 (UTC)
Goto Top
Hallo bastla,

danke für deine Antworten, aber scheint immer noch ein Wurm drin zu sein, denn bei der Ausführung passiert nichts, obwohl in einem Ordner noch Daten zum archivieren liegen.
So sieht der Code momentan aus. Habe ich noch irgentwo Klammern vergessen?

@echo off & setlocal   

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"   

set /a Vormonate=1 
 
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   
 
:: 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!   
            ) 
        ) 
 
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 
        )
    

 
if exist "%Err%" (    
   cscript //nologo %Msg% "%Err%"   
)

Danke
Member: bastla
bastla Jun 09, 2010 at 13:31:47 (UTC)
Goto Top
Hallo chappy!

Die schließenden Klammern der Zeilen 54 und 55 werden weiterhin benötigt.

Grüße
bastla
Member: chappy
chappy Jun 09, 2010 at 13:45:28 (UTC)
Goto Top
Zeile 41 bis 55 sehen nun so aus, aber klappt immer noch net:

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 )
))
Member: bastla
bastla Jun 09, 2010 at 13:59:42 (UTC)
Goto Top
Hallo chappy!

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%"   
)
Grüße
bastla
Member: chappy
chappy Jun 09, 2010 at 14:22:33 (UTC)
Goto Top
in der pfade.txt steht:
W:\DM\Out\Bestellbestaetigung\Gas\*.*§W:\DM\Out\Bestellbestaetigung\Gas\Archiv

U:\Daten_L\Datenpool\Komprimier_Test\Daten\*.*§U:\Daten_L\Datenpool\Komprimier_Test\Archiv

W:\DM\Out\Bestellbestaetigung\Strom\*.*§W:\DM\Out\Bestellbestaetigung\Strom\Archiv

W:\DM\Out\EHS\Ablage\done\*.*§W:\DM\Out\EHS\Ablage\done\Archiv

und in zweiten Pfad befinden sich Daten, die archiviert werden müssten, aber da passiert nichts, wieso?

Gruss
chappy

AHHHH, habs gefunden: die *.* waren noch zu viel, da kann der Pfad nicht gefunden werden!!!! Aber da scheint ein Fehler noch zu sein. Es werden zwar die Daten vom Vormonat ausgelassen, aber die von diesem Monat werden archiviert, was nicht sein darf!!! in welcher Zeile ist das? Vormonat <=1
Member: bastla
bastla Jun 09, 2010 at 14:45:37 (UTC)
Goto Top
Hallo chappy!

Zuerst: Sorry wegen der bösen Falle mit "*.*" ... face-sad
In Zeile 27 ist "neq" durch "lss" zu ersetzen.

Grüße
bastla
Member: chappy
chappy Jun 09, 2010 at 15:02:11 (UTC)
Goto Top
Hey bastla,

ach gar kein Thema, haben wir ja dank dem echo gefunden face-smile Ja soweit sieht es mal super aus!

Ein super herzlöiches Dankeschön. Ich muss den Code nochmals studieren, um mit bat arbeiten zu können. Aber ich denke ich werde bestimmt irgenntwann wieder deine Hilfe brauchen. Echt supper support, weiter so!

Knuddel
chappy
Member: chappy
chappy Jun 14, 2010 at 09:29:22 (UTC)
Goto Top
Hallo bastla,

habe noch eine Frage:

wenn ich das echo on mal einschalte, dann sehe ich in der cmd, das auch versucht wird, die dateien aus dem Mai zu verschieben, was dann fehlschlägt, ist das normal? packt die batch jede einzelne Datei an und prüft, ob die im jeweiligen Gültigkeitsbereich (Datum) liegt? ist es deswegen, warum es dann lange dauert? wenn ich nämlich echo off mache, dann sieht man gar nichts und man hat den Eindruck, dass gar nicht gearbeitet wird.

gruss
chappy
Member: bastla
bastla Jun 14, 2010 at 09:42:54 (UTC)
Goto Top
Hallo chappy!
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 Zeile
for %%i in ("%%q\*.*") do for /f "tokens=1-3 delims=. " %%a in ("%%~ti") do if "%%c-%%b" neq "%MonatAktuell%" (
noch einen "else"-Zweig (in meinem letzten Codeschnipsel müsstest Du dazu die Zeile 16 etwa durch
) else (
echo Nicht bearbeitet: %%c-%%b-%%a_%%i
)
ersetzen) spendieren - schneller wird's damit aber sicher nicht face-wink ...

Grüße
bastla
Member: chappy
chappy Jun 14, 2010 at 10:19:51 (UTC)
Goto Top
ja super, jetzt weiss man wenigstens, dass sich das Prog nicht irgenntwo aufgehängt hat. Dank dir.

chappy

PS. das es nicht schneller sein wird, das war mir schon klar, nur man weiss ja nie, wer davor sitzt und was Mann/Frau sich dann denkt, wenn nichts passiert face-smile

liebe Grüsse
chappy
Member: chappy
chappy Jun 25, 2010 at 09:20:23 (UTC)
Goto Top
Hallo bastla,

wie sieht es eigentlich aus, wenn ich eine Datei von vom heutigen Tag im Ordner A ermitteln möchte und in den Ordner B kopieren möchte?
Hab bei dir abgeschaut face-smile aber bekomme folgenden Fehler:
C:\Temp\Heute.vbs(1, 1) Laufzeitfehler in Microsoft VBScript: Falsche Anzahl an Argumenten oder ungültige Eigenschaftszuweisung: 'dateAdd'

::---CopyVonHeute.bat 
@echo off & setlocal 
set "Quelle=\\server1\rechner1\*.csv"    
set "Ziel=\\server2\rechner2\test"    

echo wscript.echo dateAdd("d", date())>%temp%\Heute.vbs   
For /f %%i in ('cscript //nologo %temp%\Heute.vbs') do set "Heute=%%i"   
del %temp%\Heute.vbs 
@for /f "tokens=4,*" %%i in ('dir /A:-d "%Quelle%" ^|find "%Heute%"') do copy "%Quelle%\%%i" "%Ziel%"   
::----CopyVonHeute.vbs

Gruss
Member: bastla
bastla Jun 25, 2010 at 10:26:11 (UTC)
Goto Top
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:
::---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
Wie Dir vielleicht aufgefallen ist, habe ich die Aufteilung der "dir"-Zeile so angepasst, dass auch Dateinamen mit Leerzeichen richtig verarbeitet werden ...

Grüße
bastla