cleverm
Goto Top

Dateien automatisch anhand von 2 komplizierten Dateinamen-Strings verschieben

Hallo,

ich bräuchte eine Batch oder Batch-Powershell Kombination, die mir 1.000ende Dateien täglich anhand des Dateinamens verschiebt (einsortiert):


Ich habe 6 Quellordner in denen jeweils Dateien liegen, die in Unterordner\Unterordner verschoben werden sollen.

Die Dateinamen sind anhand folgender Logik aufgebaut:
(Beliebiger Text)_(13stellige Nr)_(13stellige Nr)_(Datum im Format JJJJMMTT)_(Beliebiger Text).txt

Beliebiger Text können Buchstaben und/oder Zahlenkombinationen und _ sein !!!


Erste Unterordner-Ebene soll das Jahr im Format JJJJ sein.
Zweite Unterordner-Ebene soll die erste 13 stellige Nr sein.

Der Zweite Unterordner muss sofern er nicht existiert erstellt werden.


Die Suche müsste also vermutlich folgender maßen aussehen:
Unterordner-Ebene 1: Suche von rechts erstes Ergebnis mit genau "_ 8 Ziffern _" und davon die ersten 4 Ziffern von links
oder
Unterordner-Ebene 1: "_ 13 Ziffern _ 13 Ziffern _" darauf folgende 4 Ziffern
Unterordner-Ebene 2: Suche von links erstes Ergebnis mit genau "_ 13 Ziffern _"


Bsp.:

Quell-Dateien:
L:\LF\Kategorie1\abcdelll_1234567890123_2345678901234_20160305_E_C17413752E.txt
L:\LF\Kategorie1\aklmdelll_4567890123456_2345678901234_20150101_AC17413752E.txt
L:\LF\Kategorie2\ttcdelll_1234567890123_2345678901234_20160101_BC3752E.txt
L:\LF\Kategorie3\fbcdelvl__1234567890123_2345678901234_20160101_17413752E.txt
L:\LF\Kategorie4\abcdelll_1234567890123_2345678901234_20160101_ZC1741112E.txt

Ziel:
L:\LF\Kategorie1\2016\1234567890123\abcdelll_1234567890123_2345678901234_20160305_E_C17413752E.txt
L:\LF\Kategorie1\2015\4567890123456\aklmdelll_4567890123456_2345678901234_20160101_AC17413752E.txt
L:\LF\Kategorie2\2016\1234567890123\ttcdelll_1234567890123_2345678901234_20160101_BC3752E.txt
L:\LF\Kategorie3\2016\1234567890123\fbcdelvl__1234567890123_2345678901234_20160101_17413752E.txt
L:\LF\Kategorie4\2016\1234567890123\abcdelll_1234567890123_2345678901234_20160101_ZC1741112E.txt


Danke und Gruß
cleverm

Content-Key: 317160

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

Printed on: April 19, 2024 at 08:04 o'clock

Member: colinardo
Solution colinardo Oct 07, 2016 updated at 11:50:13 (UTC)
Goto Top
Servus @cleverm,
kein Problem, hatten wir hier schon ziemlich oft das Thema mit Skripten en masse wenn man mal die Suchfunktion bemüht hätte ... mit ein bisschen Regex kein Hexenwerk ...
Wenn die Dateien immer direkt in der obersten ebene der Kategorieordner liegen (L:\LF\KategorieN) dann so:
$folder = 'L:\LF\*\*'  
gci $folder -Filter *.txt | ?{$_.Basename -match '^.*?_(\d{13})_\d{13}_(\d{4})'} | %{  
    $target = "$($_.DirectoryName)\$($matches[2])\$($matches[1])"  
    if (!(Test-Path $target)){md $target -Force | out-null}
    move-item $_.FullName -Destination $target -Force
}
Grüße Uwe
Member: cleverm
cleverm Oct 11, 2016 at 12:13:52 (UTC)
Goto Top
Hallo colinardo,

Vielen Dank für die schnelle Antwort.

Als Powershell funktioniert sie einwandfrei.

Brauche es jedoch als aufrufbare Batch, die dann das PS Script mit den -Executionpolicy Bypass -Command ausführt und scheitere daran als Anfänger gerade kläglich.

Gruß cleverm
Member: colinardo
Solution colinardo Oct 11, 2016 at 13:01:48 (UTC)
Goto Top
Schreib das doch gleich ...
@echo off
set "folder=L:\LF\*\*"  
powershell -Executionpolicy ByPass -Command "gci '%folder%' -Filter *.txt | ?{$_.Basename -match '^.*?_(\d{13})_\d{13}_(\d{4})'} | %%{$target = $_.DirectoryName + '\' + $matches[2] + '\' + $matches[1]; if (!(Test-Path $target)){md $target -Force | out-null}; move-item $_.FullName -Destination $target -Force}"