147900
Goto Top

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

Content-Key: 660631

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

Printed on: April 27, 2024 at 02:04 o'clock

Member: mayho33
mayho33 Mar 09, 2021 at 23:47:17 (UTC)
Goto Top
Mit robocopy bzw. REGEX könntest du das in Powershell. Per Batch wird regex wohl nicht möglich sein.
Mitglied: 147669
147669 Mar 10, 2021 updated at 10:00:14 (UTC)
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
Mitglied: 147900
147900 Mar 12, 2021 at 08:13:48 (UTC)
Goto Top
Vielen Dank, allerdings funktioniert es irgendwie nicht.
Mitglied: 147669
147669 Mar 12, 2021 updated at 09:25:50 (UTC)
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.
Mitglied: 147900
147900 Mar 12, 2021 at 12:34:01 (UTC)
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
Mitglied: 147669
147669 Mar 12, 2021 updated at 13:07:31 (UTC)
Goto Top
Skript hat falsche Kodierung... Wurde oben getestet, funktioniert hier einwandfrei.
Mitglied: 147900
147900 Mar 12, 2021 at 13:15:04 (UTC)
Goto Top
Danke, Welche Kodierung wäre denn die richtige?

Gruß und ein Schönes Wochenende
Mitglied: 147669
147669 Mar 12, 2021 updated at 16:03:04 (UTC)
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.
Member: mayho33
mayho33 Mar 13, 2021 updated at 00:38:50 (UTC)
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.
Mitglied: 147900
Solution 147900 Mar 15, 2021 updated at 08:49:44 (UTC)
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  
    }
}