如何使powershell在Word文档中搜索通配符并返回找到的单词?

如何使powershell在Word文档中搜索通配符并返回找到的单词?,powershell,Powershell,我正在搜索大量Word文档(5000)以查找大量字符串(3000)。我知道如何在Powershell脚本中执行此操作,但这需要非常长的时间。幸运的是,这些字符串中的大多数在前3或4个字符中有公共文本,如果在find.execute语句中使用通配符搜索,我可以将字符串缩小到大约300个。如果我在strings.txt中搜索(cod)*,它在Word doc中找到诸如“code”、“coding”、“coded”等结果,我需要将这些结果放入文本文件中。然而,我运气不太好 $filePath = "C

我正在搜索大量Word文档(5000)以查找大量字符串(3000)。我知道如何在Powershell脚本中执行此操作,但这需要非常长的时间。幸运的是,这些字符串中的大多数在前3或4个字符中有公共文本,如果在find.execute语句中使用通配符搜索,我可以将字符串缩小到大约300个。如果我在strings.txt中搜索(cod)*,它在Word doc中找到诸如“code”、“coding”、“coded”等结果,我需要将这些结果放入文本文件中。然而,我运气不太好

$filePath = "C:\files\"
$textPath = "C:\strings.txt"
$outputPath = "C:\output.txt"
$findTexts = (Get-Content $textPath)
$docs = Get-childitem -path $filePath -Recurse -Include *.docx 
$application = New-Object -comobject word.application 
Foreach ($doc in $docs)
{
   $document = $application.documents.open("$doc", $false, $true)
   $application.visible = $False
   $matchCase = $false 
   $matchWholeWord = $false 
   $matchWildCards = $true 
   $matchSoundsLike = $false 
   $matchAllWordForms = $false 
   $forward = $true 
   $wrap = 1
   $range = $document.content
   $null = $range.movestart()

   Foreach ($findtext in $findTexts)
   {
       $wordFound = $range.find.execute($findText,$matchCase,$matchWholeWord,$matchWildCards,$matchSoundsLike, $matchAllWordForms,$forward,$wrap) 
       if ($wordFound) 
       { 
           $docName = $doc.Name
           #Output search results and file name to a tab-delimited file
           "$findText`t$docName" | Out-File -append $outputPath   
        } #end if $wordFound 

     } #end foreach $findText
$document.close()
} #end foreach $doc
$application.quit()

如果我有一个Word文档,其中包含单词“coding”,那么这个脚本将生成output.txt,其中包含(cod)*通配符和文件名,因为$findText=(cod)*。那么,有没有办法将单词“coding”输出到文件中?

而不是使用单词的通配符搜索,为什么不在文档中的所有文本上使用Powershell正则表达式呢。大概是这样的:

if ($document.Content.Text -match "\b$($findText)\w+\b") 
{ 
  $docName = $doc.Name
  "$($matches[0])`t$docName" | Out-File -append $outputPath   
}

您可能会发现,解决这类任务的速度将快于
Word.Application
我已经考虑过这一点,但我的公司坚决要求我们不要安装任何类似SDK的附加软件。如果这是唯一的解决方案,我会让他们破例,但我希望有一种方法可以利用Word.Application。我确实试图通过打开单词doc一次,然后在关闭它之前搜索3000个字符串来尽可能高效地运行它。它有帮助,但仍然需要很长时间。如果有帮助,整个SDK由一个静态dll+一个XML清单组成,无需在机器上安装或注册任何内容。感谢Mathias,我能够获得它,因此这可能是Dave提供的regex选项之外的另一个很好的尝试选项。你知道它是如何编码的吗?这正是我对另一个问题的回答:P(注意它在内部关键字循环中使用了
-match
)。谢谢,戴夫。这很有效。我最初坚持使用Word方法以只读方式打开文档,因为许多文档中都可以包含注释,如果不是以只读方式打开,则会出现一个关于文档包含注释的对话框。因为我是用Word方法打开的,所以我想我也会用Word方法进行查找。但是你的解决方案结合了两者的优点,而且效果很好。非常感谢。这非常有效,但是它似乎只返回找到的第一个匹配项。有没有办法让它列出所有匹配项?