从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 进行非贪婪匹配,因此您的表达式 \@*
将仅匹配文字 @
之后的 最短 个字符。由于 *
通配符后没有任何内容可以充当锚点,因此您的案例中最短的字符数始终为零,因此您只会匹配 @
字符本身。
要匹配后续的字母数字字符,您需要将表达式的末尾锚定在某处,例如在单词边界处:
\@*>
我正在尝试从 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 进行非贪婪匹配,因此您的表达式 \@*
将仅匹配文字 @
之后的 最短 个字符。由于 *
通配符后没有任何内容可以充当锚点,因此您的案例中最短的字符数始终为零,因此您只会匹配 @
字符本身。
要匹配后续的字母数字字符,您需要将表达式的末尾锚定在某处,例如在单词边界处:
\@*>