erik10
Goto Top

Batch für Verschieben von Datein, vergleichen, löschen und umbennen

Hallo zusammen,

ich möchte gern Dateien aus bestimmten Ordnern verschieben und dabei vorher umbenennen, das ein order andere habe ich schon gelöst, allerdings bräuchte ich noch ein paar Hilfestellungen.

Am Besten ich versuche erstmal zu erklären was passieren soll: Die Lohnabrechnungen der Mitarbeiter werden vom System automatisch in einer festen Struktur abgelegt, diese möchte auslesen und umbenennen und in ein Verzeichnis verschieben, das mit dem FTP-Server synchronisiert wird und für die Mitarbeiter dann online abrufbar sind.

Ich habe in einem Pfad mehrere Unterordner:

P:\Verwaltung\Abgleich
die Unterordner sind dann wie folgt:
2012
2013
2014
2015
in den jeweiligen Ordnern für die Jahre gibt es dann wieder Unterordner der Monate von 01-12.
In diesen Monatsordnern sind dann wiederum nochmals Unterordner, die ABRECH0, ABRECH1, ABRECH2, etc... lauten können, ABRECH0 ist immer vohanden, alle weiteren KÖNNEN vorhanden sein.
In diesen ABRECHx sind dann die eigentlichen Dateien von unseren Mitarbeitern, diese heißen in der Regel PERSONALNRXXXX, wobei das XXX für die eigentliche Zahl steht. Wurde über das Abrechnungsprogramm sich die Lohnabrechnung erneut anzeigen lassen, ohne dabei die Funktion "Archivdatei ersetzen" zu aktivieren, wird die vorhandene Datei PERSONALNRXXXX in PERSONALNRXXXX DATUM/UHRZEIT umbenannt und die neue Datei heißt dann PERSONALNRXXXX. ich möchte immer nur die letzten Datein haben, also PERSONALNRXXXX DATUM/UHRZEIT soll ignoriert werden (es ist immer ein Leerzeichen zwischen der Personalnummer und des Datums was angehangen wird, ansonsten sind keine Leerzeichen im Namen vorhanden).

Anhand dieser Pfade kann man erkennen, um welche Lohnabrechnung es sich für diesen Mitarbeiter handelt, also: Jahr, Monat, AbrechnungX (X=0 ist 1. ABrechnung, X=1 ist eine Rückrechnung, X=2 ebenfalls eine Rückrechnung). Genaues Beispiel: Im Ordner 2015, Unterordner 01, Unterordner ABRECH0, Datei PERSONALNR1 ist die Lohnabrechnung des Mitarbeiters mit der Personalnr 1 für den Abrechnungsmonat Januar im Jahr 2015.

So weit zum Quellverzeichnis face-smile

Das Zielverzeichnis ist so aufgebaut, dass jede Personalnummer einen eigenen Ordner besitzt:
100
101
102
.
.
.
In diesen Ordnern der Personalnummern sollen jetzt die Lohnabrechnungen eingefügt werden, allerdings schon umbenannt, also im Quellverzeichnis heißen die Lohnabrechnungen immer PERSONALNRXXX - und das jeden Monat. Wenn ich diese jetzt in einen Ordner kopiere, würden diese ja immer ersetzt werden oder es würde nichts kopiert werden. Das ist aber nicht Sinn und Zweck. Daher soll im Zielordner die Dateien wie folgt benannt werden:

