malawi
Goto Top

PDF-Datei anhand vom Datum im Dateinamen in Unterordnerstruktur verschieben (PowerShell)

Hallo zusammen,

ich habe folgende Anforderung:

Es werden von einer Maschine Reports im PDF-Format in das Verzeichnis "\\server\share\reports\" abgelegt.

Die automatisch erzeugten Reports sehen in etwa so aus:

MaschinenBericht_L1_2017_07_20.pdf
MaschinenBericht_L1L_2017_07_20.pdf
MaschinenBericht_L4_2017_07_19.pdf
usw... (man beachte, dass die Zeichen zwischen den ersten beiden Unterstrichen sowohl 2 als auch 3 sein können)

Die Datei "MaschinenBericht_L1_2017_07_20.pdf" müsste jetzt z.B. in einen Pfad kopiert werden, der so aussieht:

\\server\share\reports_sortiert\L1\2017\07\20\

und als "Maschinenbericht.pdf" abgespeichert werden. (Der Dateiname kann aber auch der Alte bleiben)


Ich habe keinen blassen Schimmer wie ich da heran gehen soll. PowerShell Kenntnisse habe ich nahezu keine. Das bisschen Grundwissen reicht für eine solche Aufgabe nicht aus. Ich weiß, dass es bereits einige Threads diesbezüglich gibt, aber ich kann auch mit der vorgegebenen Syntax nur wenig anfangen.

Ist jemand dazu bereit mir zu helfen, auch wenn mir "nur" der Weg in die richtige Richtung gezeigt wird. Vielleicht fällt mir das erlernen des entstehenden Skripts so leichter.

Da die Berichte oft erst einen Tag nach ihrem eigentlichen Datum generiert werden, fällt auch das Auslesen des Dateierstellungsdatums weg.

Vielen lieben Dank!

Grüße

Content-ID: 344006

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

Ausgedruckt am: 25.11.2024 um 07:11 Uhr

colinardo
colinardo 20.07.2017 aktualisiert um 12:04:43 Uhr
Goto Top
Servus @kevische,
# Quellordner
$source = '\\server\share\reports'  
# Zielordner
$target = '\\server\share\reports_sortiert'  
# Dateien mit den Namen in Gruppen einordnen auf Basis des Dateinamens wobei die Token direkt mit Backslash für die Ordnererzeugung versehen werden
gci $source -Filter *.pdf -File | group {$_.Basename -replace '^[^_]+_([^_]+)_(\d{4})_(\d{2})_(\d{2})$','$1\$2\$3\$4'} | %{  
    # Zielordner zusammensetzen
    $targetfolder = "$target\$($_.Name)"  
    # Zielordner erstellen sofern er noch nicht existiert
    if(!(Test-Path $targetfolder)){md $targetfolder | out-null}
    # Dateigruppe in den Zielordner verschieben
    $_.Group | move-item -Destination $targetfolder -Force -Verbose
}
Kommentare im Code

Grüße Uwe
malawi
malawi 20.07.2017 um 12:28:36 Uhr
Goto Top
Hallo colinardo,

mir ist das ein Rätsel wie man sowas so schnell hinbekommt. Weißt du die Syntax hierfür aus dem Kopf?

Vielen Dank, dass du mir sogar schon direkt ein fertiges Skript anbietest.

Ich werde es mal testen. Den Thread lasse ich vorerst offen, falls ich noch Fragen habe.

Gruß
colinardo
colinardo 20.07.2017 aktualisiert um 12:36:02 Uhr
Goto Top
Weißt du die Syntax hierfür aus dem Kopf?
Ja, Regex ist für Programmierer normalweise wie eine zweite Muttersprache face-wink
Für dich hier nachzulesen: Regular Expressions Tutorial

Noch kurz etwas zum Verständnis der Vorgehensweise des Skripts.

Die Zeile die hier die Hauptarbeit macht ist diese:
gci $source -Filter *.pdf -File | group {$_.Basename -replace '^[^_]+_([^_]+)_(\d{4})_(\d{2})_(\d{2})$','$1\$2\$3\$4'}
Sie gruppiert die Dateien im Verzeichnis anhand des Dateinamens und deines gewünschten Musters indem mit einem Regex die extrahierten Token (Gruppen in den Klammern) neu angeordnet werden, und zwar in deiner Reihenfolge und zusätzlichen Backslashes dazwischen. Die Backslashes dienen in den folgenden Befehlen der effizienten Weiterverwendung als direkten Pfadteil.
Wenn du diese Zeile alleine ausführen würdest sähe das Ergebnis nach der Gruppierung wie folgt aus

screenshot

Du siehst der Gruppenname ($_.Name) ist Quasi der Teilbaum für das neue Verzeichnis. Unter ($_.Group) siehst du die dazugehörigen Dateien. Gäbe es mehrere Dateien mit dem selben Teilbaum im Verzeichnis würdest du hier mehrere Dateien sehen.

Mit dem Teilbaum wird zusammen mit dem $target der Zielpfad zusammengesetzt und wenn der Ordner noch nicht existiert wird er erstellt. Zum Schluss wird in der Schleife die $_.Group (also alle Dateien dieser Gruppe) in den Zielordner verschoben.

Hoffe das klärt deine Fragezeichen ein bisschen.
malawi
malawi 20.07.2017 um 12:38:27 Uhr
Goto Top
Vielen Dank für deine Mühe. Das Skript funktioniert tadellos. Ich werde etwas Zeit benötigen um mich rein zu arbeiten. Dafür würde ich, wie gesagt, den Thread noch offen lassen.

Gruß
malawi
malawi 20.07.2017 um 12:51:06 Uhr
Goto Top
Ist es generell möglich, die Dateien vor oder nach dem Verschieben direkt an einen Drucker zu senden?

Gruß
colinardo
Lösung colinardo 20.07.2017 aktualisiert um 13:00:15 Uhr
Goto Top
Zitat von @malawi:
Ist es generell möglich, die Dateien vor oder nach dem Verschieben direkt an einen Drucker zu senden?
Ist es, dazu habe ich hier mal Powershell-Funktionen für PDF-Dateien geschrieben, du findest sie hier:
PDF via Powershell drucken - Reader nach druck schließen

[OT]
Das wird jetzt aber hoffentlich kein Thread ala "wie mach ich das und das und das?". Hast du spezifische neue Fragen die nichts mehr mit der ursprünglichen Frage zu tun haben, bitte entweder einen neuen Thread erstellen, oder mich via PM anschreiben.

Wir wollen die User die hier vorbei schauen ja nicht verwirren indem hier andere Themen behandelt werden face-wink. Merci.
[/OT]
malawi
malawi 20.07.2017 um 13:11:36 Uhr
Goto Top
Vielen Dank! Die ursprüngliche Frage ist somit erledigt. Das Skript funktioniert. Bei Fragen wende ich mich per PM an dich!

Schönen Resttag noch face-smile