pat.bat
Goto Top

For-Schleife für Logdatei und Move Files

Hallo zusammen,

ich versuche gerade einen Batch zu schreiben der generierte Dateien verschiebt und diese Aktionen dann in eine Logdatei schreibt.

Das mit dem verschieben und erstellen der Logdatei ist soweit kein Problem, außerhalb der For-Schleife.

Wenn ich das aber nun alles etwas kompakter verpacken möchte bleib ich hängen. Habe seit heute Morgen gegooglt um das Problem zu lösen und eine kleine Schraube scheint noch zu fehlen.
Aber ich weiß nicht mehr weiter.

@echo on
set LOGFILE=batch_movefiles.log
set Quelle="H:\Entwicklung\FD50 Bank\Bank"  

REM Aktuelles Datum holen und die Punkte durch Striche ersetzen (DMY -> D=Day; M=Month; Y=Year)
SET CURRENTDATE_DMY=%DATE:.=-%

REM Datum nur mit Jahr (Y) ausgeben >>
SET CURRENTDATE_Y=%CURRENTDATE_DMY:~6,8%

REM Datum nur mit Monat und Jahr (MY) ausgeben
SET CURRENTDATE_MY=%CURRENTDATE_DMY:~3,8%

REM Pfad als Variable zwischenspeichern, da Leerzeichen im Pfad enthalten sind.
SET ORDNER_DMY="H:\Entwicklung\FD50 Bank\Einnahmeverwaltung\Sollstellung\%CURRENTDATE_Y%\%CURRENTDATE_MY%\%CURRENTDATE_DMY%"  

REM Verzeichnis erstellen
MKDIR %ORDNER_DMY%

>>%LOGFILE% echo Datum: %date%

FOR %%A IN ("%quelle%\*.*") Do call :DoMove %%A   

:DoMove
MOVE %%A "%ORDNER_DMY%"  
IF %Errorlevel% EQU 0 (
  >>%LOGFILE% Echo %time% Datei %1 erfolgreich verschoben
) Else (
  >>%LOGFILE% Echo %time% Datei %1 NICHT verschoben, Fehler %Errorlevel%
)
goto:eof
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>%LOGFILE%

Es geht um die FOR Schleife. Soweit ich das richtig verstanden habe wird der code wie folgt ausgeführt: ich suche nach Dateien im Pfad %Quelle% und springe dann in die Funktion :DoMove und nehme dabei den aktuellen Wert der ersten Datei mit -> %%A.

In der Funktion sage ich dann, die Datei unter dem Wert %%A soll in den Ordner %ORDNER_DMY% verschoben werden.

Wenn Errorlevel gleich 0, also kein Fehler, dann Datei mit dem Wert %1... --- Obwohl ich mir nicht wirklich sicher bin mit dem %1, ob das in diesem Fall funktioniert bzw nicht passt. So ganz verstanden hab ich das noch nicht wie das funktioniert.

Was passiert momentan: Datum wird ausgegeben und er gibt eine Fehlermeldung 1 das die Datei " " nicht verschoben werden konnte.

Also einmal funktioniert der Move nicht und zweitens kriegt er nicht den Variablen namen von der aktuellen Datei :S Aber ich bin momentan überfragt wie man das am besten macht.

Content-Key: 398203

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

Printed on: April 25, 2024 at 17:04 o'clock

Member: em-pie
Solution em-pie Jan 14, 2019 updated at 17:16:25 (UTC)
Goto Top
Moin,

nimm robocopy,

Das geht viel einfacher und du kannst das granularer parametrisieren.

Gruß
em-pie
Member: Pat.bat
Pat.bat Jan 15, 2019 at 08:24:20 (UTC)
Goto Top
Leider funktioniert es noch nicht ganz so wie ich möchte. Er verschiebt die Dateien nun, allerdings klappt das mit dem Log noch nicht.


REM Generierte Dateien in Archivordner verschieben (ORDNER_DMY)
>>%LOGFILE% echo Datum: %date%

FOR %%A IN (%QUELLE%) Do call :DoCopy %%A

:DoCopy
ROBOCOPY %QUELLE% %ORDNER_DMY% *.xls *.rtf *.txt *.dat /mov
IF %Errorlevel% EQU 0 (
  >>%LOGFILE% Echo %time% Datei %1 erfolgreich kopiert
) Else (
  >>%LOGFILE% Echo %time% Datei %1 NICHT kopiert, Fehler %Errorlevel%
)
goto:eof
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>%LOGFILE%

Derzeit gibt er folgendes aus:

Datum: 15.01.2019
9:19:36,82 Datei "H:\Entwicklung\FD50 Bank\Bank" NICHT kopiert, Fehler 1
9:19:37,03 Datei NICHT kopiert, Fehler 2

Was ich aber möchte:

Datum: 15.01.2019
9:19:36,82 Datei "H:\Entwicklung\FD50 Bank\Bank\test.dat" erfolgreich verschoben
9:19:36,82 Datei "H:\Entwicklung\FD50 Bank\Bank\test.xls" erfolgreich verschoben
9:19:36,82 Datei "H:\Entwicklung\FD50 Bank\Bank\test.rtf" erfolgreich verschoben
9:19:36,82 Datei "H:\Entwicklung\FD50 Bank\Bank\test.txt" erfolgreich verschoben


Also pro file was kopiert wird, einen Eintrag in den Log.

ich müsste also oben in der For-Kopf schon sagen, Für jede Datei in %QUELLE% Do Call :DoCopy. Ist das so an sich überhaupt möglich?
Auch müsste dann der Dateiname mit in die variable %1 übergeben werden. Ich denke, da muss ich mir wohl noch was basteln, das er den Dateinamen erst seperat abspeichert und dann extra an die Variable %1 anhängen.

Vielen Dank schonmal für die Hilfe face-smile
Member: em-pie
Solution em-pie Jan 15, 2019 at 11:30:51 (UTC)
Goto Top
Lass die dusselige FOr-Schleife weg
Die brauchst du mit ROBOCOPY nicht

Und verwende bei Robocopy mal den Parameter /Log+
Member: Pat.bat
Pat.bat Jan 15, 2019 at 14:05:25 (UTC)
Goto Top
Danke, das nutze ich dann so, passt super.