Lohnabrechnung_JAHR-MONAT_#PERSONALNR wenn die Dateien aus den ABRECH0 Ordner kommen
Lohnabrechnung_JAHR-MONAT_Korrektur_in_ABRECHJAHR-ABRECHMONAT_#PERSONALNR wenn diese aus den Ordnern ABRECH1, ABRECH2, ..., kommen
JAHR = Ordnername des Jahres (beispielsweise 2015)
MONAT = Ordnername des Monats aus dem Überordnern des Jahres (beispielsweise 01)
PERSONALNR ist die reine Nummer des Mitarbeiters, ohne den Text PERSONALNR (beispielsweise 100)
ABRECHJAHR/ABRECHMMONAT ist das Jahr bzw. der Monat, in dem die Korrekturabrechnung erstellt wurde, Beispiel: Der Mitarbeiter 100 hat im März eine Korrekturabrechnung seiner Januarabrechnung erhalten. Diese wäre im Verzeichnis: 2015/01/ABRECH2 zu finden. Wieso ABRECH2? Weil das System rechnet, ABRECHMONAT (01) + ABRECHx (in diesem Fall 2) = ABRECHMONAT 03. Die Datei soll also in Lohnabrechnung_2015-01_Korrektur_in_2015-03_#100 umbenannt werden und in den Ordner des Mitarbeiters verschoben werden. Ist eine Abrechnung in ABRECH0 vorhanden, soll diese in Lohnabrechnung_2015-01_#100 umbenannt werden und in den Ordner des Mitarbeiters verschoben werden.

So weit so gut, jetzt zu dem was ich schon habe:

Ich kopiere mir die Dateien aus den Ordnern in ein Temp Verzeichnis, somit weiß ich, welches Jahr, Monat und welche Abrechnung (ABRECHX) es betrifft.
Danach kürze ich die Namen auf PERSONALNRXXXX mit folgendem Skript:

for %%i in (*.pdf) do for /f %%a in ("%%~ni") do ren "%%i" "%%a%%~xi"  

Nach dem kürzen auf PERSONALNRXXX (Dateien die eventuell DATUM/Uhrzeit hinten dran haben) lösche ich per Hand die Datein mit DATUM/UHRZEIT, wenn PERSONALNRXXX vorhanden ist, und deswegen PERSONALNRXXX DATUM/UHRZEIT nicht umbenannt werden kann. Anschließend mache ich über den TotalCommander eine Massenumbenennung in den Dateinamen wie ich es haben möchte (alles noch im Temp Verzeichnis). Jetzt habe ich also die Dateien im korrekten Namen: Lohnabrechnung_2015-01_#100 und das für jeden Mitarbeiter der in diesem Abrechnungsmonat/-jahr eine Lohnabrechnung erhalten hat.
Jetzt verschiebe ich die Dateien in die zugehörigen Ordner im Zielverzeichnis mit folgenden Befehlen:
rem @echo off

rem %%i = vollständiger Dateiname
rem %%j = Personalnummer hinter "#" und vor "." im Dateinamen  

set SRC=P:\Verwaltung\Abgleich_Website\temp
set DEST=P:\Verwaltung\Abgleich_Website\Webserver\Lohnabrechnungen

for /F %%i in ('dir /b %SRC% ^| find "#"') do (for /F "delims=#. tokens=2" %%j in ("%%i") do (md %DEST%\%%j 2>nul   
move /Y %SRC%\%%i %DEST%\%%j\ 2>nul
if %errorlevel% EQU 0 (
			echo Datei  %%i erfolgreich nach  %DEST%\%%j\  kopiert
		) else (
			echo FEHLER beim Verarbeiten der Datei  %%i
		)))

Anschließend kopiere ich mir die nächsten Dateien wieder aus dem Quellverzeichnis in meinen Temp ordner und fange von vorne an...

Könnten wir zusammen ein Script erstellen was mir die Arbeit erleichtert? Das wäre echt fantastisch, weil ich rückwirkend aus dem Jahre 2006 für jeden Monat das durchführen muss...

Die Dateien dürfen nicht im Quellverzeichnis umbenannt werden, da ich monatlich synchronisieren muss, was sich seit der letzten Abrechnung geändert hat - sind zum Beispiel für vorangegangene Monate Korrekturen erstellt worden. Das verwendete Quellverzeichnis ist nämlich eine Kopie des eigentlichen Archivs unseres Abrechnungsprogrammes. Dieses lasse ich mit meinem Quellverzeichnis via TotalCommander synchronisieren und schaue welche Dateien im Archiv des Abrechnungsprogramm hinzugekommen sind. Wäre natürlich klasse, wenn die Batch-Datei das auch vorher synchronisieren (alle Unterordner und das Datum ignorieren) könnte.

Vielen lieben Dank,

Erik

Content-Key: 280193

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

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