skynetworks
Goto Top

Batch Dateien verschieben in Verzeichis welches Bestandteil des Dateinamens ist

Hallo zusammen,

ich habe eine kleine Herausforderung:
Ich muss per Batch Dateien in Unterverzeichnisse verschieben.
Soweit erstmal nicht schwer face-smile
Die Dateien haben unterschiedliche Dateiendungen, enthalten aber alle gleichermaßen das Sortierkennzeichen ABE_123 wobei ABE_ immer gleich bleibt und sich nur die 3 stellige Nummer ändert.
Gleichermaßen gibt es auch einen Verzeichnisbaum, die sich - hier im Beispiel - mit ABE_123 bzw. ABE_ und der 3 stelligen Nummer decken, wo die Dateien dann reingeschoben werden sollen.
Man müßte also aus dem Dateinamen den String ABE_123 in eine Variable schreiben, mit welcher sich der move Befehl dann einfach zusammenbauen läßt und eine For-Schleife bauen, die alle Dateien im Quellverzeichnis abarbeitet.
Vielleicht hat jemand einen praktischen Tip für mich.

Danke & viele Grüße
Thomas

Content-ID: 278269

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

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

SeriousEE
SeriousEE 24.07.2015 um 14:54:47 Uhr
Goto Top
Hi,

Mein Lösungsansatz (fast immer in Powershell) wäre folgender:

$sourcepath = "C:\sourcefolder\"   
$destpath = "C:\destination\"  
$files = Get-ChildItem -Path $sourcepath
if ($files -ne $null) {
   foreach ($file in $files) {
     $subfolder = $file.Name.Substring(0,7)
     $subfolder = $subfolder.Substring(4)
     $destinationfolder = $destpath + "ABE_"+$subfolder  
     if (-Not (Test-Path $destinationfolder)) {
        New-Item $destinationfolder -type directory
     }
     Move-Item $file.Fullname $destinationfolder
   }
}

Grüße
skynetworks
skynetworks 24.07.2015 um 17:14:40 Uhr
Goto Top
Hi,

danke für die schnelle Antwort!

Ich glaube hier passt es noch nicht ganz:

06.

$subfolder = $file.Name.Substring(0,7)

07.

$subfolder = $subfolder.Substring(4)

Die Dateinamen um die es geht sind recht unterschiedlich, z.B. Informationsblatt_ABE_123.pdf oder Anleitung_ABE_123_4711.doc.
Das Sortierkennzeichen ABE_123 kommt in jedem Dateinamen vor, aber immer an unterschiedlichen Stellen.

Viele Grüße
Thomas
Gersen
Lösung Gersen 24.07.2015 aktualisiert um 23:15:26 Uhr
Goto Top
Hallo,

ergänzend zur Vorarbeit des Kollegen:
$regex = [regex]"ABE_\d{3}"
foreach ($file in $files) {
   $subfolder=$regex.Matches($file.name).Value
   $destinationfolder = $destpath + $subfolder
   ...

Gruß,
Gersen
colinardo
Lösung colinardo 24.07.2015 aktualisiert um 23:15:21 Uhr
Goto Top
Und das ganze dann noch etwas verkürzt face-smile
$sourcepath = 'C:\quelle'  
$destination = 'C:\ziel'  
gci $sourcepath | ?{!$_.PSIsContainer -and $_.BaseName -match '(ABE_\d{3})'} | %{  
    $dest = "$destination\$($matches[1])"  
    if (!(Test-Path $dest)){md $dest}
    move-item $_.Fullname $dest
}
Grüße Uwe
skynetworks
skynetworks 24.07.2015 um 23:15:14 Uhr
Goto Top
Hallo Leute,

echt super - funktioniert nun mit dem Script von Uwe einwandfrei face-smile face-smile face-smile
Tausend dank an alle!

Viele Grüße
Thomas