baraban
Goto Top

Powershell - PDF mit einer .csv umbenennen

Hallo zusammen,

mir wurde vor einigen Tagen hier im Forum sehr gut geholfen und ich hoffe, dass ich bei einem weiteren Problem nun auch Hilfe bekommen könnte. Tut mir leid, dass es eine Art Auftragsarbeit ist, ich weiß auf die Schnelle jedoch keine andere Möglichkeit bei dem Thema weiterzukommen. Also vielen herzlichen Dank für jeden der sich der Sache annimmt:

Ich habe in einem Ordner mehrere PDF Dateien die ich umbenennen möchte. Die dazu nötigen Informationen kommen immer per .csv

PDF Name: 64_4_626_378859_61012428_41219099.pdf

.CSV ist folgendermaßen aufgebaut:

pdf_umbenennen_2

Ich möchte nun mit Powershell, dass mir die PDF anhand der .csv mit folgender Syntax umbenannt wird:

Inhaber 1_Unterbelegart_Gattungsbezeichnung_Datum.pdf

Wäre super wenn sich jemand erbarmen könnte. Vielen Dank im Voraus und beste Grüße
Baraban

Content-ID: 1508498852

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

Ausgedruckt am: 19.11.2024 um 22:11 Uhr

149569
149569 15.11.2021 um 13:02:36 Uhr
Goto Top
$csvfile = 'D:\test.csv'  
$folder = 'D:\quelle'  
$csv = Import-CSV $csvfile -Delimiter ";"  
foreach($pdf in (Get-ChildItem $folder -File -Filter *.pdf)){
    $item = $csv | ?{$_.Versandkey -eq $pdf.Name}
    if ($item){
        $newname = "$($item.'Inhaber 1')_$($item.Unterbelegart)_$($item.Gattungsbezeichnung)_$($item.Datum).pdf" -replace '["<>\|:\*\?\\/]',"_"  
        Rename-Item $pdf.Fullname -NewName $newname -verbose
    }
}
Baraban
Baraban 15.11.2021 um 13:39:57 Uhr
Goto Top
Hi Hacktor,

vielen herzlichen Dank für deine blitzschnelle Hilfe! Der Script funktioniert fast perfekt.

Kann man auch alle .csv Dateien unabhängig vom Namen in einem Order abarbeiten lassen, damit diese nicht manuell eingegeben werden müssen? (Es kommt täglich eine .csv samt den PDFs)

Die .csv ist nicht im UTF8, somit werden die Umlaute kryptisch dargestellt. Kann man hier mit einem entsprechenden Befehl die .csv entweder direkt in UTF8 konvertieren oder einlesen, ohne dass ich diese manuell anfassen muss?

Danke dir vielmals!
149569
Lösung 149569 15.11.2021 aktualisiert um 14:52:28 Uhr
Goto Top
Zitat von @Baraban:
Kann man auch alle .csv Dateien unabhängig vom Namen in einem Order abarbeiten lassen, damit diese nicht manuell eingegeben werden müssen? (Es kommt täglich eine .csv samt den PDFs)
Die .csv ist nicht im UTF8, somit werden die Umlaute kryptisch dargestellt. Kann man hier mit einem entsprechenden Befehl die .csv entweder direkt in UTF8 konvertieren oder einlesen, ohne dass ich diese manuell anfassen muss?

$folder = 'D:\quelle'  
$csv = @()
Get-ChildItem $folder -File -Filter *.csv | %{
    $csv += Import-CSV $_.FullName -Delimiter ";" -Encoding Default  
}
foreach($pdf in (Get-ChildItem $folder -File -Filter *.pdf)){
    $item = $csv | ?{$_.Versandkey -eq $pdf.Name} | select -First 1
    if ($item){
        $newname = "$($item.'Inhaber 1')_$($item.Unterbelegart)_$($item.Gattungsbezeichnung)_$($item.Datum).pdf" -replace '["<>\|:\*\?\\/]',"_"  
        Rename-Item $pdf.Fullname -NewName $newname -verbose
    }
}
Encoding der CSV Dateien in Zeile 4 am Ende an das Encoding deiner Dateien anpassen dann passt es auch mit den Umlauten ...
Baraban
Baraban 15.11.2021 aktualisiert um 16:40:18 Uhr
Goto Top
Vielen herzlichen Dank hacktor!

Siehst du eventuell eine Möglichkeit beim Datum die 00:00 über Powershell nicht im Dateinamen auszugeben?

Jetzt kommt 30.09.21 00_00_00_ raus

unbenannt

Eventuell nur die ersten 8 Zeichen beim Datum ausgeben?!

Beste Grüße
149569
149569 15.11.2021 aktualisiert um 16:57:43 Uhr
Goto Top
Jetzt kommt 30.09.21 00_00_00_ raus
Das habe ich gemacht da Doppelpunkte in Dateinamen ungültig sind...
Klar, wenn du die Zeit weglassen willst bspw. einfach mit Split die Variable trennen ...
$item.Datum.split(" ")  
...
$folder = 'D:\quelle'  
$csv = @()
Get-ChildItem $folder -File -Filter *.csv | %{
    $csv += Import-CSV $_.FullName -Delimiter ";" -Encoding Default  
}
foreach($pdf in (Get-ChildItem $folder -File -Filter *.pdf)){
    $item = $csv | ?{$_.Versandkey -eq $pdf.Name} | select -First 1
    if ($item){
        $newname = "$($item.'Inhaber 1')_$($item.Unterbelegart)_$($item.Gattungsbezeichnung)_$($item.Datum.split(" ")).pdf" -replace '["<>\|:\*\?\\/]',"_"  
        Rename-Item $pdf.Fullname -NewName $newname -verbose
    }
}
Baraban
Baraban 15.11.2021 um 17:01:39 Uhr
Goto Top
Fantastisch! Funktioniert! Danke dir vielmals!