147900

Dateien Auf Dateinamen basierend kopieren und einfügen

Hallo,

Zu Beginn, ich habe keine richtigen Berührungspunkte mit Batch und/oder Powershell.
Trotzdessen.. Ich habe ein Mitarbeiterverzeichnis aufgesetzt für dieses ich nun eine Lösung suche, welche Dokumente per Script automatisiert in das erwähnte Verzeichnis kopiert. Die zu kopierenden Dokumente liegen derzeit alle in einem Ordner und sollen in den jeweiligen Unterordner des Verzeichnis kopiert werden. Die Dateinamen der Dokumente sind wie folgt aufgebaut.

Bsp.: ABCD_123456_1234567_12345_XX.pdf/
Auch: ABCD_123456_1234567_12345_XXXX.pdf/

XX/XXXX in diesem Fall die Variablen, welche in der Zuordnung eine Rolle spielen. Die Zielverzeichnisse enthalten diese auch. Derzeit gibt es etwa fünfzig Stück.

Mir stellt sich nun die Frage ob es eine Möglichkeit gibt sich beim Auslesen lediglich an den Variablen zwischen dem dritten underscore und dem .fileext zu orientieren, da diese variieren und evtl. eine dreistellige und/oder fünfstellige Variable hinzukommt. Die Suchfunktion habe ich bereits genutzt aber nichts gefunden, dass genau dem gegebenen Beispiel entspricht.

Soll-Bsp.: C:/ABCD_123456_1234567_12345_99 -> \\17.11.19.91\Verzeichnis\99_ABCD\
C:/ABCD_123456_1234567_12345_9999 -> \\17.11.19.91\Verzeichnis\9999_ABCD\

evtl. C:/ABCD_123456_1234567_12345_999 -> \\17.11.19.91\Verzeichnis\999_ABCD\
C:/ABCD_123456_1234567_12345_99999 -> \\17.11.19.91\Verzeichnis\99999_ABCD\
usw.

Vielleicht hat hier jemand eine Idee oder zumindest einen konkreten Denkanstoß in welche Richtung ich mich orientieren muss.


Vielen Dank im Voraus.


BlackArch
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 660631

Url: https://administrator.de/forum/dateien-auf-dateinamen-basierend-kopieren-und-einfuegen-660631.html

Ausgedruckt am: 17.05.2025 um 08:05 Uhr

mayho33
mayho33 10.03.2021 um 00:47:17 Uhr
Goto Top
Mit robocopy bzw. REGEX könntest du das in Powershell. Per Batch wird regex wohl nicht möglich sein.
147669
147669 10.03.2021 aktualisiert um 11:00:14 Uhr
Goto Top
$quelle = 'D:\Quelle'  
$ziel = 'F:\ziel'  
ls $quelle -File -Filter *.pdf | ?{$_.Basename -match '_(\d+)$'} | %{  
    $newfolder = ls "$ziel\$($matches[1])_*" -Directory  
    if ($newfolder){
        $_ | move -Destination $newfolder.FullName -Verbose
    }else{
        write-host "Ein Verzeichnis mit der Bezeichnung : $($matches[1])_* gibt es im Zielordner noch nicht."  
    }
}
Gruß SK
147900
147900 12.03.2021 um 09:13:48 Uhr
Goto Top
Vielen Dank, allerdings funktioniert es irgendwie nicht.
147669
147669 12.03.2021 aktualisiert um 10:25:50 Uhr
Goto Top
Zitat von @147900:

Vielen Dank, allerdings funktioniert es irgendwie nicht.
Diese nichtssagenden Aussagen liebe ich hier ja, besonders an Freitagen und das in einem Admin-Forum, Koppschüttel!! 🐟

Das obige Powershell-Skript (wie man sehen kann) ist auf deine Beschreibung oben angepasst und funktioniert hier im Test einwandfrei, wenn es bei dir also nicht läuft hast du entweder das Teil versucht als Batch auszuführen oder hast deine Parameter oben nicht exakt genug spezifiziert!

