首页 > 解决方案 > 寻找通配符字符串,然后将其写入输出

问题描述

我最近开始了我的 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 中都将不胜感激。

标签: powershellms-word

解决方案


我能想到的唯一方法是拉身体,然后用它-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

推荐阅读