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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 344006
Url: https://administrator.de/contentid/344006
Ausgedruckt am: 25.11.2024 um 07:11 Uhr
7 Kommentare
Neuester Kommentar
Servus @kevische,
Kommentare im Code
Grüße Uwe
# 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
}
Grüße Uwe
Weißt du die Syntax hierfür aus dem Kopf?
Ja, Regex ist für Programmierer normalweise wie eine zweite Muttersprache 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'}
Wenn du diese Zeile alleine ausführen würdest sähe das Ergebnis nach der Gruppierung wie folgt aus
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.
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:Ist es generell möglich, die Dateien vor oder nach dem Verschieben direkt an einen Drucker zu senden?
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 . Merci.
[/OT]