2017-02-15 4 views
0

Ich fand ein großes Powershell-Skript online, mit dem Sie den Inhalt von Excel-Dokumenten nach einem bestimmten Wort durchsuchen können, und ich habe es an meine Bedürfnisse angepasst.Finden Sie Methoden für MS Word

Jetzt möchte ich Funktionalität zum Durchsuchen der Inhalte von Word-Dokumenten hinzufügen, aber ich bin schwer zu finden, die Methoden (?) Ich muss verwenden.

Verzeihen Sie, wenn ich die Terminologie bezüglich Klasse und Methode falsch verstanden habe, ist das für mich Neuland.

Dies ist die der vorhandene Code für das Skript:

$SearchDest = Read-Host "Where do you want to search?" 
$Destination = 'C:\temp' 
$SearchText = 'myword' 
$Excel = New-Object -ComObject Excel.Application 

$Files = Get-ChildItem "$SearchDest\*.xlsx" | Select-Object -Expand FullName 
$counter = 1 

ForEach($File in $Files) { 

    Write-Progress -Activity "Checking: $file" -Status "File $counter of $($files.count)" ` 
        -PercentComplete ($counter * 100/$files.Count) 

    $Workbook = $Excel.Workbooks.Open($File) 

    If($Workbook.Sheets.Item(1).Range("A:Z").Find($SearchText)) { 
     $Workbook.Close($false) 
     Copy-Item -Path $File -Destination $Destination 
     "Copied $file to $destination" 
     break 
    } 

    $Workbook.Close($false) 
    $counter++ 
} 

und ich versuche, herauszufinden, was das Äquivalent zu $Excel.Workbooks.Open($File) usw. ist.

+0

Haben Sie versucht, für Word basierte Skripte suchen, um die Methoden, um Sie suchen ? – Matt

Antwort

2

Hier ist eine Lösung, die für DOCX-Dateien über einen Ordner Schleife und die Dateien für ein Wort oder einen Satz suchen:

[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Interop.Word") 

# create a word app object 
Write-Host 'creating word app object' 

$word = New-Object -ComObject Word.Application 
$word.Visible = $True 

$docs = Get-ChildItem -Path 'C:\Path\To\WordDocs\' -Filter '*.docx' | select -ExpandProperty Fullname 

# options for the search 
$findText   = 'DataFolder' # alter this to find the word you're interested in 
$matchCase   = $false 
$matchWholeWord = $true 
$matchWildCards = $false 
$matchSoundsLike = $false 
$matchAllWordForms = $false 
$forward   = $true 
$wrap    = 1 

$docs | ForEach-Object { 
    $docPath = $_ 
    Write-Host "opening $docPath" -NoNewline 

    $doc = $word.Documents.Open($docPath) 

    $range = $doc.Content 
    [void]$range.MoveStart() 

    $wordFound = $range.Find.Execute($findText,$matchCase,$matchWholeWord,$matchWildCards,$matchSoundsLike,$matchAllWordForms,$forward,$wrap) 

    if ($wordFound) { 
    # do something meaningful here 
    } 
    # for now, we'll output a list of files and if the word was found 
    [PSCustomObject]@{ 
    FilePath = $docPath 
    WordToFind = $findText 
    WordFound = $wordFound 
    } 

    $doc.Close() 
} 

# clean up after ourselves 
$null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$word) 
[GC]::Collect() 
[GC]::WaitForPendingFinalizers() 
Remove-Variable word 
+0

Hi Techspud, danke für die Antwort auf mein Problem. Können Sie mir sagen, wie Sie herausgefunden haben, welche Methoden Sie verwenden? Gibt es irgendwo eine Liste, die word.application.documents usw. auflistet? – MondQ

+0

Google & StackOverflow :). Nicht wirklich. Google, wie man einen String in einem Word-Dokument findet und es gibt einen Scripting Guys-Artikel, der einige Details gibt. Außerdem wurden das Schleifen, Öffnen/Schließen und Aufräumen auch aus früheren Google- und SO-Suchanfragen ermittelt. Können Sie als vollständig markieren, wenn dies Ihre Frage beantwortet? – TechSpud

+0

Fertig. Vielen Dank. – MondQ