kaya33
Goto Top

Dateinamen anpassen (Word-Dateien)

Hallo zusammen

Ich habe viele Word-Dateien, welche in Unterverzeichnissen verteilt abgelegt sind. Die Dateinamen sollen wie folgt angepasst werden:

Der Dateiname soll sich aus dem Anderungsdatum (Nur Jahreszahl: JJJJ) und aus dem Text, aus einer (immer gleichen) bestimmten Stelle (siehe Bild im Anhang) innerhalb des Dokuments zusammensetzen. Geht so was?


Die Datei heisst aktuell "501_122.docx"

Nach der Aktion soll dann so heissen: 2001-277_R-150-12.docx

Anschliessend sollen die Dateien jeweils in den gleichen Ordner wie Originale gespeichert werden.

Ich bedanke mich ganz herzlich für jede Hilfe!

Beste Grüsse
Kaya
2022-02-11_19h02_27

Content-ID: 1891944384

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

Ausgedruckt am: 22.11.2024 um 11:11 Uhr

SeaStorm
SeaStorm 11.02.2022 um 22:22:11 Uhr
Goto Top
Aha und was hast du dazu bisher gemacht und wo ist das Problem?
fritzo
fritzo 11.02.2022 um 23:57:11 Uhr
Goto Top
Hallo Kaya,

hier schon einmal eine Scriptlogik, mit der Du die Jahreszahlen des Änderungsdatums auslesen kannst, die Variable $jahr im Foreach-Loop enthält das jeweilige Jahr des Timestamps.
$pfad = "d:\dokumente"  
$dokumente = gci -Filter *.docx -Recurse
foreach ($dokument in $dokumente)
{
    $jahr = $dokument.LastWriteTime.Year
}

Ich habe MS Office leider nicht installiert und kann deswegen keine Routine zum Auslesen der bestimmten Stelle im Dokument testen. Grundsätzlich dürfte sich das aber in etwa über das COM-Objekt von Word machen lassen, siehe unten (kein lauffähiger Code) und den String muss man sich da noch herausparsen - z.B. mit einem Regex, der den Text zwischen "Nr. " und " xxxxxxxx" zurückgibt):

Im Scriptheader oberhalb des Foreach-Loops:
$word = New-Object -ComObject Word.Application
$word.visible = false

Im Loop:
$file = $word.Documents.Open($dokument)
$range = $dokument.Content
$nummer = $dokument.Paragraphs[3].range.Text
kaya33
kaya33 12.02.2022 um 10:42:01 Uhr
Goto Top
Vielen herzlichen Dank für dein Input! Ich werde mal versuchen es hinzukriegen.

Beste Grüsse
Kaya
colinardo
Lösung colinardo 12.02.2022 aktualisiert um 14:47:42 Uhr
Goto Top
Servus Kaya,
sofern die Nummer tatsächlich einen Unterstrich nach der ersten Nummer besitzt 277_R-150-12 und kein Leerzeichen (sieht man leider wegen der Unterstreichung nicht), dann probiere mal folgendes.
Ansonsten muss der Regex (Zeile 11) entsprechend an deine Situation angepasst werden, dazu müssten wir dann aber entweder mehr über die mögliche Zusammensetzung der Nummer wissen oder was nach ihr kommt falls dort ein Konstanter Wert steht.
# ordner mit den Dateien
$folder = 'D:\Docs'  
# Word Objekt erzeugen
$objWord = New-Object -Com Word.Application -P @{Visible=$false;DisplayAlerts=0}
# für alle Word-Dokumente rekursiv im Ordner
foreach ($file in Get-ChildItem "$folder\*.do[ct][xm]" -File -Recurse){  
    try{
        # öffne Dokument
        $doc = $objWord.Documents.Open($file.Fullname,$false,$true)
        # extrahiere Nummer
        $number = [regex]::match($doc.Content.Text,'(?i)Nr.\s*([^\s]+)').Groups[1].Value  
        # schließe Dokument
        [void]$doc.Close($false)
        # wenn eine Nummer extrahiert werden konnte
        if ($number){
            # baue neuen Dateinamen zusammen
            $newname = "$($file.LastWriteTime.Year)-$number$($file.Extension)"  
            # und benenne Datei um
            $file | rename-item -NewName $newname -Force -verbose
        }else{
            throw "Number not found in '$($file.Fullname)', please check content or used regex pattern!"  
        }
    }catch{
        write-host $_.Exception.Message -F Red
    }
}
# Alerts wieder einschalten
$objWord.DisplayAlerts=-1
# Word beenden und COM Resourcen wieder freigeben
[void]$objWord.Quit()
[void][System.Runtime.InteropServices.Marshal]::ReleaseComObject($objWord)
Grüße Uwe
fritzo
fritzo 12.02.2022 um 13:16:52 Uhr
Goto Top
@uwe - nice!
kaya33
kaya33 12.02.2022 um 14:16:57 Uhr
Goto Top
Hallo SeaStorm

Ich habe auch nicht verstanden, was ihr Problem ist?

Ich wünsche Ihnen trotzdem schöne Zeit!
kaya33
kaya33 12.02.2022 um 14:21:04 Uhr
Goto Top
Hallo Uwe

Vielen herzlichen Dank, ich werde es heute Abend testen.

Beste Grüsse
Kaya