【问题标题】:Searching for @ followed by multiple characters in word document from Powershell在Powershell的word文档中搜索@后跟多个字符
【发布时间】:2016-09-17 18:49:33
【问题描述】:

我正在尝试对 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()

}

【问题讨论】:

    标签: powershell wildcard


    【解决方案1】:

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

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

    \@*>
    

    【讨论】:

    • 效果很好,谢谢。现在我只需要弄清楚如何忽略电子邮件地址!
    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多