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-Key: 344006

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

Printed on: April 20, 2024 at 01:04 o'clock

Member: colinardo
colinardo Jul 20, 2017 updated at 10:04:43 (UTC)
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
Member: malawi
malawi Jul 20, 2017 at 10:28:36 (UTC)
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ß
Member: colinardo
colinardo Jul 20, 2017 updated at 10:36:02 (UTC)
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.
Member: malawi
malawi Jul 20, 2017 at 10:38:27 (UTC)
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ß
Member: malawi
malawi Jul 20, 2017 at 10:51:06 (UTC)
Goto Top
Ist es generell möglich, die Dateien vor oder nach dem Verschieben direkt an einen Drucker zu senden?

Gruß
Member: colinardo
Solution colinardo Jul 20, 2017 updated at 11:00:15 (UTC)
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]
Member: malawi
malawi Jul 20, 2017 at 11:11:36 (UTC)
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