derwowusste
Goto Top

Text in mehreren .docx suchen und ersetzen

Moin Kollegen.

Ich hoffe auf Antworten von Leuten, die genau das per Tool schon mal gemacht haben:
Selektiere mehrere Ordner und suche dort in allen .docx (nicht .doc!) nach einem bestimmten Text und ersetze diesen.

Es scheitert bei diversen Tools daran, dass sie nicht mit docx umgehen können. Ein simples Word-Makro bekommt das auch ganz gut hin, jedoch scheitert es daran, dass man mit diesem Makro zwar multiselect auf Freigaben machen kann, nicht aber auf Sharepoint-Webdavverzeichnissen... was leider ebenso gefordert ist.

Content-Key: 353463

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

Printed on: April 26, 2024 at 18:04 o'clock

Member: Yannosch
Yannosch Nov 02, 2017 at 15:21:56 (UTC)
Goto Top
Hi!

https://sourceforge.net/projects/findandreplace/

Könnte dir das weiterhelfen?

Grüße
Yannosch
Member: Yannosch
Yannosch Nov 02, 2017 updated at 15:30:14 (UTC)
Goto Top
Sorry... das o.g. Programm kann leider nur xml und html.

Das hätte ich noch im Angebot ... ist wohl auf Batch-Basis.
1


Ich bin mir allerdings sicher, dass man da etwas mit Powershell basteln kann.
Mitglied: 117471
117471 Nov 02, 2017 at 15:52:10 (UTC)
Goto Top
Hallo,

Zitat von @DerWoWusste:

Es scheitert bei diversen Tools daran, dass sie nicht mit docx umgehen können.

Dann benenn' die doch in .zip um - dann hast Du was zum auspacken. Ernsthaft - das sind einfach "nur" ZIP-Archive mit XML-Dateien. K.A., ob Dir das jetzt weiterhilft...

Gruß,
Jörg
Member: DerWoWusste
DerWoWusste Nov 02, 2017 at 17:02:59 (UTC)
Goto Top
Moin Yannosch.

Ich bin mir allerdings sicher, dass man da etwas mit Powershell basteln kann.
Das ist keine Anforderung. Es wäre aber wichtig, dass Sharepointlaufwerke funktionieren.

Man kann diese als Netzlaufwerk verbinden dann geht auch das Makro, fiel gerade auf.
Ich werde das Tool morgen mal testen, danke.
Member: sabines
sabines Nov 03, 2017 updated at 05:44:48 (UTC)
Goto Top
Moin,

genau an diesen Anforderungen bin ich letzte Woche gescheitert.
Das was ich gefunden habe konnte mit DOCX nichts anfangen und die Tools die damit etwas anfangen können, waren zu teuer bzw konnte ich nicht testen, zumal das für einen Kunden aus meiner ehemaligen Selbständigkeit war.

Meine Lösung: Addidas Makro und ein Praktikant, es waren allerdings nur rund 100 docx.

Kannst Du die Sharepoint Dateien u.U. für diese Aktion auf eine Freigabe verschieben und dannach wieder zurück?

Gruß

Nachtrag: Jetzt fällts mir wieder ein, das Problem war die Kopf und Fusszeile, hier sollte was ersetzt werden.
Member: emeriks
emeriks Nov 03, 2017 at 09:11:05 (UTC)
Goto Top
Addidas Makro
lol
Diesen Spruch kannte ich noch gar nicht! Freitag gerettet ...
Member: DerWoWusste
DerWoWusste Nov 03, 2017 at 10:54:17 (UTC)
Goto Top
@Yannosch: getestet. Das Tool kommt mit Sharepoint nicht zurecht, es kennt die Mechanismen check out und check in nicht einmal. Leider unbrauchbar.

@sabines - ja, ein Makro haben wir ja und das läuft auch gut. Wir werden dabei bleiben. Die Dateien zu verschioeben oder gar (@FA-jka) die Dateien in .zip umzubenennen, bedeutet zuviel Aufwand. Das Makro kann ja auch mir Sharepoint arbeiten - jedoch erst, nachdem man den Pfad als Netzlaufwerk verbunden hat - allein das störte mich noch, aber damit können wir leben.
Member: colinardo
Solution colinardo Nov 03, 2017 at 11:11:44 (UTC)
Goto Top
Servus DWW,
dazu habe ich mal ein kleines Powershell-Script geschrieben um ohne installiertes Word bestimmte Strings im Dokument zu ersetzen.

