speedz
Goto Top

Dateinamen zerlegen und Datei anhand dreier Kriterien verschieben

Hallo Community,

ich habe eine Frage zum Zerlegen eines Dateinamens in verschiedene Strings und dem anschließenden verschieben der Datei.

Ich habe PDF Dateien die wie folgt aufgebaut sind:

LS1-BE17-300026.pdf
RG2-BE18-300100.pdf
RG1-RP17-600124.pdf
DOK2-AN18-101074.pdf

Wichtig an dem Namen ist nur der mittlere und der letzte Teil da die Dokumente in verschiedene Ordner geschoben werden sollen.

Die Ordnerstruktur sieht wie folgt aus:

Ordner Angebote (Dokumente mit AN im zweiten Token)
...2017
... 2018
101074
...2019
...

Ordner Bestellungen (Dokumente mit BE im zweiten Token)
...2017
300026
...2018
300100
...2019
...

Ordner Reparaturen (Dokumente mit RP im zweiten Token)
...2017
600124
...2018
...2019
...

Jetzt sollen die PDF Dateien anhand Ihres Namens in die Ordner verschoben werden.
Im mittleren Teil der PDF zeigen die ersten beiden Buchstaben die erste Ordnerstruktur, die nächsten beiden Zahlen den Ordner mit der Jahreszahl und der letzte Teil des Dateinamens den endgültigen Zielordner.

Vorher war meine Ordnerstruktur etwas einfacher, da habe ich folgende Code benutzt:

pushd "%PfadServer%\%Scanverzeichnis%"  

FOR /F "delims=" %%i in ('dir /b/a-d "*"') do (  
	FOR /F "tokens=3 delims=-." %%a in ("%%i") do (  
		md "%Dokumentenablage%\%%a" 2>nul  
		move "*%%a*.*" "%Dokumentenablage%\%%a"  
	)
 )

Wie kann ich diesen Code jetzt weiter aufdröseln und auf die neue Situation anpassen bzw. speziell den Token in der Mitte in 2 Teile auflösen? Im Prinzip muss die Schleife ja 2 Abfragen durchlaufen. Einmal nachdem der erste Teil ausgelesen wurde und dann nach dem auslesen des zweiten Teils.

Danke schon einmal für eure Hilfe, Speedz

Content-Key: 372302

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

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

Member: Pedant
Solution Pedant Apr 26, 2018 updated at 08:06:29 (UTC)
Goto Top
Hallo Speedz,

damit solltest Du die Aufgabe lösen können.

Batch
@echo off

setlocal EnableDelayedExpansion

FOR /F "delims=" %%i in ('dir /b/a-d "*.pdf"') do (  
	FOR /F "tokens=2,3 delims=-." %%a in ("%%i") do (  
		set typ=%%a
		set typ=!typ:~0,2!
		set jahr=%%a
		set jahr=20!jahr:~2,2!
		set name=%%b
		echo Mach was damit: !typ! !jahr! !name!
	)
)


Ausgabe
Mach was damit: AN 2018 101074
Mach was damit: BE 2017 300026
Mach was damit: RP 2017 600124
Mach was damit: BE 2018 300100


Gruß Frank
Mitglied: 136037
136037 Apr 26, 2018 at 08:58:32 (UTC)
Goto Top
Oder du machst es mit der Powershell:
gci 'D:\Ordner\*.pdf' -File | group {$_.Name.Split('-')[1].Substring(0,2)} | %{  
    $targetfolder = ''  
    switch ($_.Name){
        'RP' {$targetfolder = 'D:\Reparaturen' }  
        'BE' {$targetfolder = 'D:\Bestellungen'}  
        'AN' {$targetfolder = 'D:\Angebote'}  
    }
    $_.Group | %{
        $parts = $_.Basename.Split('-')  
        $folder = "$targetfolder\20$($parts[1].Substring(2,2))\$($parts[2])"  
        if(!(Test-Path $folder)){md $folder -Force | out-null}
        $_ | move-item -destination $folder -verbose
    }
}
Member: NetzwerkDude
NetzwerkDude Apr 26, 2018 at 08:59:40 (UTC)
Goto Top
Hier ein Vorschlag wie man es in PowerShell machen könnte
(Ich bin kein Profi in RegEx, für deine mitgegebenen Dateinamensbeispiele funktioniert es, aber kann sein das es zu unerwarteten fehlern kommt falls die Dateinamen arg anders sind face-smile)

$Input = Get-ChildItem -Filter *.pdf

foreach ($pdf in $Input) {

    #Mit RegEx Checken was zwischen den Bindestrichen steht
    $null = $pdf -match '\-(.*?)\-'  
    $MiddlePart = $Matches.1

    #Mit RegEx Checken nach dem Bindestrich an Zahlen steht
    $null = $pdf -match '\-(\d+).'  
    $EndPart = $Matches.1

    #die Mittelteile in Ordernamen übersetzen
    if ($MiddlePart.Remove(2) -like "AN" ) {  
        $Ordner = "Angebote"  
    }

    elseif ($MiddlePart.Remove(2) -like "BE" ) {  
        $Ordner = "Bestellungen"  
    }

    elseif ($MiddlePart.Remove(2) -like "RP" ) {  
        $Ordner = "Reparaturen"  
    }

    #Zielpfad basteln
    $Jahr = $MiddlePart.Substring(2)
    $Destination = ".\$Ordner\20$Jahr\$EndPart\"  

    #Ordner erstellen (bzw. fehlermeldung unterdrücken falls es den schon gibt) 
    New-Item -ItemType Directory -Path $Destination -ErrorAction SilentlyContinue

    #Move to appropriate Folder
    Move-Item $pdf -Destination $Destination

}
Member: Speedz
Speedz Apr 26, 2018 updated at 12:37:11 (UTC)
Goto Top
Hallo zusammen,

da PowerShell Skripte auf dem Server deaktiviert sind, habe ich Dank des Codes von Pedant nun folgende funktionierende Lösung:


pushd "%PfadServer%\%Scanverzeichnis%"  

FOR /F "delims=" %%i in ('dir /b/a-d "*.pdf"') do (   
	FOR /F "tokens=2,3 delims=-." %%a in ("%%i") do (   
		set typ=%%a 
		set typ=!typ:~0,2! 
		set jahr=%%a 
		set jahr=20!jahr:~2,2! 
		set name=%%b 

		IF "!typ:~0,2!" == "BE" (  
			md "%PfadServer%\%Dokumentenablage%\Bestellung\"20!jahr:~2,2!"\%%b" 2>nul  
			move %%i "%PfadServer%\%Dokumentenablage%\Bestellung\"20!jahr:~2,2!"\%%b\%%i"  
		) ELSE (
		IF "!typ:~0,2!" == "AN" (  
			md "%PfadServer%\%Dokumentenablage%\Angebot\"20!jahr:~2,2!"\%%b" 2>nul  
			move %%i "%PfadServer%\%Dokumentenablage%\Angebot\"20!jahr:~2,2!"\%%b\%%i"  
		) ELSE (
		IF "!typ:~0,2!" == "RP" (  
			md "%PfadServer%\%Dokumentenablage%\Reparatur\"20!jahr:~2,2!"\%%b" 2>nul  
			move %%i "%PfadServer%\%Dokumentenablage%\Reparatur\"20!jahr:~2,2!"\%%b\%%i"  
		)))
	)
)

popd

Vielen Dank an Alle für die schnelle Hilfe!