none
Text in Word-Dokument finden und ersetzen (in gezeichneten Formen) RRS feed

  • Frage

  • Hallo zusammen,

    folgender Code sollte eigentlich gesuchten Text in einem MS Word-Dokument finden und ersetzen:

    $Document = "C:\test\hiersuchen.docx"
    $FindText = "TextInEinerForm"
    $ReplaceText = "HiermitErsetzen"
    
    $ReplaceAll = 2
    $FindContinue = 1
    $MatchCase = $false
    $MatchWholeWord = $True
    $MatchWildcards = $false
    $MatchSoundsLike = $false
    $MatchAllWordForms = $false
    $Forward = $True
    $Wrap = $FindContinue
    $Format = $false
    
    $Word = New-Object -Comobject Word.Application
    $Word.Visible = $True
    
    $OpenDoc = $Word.Documents.Open($Document)
    $Selection = $Word.Selection
    
    $Selection.Find.Execute(
    $FindText,
    $MatchCase,
    $MatchWholeWord,
    $MatchWildcards,
    $MatchSoundsLike,
    $MatchAllWordForms,
    $Forward,
    $Wrap,
    $Format,
    $ReplaceText,
    $ReplaceAll
    ) | Out-Null
    
    if ($Selection.Find.Found) { 
    	Write-Host("The search text was found.")
    } else { 
    	Write-Host("The search text was not found.")
    } 
    
    #$OpenDoc.Close()
    #$Word.Quit()

    Das funktioniert, wenn der gesuchte Text normal in das Dokument getippt worden ist. Ich habe allerdings ein Docx, in dem jeglicher Text in "Text Feldern" steht, also gezeichneten Formen. Damit meine ich zum Beispiel Rechtecke, die über das "Einfügen"-Menü eingefügt, gefärbt etc. und schließlich mit Text versehen werden können.

    In diesen Feldern/Formen sucht der obere Code nicht, folglich kann ich den Text in den Formen nicht mit PowerShell ersetzen. Ich habe schon versucht, die verschiedenen Suchattribute von false auf true und umgekehrt zu setzen, was aber nicht half. Welche Eigenschaft muss ich per PowerShell an Word übergeben, damit auch in Textfeldern gesucht wird?

    Ich bin über jede Hilfe dankbar,

    Scriptex


    • Bearbeitet Scriptex Freitag, 19. Dezember 2014 10:36
    Freitag, 19. Dezember 2014 10:35

Antworten

  • Der Text den du suchst is in einem "shape".

    Die Anzahl aller shapes bekommst du mit

    $OpenDoc = $Word.Documents.Open($Document)$openDoc.shapes.count

    Den Text bekommst du mit

    $opendoc.shapes|foreach {$_.textframe.textrange.text}

    Jetzt musst du nur noch die Strings vergleichen und den Text neu setzen.

    Edith meint so geht es:

    $Document = "C:\!\ps\test.docx"
    $FindText = "nun1"
    $ReplaceText = "nun2"
    
    $Word = New-Object -Comobject Word.Application
    $Word.Visible = $True
    
    $OpenDoc = $Word.Documents.Open($Document)
    
    foreach ($shape in $opendoc.shapes)
    {
        write-host $shape.textframe.textrange.text
        $text=$shape.textframe.textrange.text.trimend([char]13)
        if ($text -eq $FindText)
        {
            write-host "replace"$FindText "with" $ReplaceText
            $shape.textframe.textrange.text=$ReplaceText
        }
    }
    
    $OpenDoc.Close()
    $Word.Quit()

    Nochmal die Edith:
    Jetzt geht es. Die Strings aus Word Shapes haben ein [char]13 am Ende.
    Wenn man das trimt klappt auch der String Vergleich.

    Gruß



    Freitag, 19. Dezember 2014 16:27

Alle Antworten

  • Der Text den du suchst is in einem "shape".

    Die Anzahl aller shapes bekommst du mit

    $OpenDoc = $Word.Documents.Open($Document)$openDoc.shapes.count

    Den Text bekommst du mit

    $opendoc.shapes|foreach {$_.textframe.textrange.text}

    Jetzt musst du nur noch die Strings vergleichen und den Text neu setzen.

    Edith meint so geht es:

    $Document = "C:\!\ps\test.docx"
    $FindText = "nun1"
    $ReplaceText = "nun2"
    
    $Word = New-Object -Comobject Word.Application
    $Word.Visible = $True
    
    $OpenDoc = $Word.Documents.Open($Document)
    
    foreach ($shape in $opendoc.shapes)
    {
        write-host $shape.textframe.textrange.text
        $text=$shape.textframe.textrange.text.trimend([char]13)
        if ($text -eq $FindText)
        {
            write-host "replace"$FindText "with" $ReplaceText
            $shape.textframe.textrange.text=$ReplaceText
        }
    }
    
    $OpenDoc.Close()
    $Word.Quit()

    Nochmal die Edith:
    Jetzt geht es. Die Strings aus Word Shapes haben ein [char]13 am Ende.
    Wenn man das trimt klappt auch der String Vergleich.

    Gruß



    Freitag, 19. Dezember 2014 16:27
  • Hallo deroppi,

    der Code funktioniert! Ab Montag kann ich zwar erst wieder produktiv testen, aber ich denke das Problem hat sich damit gelöst.

    Dankeschön!

    Gruß

    Scriptex

    Sonntag, 21. Dezember 2014 13:04