寻找通配符字符串,然后将其写入输出

时间:2019-06-14 12:35:01

标签: powershell ms-word

我最近开始了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中是否可行。

1 个答案:

答案 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