# Rename in batch datei auf die Ordnerstruktur beziehen



## SamySE (7. Juni 2017)

Hallo zusammen,

auf unserem Server wird zur Zeit eine cmd-Datei mit folgendem Inhalt ausgeführt:

robocopy D:\Shares\Prog\LCS\LOHN\ARCHIVIERUNG\WINLOG\LOHNDRUCK\2017\01\ABRECH0 D:\Shares\Prog\LCS\LOHN\ARCHIVIERUNG\WINLOG\LOHNDRUCK\DMS *.pdf /M


```
@Echo off %debug%
setlocal enabledelayedexpansion
for %%i in (PERSONALNR*.pdf) do (
 set x=%%i
 rename "%%i" "!x:pERSONAL=2017_01_!"
)
```

Es handelt sich um Abrechnungen, welche für jeden Monat erzeugt und in folgenden Pfad gelegt werden: _*"D:\Shares\Prog\LCS\LOHN\ARCHIVIERUNG\WINLOG\LOHNDRUCK\2017\01\ABRECH0"*_

Hierbei werden die PDF Dateien zuerst per Robocopy in unser Archivierungsverzeichnis kopiert und im Anschluss mit Jahr und dem entsprechenden Datum versehen.

*Archivierungsverzeichnis: "D:\Shares\Prog\LCS\LOHN\ARCHIVIERUNG\WINLOG\LOHNDRUCK\DMS"*

Grundsätzlich funktioniert das Ganze auch ganz gut. Das Problem hierbei ist allerdings das die Datei für jeden Monat angepasst werden muss. Zusätzlich kommt noch dazu, dass es zu jedem Monat "beliebig" viele Unterordner geben kann.
Da der Code keine Unterverzeichnisse miteinbezieht, muss also je Monat und je Unterverzeichnis die Datei angepackt werden. (um dann den Verzeichnispfad, sowie den Monat abzuändern).


Meine Überlegung wäre nun, ob man die Dateien bezogen auf deren Ordnerstrukturen umbenennen könnte, da im Abschnitt *"2017\01\ABRECH0" (Jahr/Monat/Abrechnung0..1..2..3..4 usw) *im Prinzip genau das steht was auch in den Dateinamen soll.

Grundsätzlich ist es egal ob das Problem per .bat, .cmd...usw. gelöst wird, ich bin also für jegliche Anregungen offen.

*Hier noch der Dateiname einer Ursprungsdatei:* _PERSONALNR900901168 20170511_101255_409_
*und ein Dateiname nachdem der Code durchgelaufen ist:* _2017_04_NR900901168 20170511_101255_409_

Vielen Dank im Voraus!


----------



## Sp1r1t (8. Juni 2017)

Hallo,

ich hab mir das ganze jetzt mal angeschaut, werde aber nicht ganz schlau aus dem wie du das jetzt schlussendlich umsetzen willst.
Ich habe verstanden was du mehr oder weniger erreichen willst. Und hätte schon ein paar Ansätze aber ich verstehe wie gesagt noch nicht ganze wie du in die Batch schreiben willst das er die Dateien in unterschiedlichen Ordner unterschiedlich benennen soll. Wie willst du ihm mitteilen in welche Datei er es schieben soll, wenn sich das ganze ändert. 

Du könntest das ganze über eine User bezogene Abfrage regeln

Ich wäre froh wenn du den Punkt nochmal genauer erläutern könntest. Stehe dann auch gerne noch mit Rat und Tat zur Seite. 

Mit freundlichen Grüßen

Sp1r1t


----------



## HonniCilest (8. Juni 2017)

Ich finde das hat er eigentlich beantwortet, er will sich dabei an den Ordnernamen selbst orientieren.

Ich habe hier ein Beispiel in Powershell:


```
cls
$quellPfad = "C:\tutorials\LOHNDRUCK"
$zielPfad = "C:\tutorials\DMS"
gci $quellPfad -Include *.pdf -recurse | %{
    $jahr = $_.Directory.Parent.Parent.Name
    $monat = $_.Directory.Parent.Name
   
    $prefix = $jahr, $monat, '' -join '_'
    $neuerName = $_.Name -replace 'PERSONAL', $prefix
    cp -Path $_.FullName -Destination "$zielPfad\$neuerName"
}
```

In dem Beispiel ist nur noch nicht behandelt, dass du immer wieder jeden verfügbaren Monat kopierst, also auch 2016\x etc.


----------



## SamySE (9. Juni 2017)

Sp1r1t hat gesagt.:


> Hallo,
> 
> ich hab mir das ganze jetzt mal angeschaut, werde aber nicht ganz schlau aus dem wie du das jetzt schlussendlich umsetzen willst.
> Ich habe verstanden was du mehr oder weniger erreichen willst. Und hätte schon ein paar Ansätze aber ich verstehe wie gesagt noch nicht ganze wie du in die Batch schreiben willst das er die Dateien in unterschiedlichen Ordner unterschiedlich benennen soll. Wie willst du ihm mitteilen in welche Datei er es schieben soll, wenn sich das ganze ändert.
> ...



Hallo Sp1r1t,

vielen Dank für deine Anwort! Im Grunde geht es mir darum, dass der rename-Befehl die jeweiligen Dateinamen nicht mit bereits vorgegeben Werten befüllt (also nicht wie im Beispiel oben: _rename "%%i" "!xERSONAL=2017_01_!_), sondern die einzelnen Dateien nach dem Ordnerpfad benennt in dem sie liegen.

Also falls eine Datei im Januar Ordner, liegt, dann sollte 01 vor die Datei geschrieben werden, falls eine Datei im Februar Ordner liegt, dann soll nach dem kopieren eine 02 davor gehängt werden, usw..

Mit freundlichen Grüßen,
SamySE


----------



## Sp1r1t (9. Juni 2017)

Hallo SamySE,

vielen dank für die Aufklärung. Ich denke ich hab jetzt verstanden worauf du hinaus willst.
Ich weiß nicht ob du das PowerShell Script von HonniCilest schon getestet hast und ob es funktioniert.
Allerdings ist PowerShell jetzt nicht meine Stärke.

----------------------------------------------------------------------------------------------------------------------------

danke auch dir HonniCilest, dass du kompetere Hilfe leisten konntest als ich.

Mit freundlichen Grüßen

Sp1r1t


----------

