我有一组 6000 个 word 文档。我试图想办法根据关键字搜索每个 word 文档的内容。然后我会打印出这些结果以便稍后存储。这将迅速加快手动过程的速度。因为我希望对大量文档进行分类。我注意到我已经可以在 Windows 文件资源管理器中的高级搜索功能中执行类似操作。所以我想知道 PC 上是否有某种东西可以让我在 powershell 中完成此任务。此外,就我应该使用哪些功能而言,我应该从哪里开始。
显然我需要使用循环。我应该用什么来读取word文档的内容,以及如何将结果写入文件?
再次感谢!
答案1
帖子
powershell 脚本在 word 文档中查找字符串,如果存在则移动到其他位置
包含以下脚本。我对其进行了修改,删除了移动找到的文档的部分。您可以替换脚本中的$source
文件夹和关键字,或将它们变成参数:Security
$word = New-Object -ComObject Word.Application
$source = 'D:\source'
$docs = Get-ChildItem -Path $source | Where-Object {$_.Name -match '.docx'}
foreach ($doc in $docs)
{
if ($word.Documents.Open($doc.FullName).Content.Find.Execute('Security'))
{
Write-Host "$doc contains 'Security'"
}
$word.Application.ActiveDocument.Close()
}
本文描述了另一个更为复杂的脚本
查找包含特定短语的所有 Word 文档。
答案2
如果包含要搜索的文档的目录是索引位置查询 Windows Search 索引比单独打开和搜索每个文档要快得多。默认情况下,Word 过滤器会索引内容,而不仅仅是文件名。
根据结构这个stackoverflow答案您可能需要类似这样的 SQL 语句 - 显然将其更改SCOPE
为您想要搜索的目录以及TESTSTRING
您正在寻找的任何单词。
SELECT System.ItemName, System.ItemPathDisplay, System.ItemType
FROM SYSTEMINDEX
WHERE SCOPE='C:\Test\'
AND System.ItemType <> 'Directory'
AND CONTAINS(System.Search.Contents,'*TESTSTRING*')
AND CONTAINS(System.FileName,'*.docx')
正如所描述的这里您可以使用 powershell 提取符合这些条件的文档的详细信息,如下所示:
$sql = "SELECT System.ItemName, System.ItemPathDisplay, System.ItemType FROM SYSTEMINDEX WHERE SCOPE = 'C:\Test\' AND CONTAINS(System.Search.Contents,'*TESTSTRING*') AND CONTAINS(System.FileName,'*.docx')"
$provider = "provider=search.collatordso;extended properties='application=windows';"
$connector = new-object system.data.oledb.oledbdataadapter -argument $sql, $provider
$dataset = new-object system.data.dataset
if ($connector.fill($dataset)) { $dataset.tables[0] | select-object System.ItemName, System.ItemPathDisplay, System.ItemType | format-table -autosize * }
例如 :
要将结果输出到文件而不是屏幕,请将最后一行更改为使用out-file
而不是format-table
。例如,这会将结果输出到名为结果.txt在您的桌面上。
if ($connector.fill($dataset)) { $dataset.tables[0] | select-object System.ItemName, System.ItemPathDisplay, System.ItemType | out-file ~/desktop/Results.txt }