从Powershell在word文档中搜索@后跟多个字符

Searching for @ followed by multiple characters in word document from Powershell

我正在尝试从 Powershell 对多个 word 文档进行查找替换。我要替换的字符串的格式为:

@XXXXXXX

X 是字母数字字符(这就是我们系统中合并字段的样子)。

我用作要查找的文本的字符串是:

"\@*"

我假设是以 @ 开头后跟多个字符的任何内容。反斜杠在 Word 中用作通配符 @ 的转义字符。

不过,这只是替换文档中的 @ 符号,并忽略其后的字符。

如何设置搜索词以尊重 @ 及其后的字符并将其全部替换?

当前形式的完整脚本是:

$list = Get-ChildItem "H:\Quick Report Replace" -Include *.xml -recurse

$objWord = New-Object -ComObject word.application
$objWord.Visible = $False

foreach ($foo in $list) {

$objDoc = $objWord.Documents.Open("$foo")
$objSelection = $objDoc.Selection

$findtext= "\@*"
$ReplaceText = "_______________"

$ReplaceAll = 2
$FindContinue = 1
$MatchFuzzy = $False
$MatchCase = $False
$MatchPhrase = $false
$MatchWholeWord = $False
$MatchWildcards = $True
$MatchSoundsLike = $False
$MatchAllWordForms = $False
$Forward = $True
$Wrap = $FindContinue
$Format = $False

$objSelection.Find.execute(
        $FindText,
        $MatchCase,
        $MatchWholeWord,
        $MatchWildcards,
        $MatchSoundsLike,
        $MatchAllWordForms,
        $Forward,
        $Wrap,
        $Format,
        $ReplaceText,
        $ReplaceAll
    )

If ($objSelection.Find.Found) 
{ 
    Write-Host("The search text was found.") } Else { 
    Write-Host("The search text was not found.") } 

$objDoc.close()

}

Word 进行非贪婪匹配,因此您的表达式 \@* 将仅匹配文字 @ 之后的 最短 个字符。由于 * 通配符后没有任何内容可以充当锚点,因此您的案例中最短的字符数始终为零,因此您只会匹配 @ 字符本身。

要匹配后续的字母数字字符,您需要将表达式的末尾锚定在某处,例如在单词边界处:

\@*>