Powershell search matching string in word document

ms-word, powershell, powershell-2.0, regex, search

Solution

#ERROR REPORTING ALL
Set-StrictMode -Version latest
$path     = "c:\Temp"
$files    = Get-Childitem $path -Include *.docx,*.doc -Recurse | Where-Object { !($_.psiscontainer) }
$output   = "c:\temp\wordfiletry.csv"
$application = New-Object -comobject word.application
$application.visible = $False
$findtext = "First"
$charactersAround = 30
$results = @{}

Function getStringMatch
{
    # Loop through all *.doc files in the $path directory
    Foreach ($file In $files)
    {
        $document = $application.documents.open($file.FullName,$false,$true)
        $range = $document.content

        If($range.Text -match ".{$($charactersAround)}$($findtext).{$($charactersAround)}"){
             $properties = @{
                File = $file.FullName
                Match = $findtext
                TextAround = $Matches[0] 
             }
             $results += New-Object -TypeName PsCustomObject -Property $properties
        }
    }

    If($results){
        $results | Export-Csv $output -NoTypeInformation
    }

    $document.close()
    $application.quit()
}

getStringMatch

import-csv $output

There are a couple of ways to get what you want. A simple approach is since you have the text of the document already lets perform a regex match on it and return the results and more. This helps in trying to address getting some words around in document.

We have the variable `$charactersAround` which sets the number of characters to match around the `$findtext`. Also I though the output was a better fit for a CSV file so I used `$results` to capture a hashtable of properties that, in the end, are output to a csv file.

Be sure to change the variables for your own testing. Now that we are using regex to locate the matches this opens up a world of possibilities.

Sample Output

Match TextAround                                                        File                          
----- ----------                                                        ----                          
First dley Air Services Limited dba First Air meets or exceeds all term C:\Temp\20120315132117214.docx

Problem

I have a simple requirement. I need to search a string in Word document and as result I need to get matching line / some words around in document. So far, I could successfully search a string in folder containing Word documents but it returns True / False based on whether it could find search string or not. ``` #ERROR REPORTING ALL Set-StrictMode -Version latest $path = "c:\MORLAB" $files = Get-Childitem $path -Include *.docx,*.doc -Recurse | Where-Object { !($_.psiscontainer) } $output = "c:\wordfiletry.txt" $application = New-Object -comobject word.application $application.visible = $False $findtext = "CRHPCD01" Function getStringMatch { # Loop through all *.doc files in the $path directory Foreach ($file In $files) { $document = $application.documents.open($file.FullName,$false,$true) $range = $document.content $wordFound = $range.find.execute($findText) if($wordFound) { "$file.fullname has $wordfound" | Out-File $output -Append } } $document.close() $application.quit() } getStringMatch ```

Original source