# Benötigt wird mindestens NET-Framework 4.5 und Powershell 3.0

# Ersetzungsteile
$placeholder = "Mustermann"  
$replacement = "Meier"  

# Pfad inkl Dateifilter
$filespec = "D:\word\*.docx"  

# benötigte Assemblies laden
Add-Type -AssemblyName System.IO.Compression
Add-Type -AssemblyName System.IO.Compression.Filesystem

gci $filespec -File | %{
    write-host "Working on file '$($_.Fullname)' ..." -F Green  
    # Word-Dokument als ZIP-Datei im Update-Modus öffnen
    $zipfile = [System.IO.Compression.ZipFile]::Open($_.FullName,[System.IO.Compression.ZipArchiveMode]::Update)
    
    # Einträge der benötigte Dateien aus dem Dokument holen
    $entries = $zipfile.Entries | ?{$_.FullName -match '^(word/(document|footnotes|endnotes)\.xml|word/(header|footer)\d*\.xml)$'}   
    $remove = @()
    $entries | %{
        $tmp = "$env:TEMP\$($_.Name)"  
        # word/document.xml extrahieren
        [System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$tmp)

        # Datei als XML Object laden
        $xml = new-object xml
        $xml.Load($tmp)
        if ($xml.DocumentElement.InnerText -match [regex]::Escape($placeholder)){
            # Einträge in Nodes ersetzen
            $xml.SelectNodes("//*/text()") | ?{$_.InnerText -match [regex]::Escape($placeholder)} | %{$_.InnerText = $_.InnerText -replace [regex]::Escape($placeholder),$replacement}  
            # XML speichern
            $xml.Save($tmp)
            # geänderte Datei wieder hinzufügen
            [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zipfile,$tmp,$_.FullName) | out-null
            $remove += $_
        }
        # Temporäre Files löschen
        del $tmp -Force -ErrorAction SilentlyContinue
    }
    # lösche ersetzte Dokumentteile im ZIP
    $remove | %{$_.Delete()}

    # Zipfile-Resourcen freigeben
    $zipfile.Dispose()
}
Da ich hier gerade kein Sharepoint zur Verfügung habe, kann ich mich deinem Problem mit deinen WebDAV Pfaden nicht widmen, aber schnell als Laufwerk mounten sollte ja kein Problem darstellen.

Viel Spaß
Grüße Uwe
Member: DerWoWusste
DerWoWusste Nov 03, 2017 updated at 14:00:51 (UTC)
Goto Top
Moin Uwe.

Das funktioniert natürlich auch, aber es kennt nicht check-out/check-in, so dass es für Sharepointpfade nicht läuft. Check-out zieht die Frage "Bearbeitung aktivieren?" nach sich, welche das Word-makro offenbar bejaht und Dein Skript nicht.
Member: colinardo
Solution colinardo Nov 03, 2017 updated at 14:47:49 (UTC)
Goto Top
Also für Sharepoint und Document Libraries gibt es nativen Support für Powershell und Checkout() und Checkin() Methoden für die Dokumente.
$site = Get-SPWeb "<URL>"  
$site.GetFile("FILEXYZ").CheckOut()  
Natürlich dann die ganze Liste der Files durchackern/filtern.

Leider mangels Sharepoint kann ich es hier leider nicht evaluieren und dir was skripten.
Member: DerWoWusste
DerWoWusste Nov 03, 2017 at 14:59:45 (UTC)
Goto Top
Sehr interessant. Werde ich den SP-Entwicklern mal zeigen, danke!
Member: colinardo
colinardo Nov 03, 2017 updated at 15:03:59 (UTC)
Goto Top
Sollte dir auch helfen --> nach dem Checkout kopieren eines Files lokal:
http://www.jbmurphy.com/2012/04/25/powershell-script-to-copy-a-sharepoi ...
Dann kannst du es bearbeiten und wieder hochladen.
Entsprechende Methoden zum Upload hier zu finden
https://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spfile_met ...
Member: DerWoWusste
DerWoWusste Nov 03, 2017 at 15:04:36 (UTC)
Goto Top
Werden wir sicherlich mal erkunden - erneut danke!
Member: colinardo
colinardo Nov 03, 2017 updated at 15:06:09 (UTC)
Goto Top
Keine Ursache. Irgendwann muss ich mir mal wieder das "Monster" Sharepoint virtuell aufsetzen, nur momentan keine Zeit.