Otimize a pesquisa de palavras-chave de documentos do Word
Estou tentando procurar palavras-chave em um grande número de documentos do MS Word e retornar os resultados para um arquivo. Eu tenho um roteiro de trabalho, mas não estava ciente da escala, e o que tenho não é suficientemente eficiente, levaria dias para percorrer tudo.
O script, como está agora, pega as palavras-chave do CompareData.txt e o executa por todos os arquivos em uma pasta específica, e depois o anexa a um arquivo.
Então, quando terminar, saberei quantos arquivos têm cada palavra-chave específica.
[cmdletBinding()]
Param(
$Path = "C:\willscratch\"
) #end param
$findTexts = (Get-Content c:\scratch\CompareData.txt)
Foreach ($Findtext in $FindTexts)
{
$matchCase = $false
$matchWholeWord = $true
$matchWildCards = $false
$matchSoundsLike = $false
$matchAllWordForms = $false
$forward = $true
$wrap = 1
$application = New-Object -comobject word.application
$application.visible = $False
$docs = Get-childitem -path $Path -Recurse -Include *.docx
$i = 1
$totaldocs = 0
Foreach ($doc in $docs)
{
Write-Progress -Activity "Processing files" -status "Processing $($doc.FullName)" -PercentComplete ($i /$docs.Count * 100)
$document = $application.documents.open($doc.FullName)
$range = $document.content
$null = $range.movestart()
$wordFound = $range.find.execute($findText,$matchCase,
$matchWholeWord,$matchWildCards,$matchSoundsLike,
$matchAllWordForms,$forward,$wrap)
if($wordFound)
{
$doc.fullname
$document.Words.count
$totaldocs ++
} #end if $wordFound
$document.close()
$i++
} #end foreach $doc
$application.quit()
"There are $totaldocs total files with $findText" | Out-File -Append C:\scratch\output.txt
#clean up stuff
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($range) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($document) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($application) | Out-Null
Remove-Variable -Name application
[gc]::collect()
[gc]::WaitForPendingFinalizers()
}
O que eu gostaria de fazer é descobrir uma maneira de pesquisar cada arquivo por tudo no CompareData.txt uma vez, em vez de iterá-lo várias vezes. Se eu estivesse lidando com um pequeno conjunto de dados, a abordagem que eu teria faria o trabalho - mas descobri que os dados em CompareData.txt e o diretório de arquivos do Word de origem serão muito grandes.
Alguma idéia de como otimizar isso?