我最近开始了Powershell之旅,并且编写了代码,该代码将在一组Word文档中搜索关键字(或短语)并将文档名称导出到txt文件。现在,我想知道是否可以搜索一个短语,例如:“ wait * days”,然后将完整的短语“ wait 10 days”输出到txt文件。我当前拥有的代码简要总结为:
如果您能指出正确的方向或向我展示编写该程序的起点,我将不胜感激。谢谢!
正如您在下面看到的,我已经写了几乎所有用于在文档中查找关键字的代码。我所需要的只是指导什么功能,使我可以将通配符短语写到txt文件中。
$keyword = 'SOMETHING'
$source = 'C:\somepath'
$word = New-Object -ComObject Word.Application
$docs = Get-ChildItem -Path $source | Where-Object {$_.Name -like '*.doc*'}
{
if ($word.Documents.Open($doc.FullName).Content.Find.Execute($keyword))
{
#Output Code
}
$word.Application.ActiveDocument.Close()
}
当前,该代码可以打开和阅读Microsoft Word文档,并将该文档写入输出文件。尽管我希望将通配符搜索的结果写入输出中。 显然,堆栈溢出与获取代码无关。因此,非常感谢任何方向,甚至让我知道在Powershell中是否可行。
答案 0 :(得分:0)
我能想到的唯一方法是拉动身体,然后使用-match
查找所需的内容。
有Find.MatchWildcards
属性。但是,我无法按预期工作。 Find.MatchWildcards
示例。获取以“ wait”开头并以“ days”结尾的字符串:
#looking for wait X days
#regex for wildcard
$keyword = '(wait).*(days)'
$source = 'C:\somepath'
$word = New-Object -ComObject Word.Application
$word.Visible = $False
$docs = Get-ChildItem -Path $source | Where-Object {$_.Name -like '*.doc*'}
$results = @{}
foreach($doc in $docs)
{
#open read only
$document = $word.Documents.Open($doc.FullName,$false,$True)
$body = $document.content
#use Regex
if($body.Text -match "$keyword")
{
#Example of action write to file each time there is a match
$Matches[0] | out-file "C:\IndividualMatch.txt" -Append
$properties = @{
File = $doc.FullName
Match = $keyword
CompleteMatch = $Matches[0]
}
#store to results
$results += $properties
}
$word.Application.ActiveDocument.Close()
}
if($results)
{
#if there are matches... do action -- output to text
$results.CompleteMatch | Out-File "C:\test.txt"
}
else
{
Write-Host "Cant find"
}
#clean up com object
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($word) | Out-Null