Das Skript oben geht alle *.pdf Dateien eines Verzeichnisses durch welche im Basename der Datei am Ende einen Unterstrich "_" gefolgt von einer oder mehreren Zahlen besitzen. Damit wird im Zielordner versucht mit dieser Zahlenkombination die im RegexMatch steht einen Unterordner zu finden der mit dieser Zahl einem Unterstrich und beliebig folgenden anderen Zeichen zu finden. War das erfolgreich wird die die PDF-Datei in diesen Ordner verschoben, also ganz einfach und logisch aufgebaut.
147900
147900 12.03.2021 um 13:34:01 Uhr
Goto Top
Sorry, vorhin auf .txt geändert um zu testen und bekomme;

In Zeile:3 Zeichen:56
+ ls $quelle -File -Filter *.txt | ?{$_.Basename -match '_(\d+)$'} | %{
~
Unerwartetes Token "_" in Ausdruck oder Anweisung.
In Zeile:3 Zeichen:63
+ ls $quelle -File -Filter *.txt | ?{$_.Basename -match '_(\d+)$'} | %{
~~~~~~~
Die Zeichenfolge hat kein Abschlusszeichen: '.
+ CategoryInfo : ParserError: (face-smile , ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken

War zu der Zeit auch schon ein wenig weiter als zu Anfang

$Destination = "C:\Users\X\Quelle"  
Get-ChildItem "C:\Users\X\Ziel1" | ForEach-Object {  
    $Endung = ($_.BaseName -split '_')[-2]  
    $Filter = "*_{1}" -f $Endung  
    $DestDir = Get-ChildItem $Destination -Filter $Filter -Directory | Select-Object FullName -First 1
    if ($DestDir) {
        Copy-Item $_.FullName $DestDir -Force
    } else {
        "Kein Verzeichnis {0} in Directory {1} gefunden" -f $Filter, $Destination | Write-Host  
    }
}
Laufe dort allerdings auch auf...

Fehler beim Formatieren einer Zeichenfolge: Der Index, basierend auf 0 (null), muss größer als oder gleich Null sein, und kleiner als die Größe der Argumentenliste..
In Zeile:4 Zeichen:5
+ $Filter = "*_{1}" -f $Tail
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (*_{1}:String) , RuntimeException
+ FullyQualifiedErrorId : FormatError

Copy-Item : Das Laufwerk wurde nicht gefunden. Ein Laufwerk mit dem Namen "@{FullName=C" ist nicht vorhanden.
In Zeile:7 Zeichen:9
+ Copy-Item $_.FullName $DestDir -Force
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (@{FullName=C:String) [Copy-Item], DriveNotFoundException
+ FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.CopyItemCommand
147669
147669 12.03.2021 aktualisiert um 14:07:31 Uhr
Goto Top
Skript hat falsche Kodierung... Wurde oben getestet, funktioniert hier einwandfrei.
147900
147900 12.03.2021 um 14:15:04 Uhr
Goto Top
Danke, Welche Kodierung wäre denn die richtige?

Gruß und ein Schönes Wochenende
147669
147669 12.03.2021 aktualisiert um 17:03:04 Uhr
Goto Top
UTF-8 bzw. Ansi. Die Fehlermeldung oben deutet darauf hin das du bei Speichern in einem Editor die falsche Kodierung gesetzt hast, Kommt bei PS Neulingen immer mal wieder vor.
mayho33
mayho33 13.03.2021 aktualisiert um 01:38:50 Uhr
Goto Top
Zitat von @147900:

Danke, Welche Kodierung wäre denn die richtige?

Gruß und ein Schönes Wochenende

Den Text in NotePad kopieren. Standardmäßig ist das UTF-8 kodiert. Und von dort wieder in die PS kopieren. Das sollte funktionieren. Kenne das von VBS-Zeiten.
147900
Lösung 147900 15.03.2021 aktualisiert um 09:49:44 Uhr
Goto Top
$Destination = "C:\Users\X\Desktop\Ziel1"  
Get-ChildItem "C:\Users\X\Desktop\Quelle" | ForEach-Object {  
    $Endung = ($_.BaseName -split '_')[-2]  
    $Filter = "*_{0}" -f $Endung  
    $DestDir = Get-ChildItem $Destination -Filter $Filter -Directory | Select-Object -ExpandProperty FullName -First 1
    if ($DestDir) {
        Copy-Item $_.FullName $DestDir -Force
    } else {
        "Kein Verzeichnis gefunden, welches dem Filter {0} in Verzeichnis {1} entspricht" -f $Filter, $Destination | Write-Host  
    }
}