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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1891944384
Url: https://administrator.de/contentid/1891944384
Ausgedruckt am: 22.11.2024 um 11:11 Uhr
7 Kommentare
Neuester Kommentar
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.
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:
Im Loop:
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
Servus Kaya,
sofern die Nummer tatsächlich einen Unterstrich nach der ersten Nummer besitzt
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.
Grüße Uwe
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)