【发布时间】:2019-04-20 00:19:53
【问题描述】:
我必须创建一个读取 Word 文件 (.docx) 并用超链接替换字符串的 Powershell 脚本。到目前为止,基于this script,我可以轻松地将所有出现的字符串替换为另一个字符串。使用that script,我可以查找字符串并将其替换为超链接。但是,只会替换第一个匹配项。
到目前为止,这是我对问题的理解:
第一个脚本使用Find接口的Execute函数的ReplaceWith和Replace=wdReplaceAll参数。问题是ReplaceWith 需要一个字符串而不是超链接对象。
第二个脚本没有指定这些参数,所以它只使用Find.Execute() 函数将 Range 对象的开头移动到找到的字符串,然后在该位置插入一个链接。
由于我无法一次替换所有匹配项,我会尝试遍历所有匹配项以在其位置插入链接。但是Find.Execute() 只返回一个布尔值...现在我正在考虑重新定义范围以排除找到的事件并循环到文档末尾,但这感觉很复杂。
假设我有一个包含此文本的 Word 文件:
换句话说,这里链接的每篇文章都是一个索引 一个主题的多个列表。一些链接的文章是他们自己 列表列表列表。这篇文章也是一个列表。
这是一个简单的脚本,它只用相对链接替换第一次出现的“列表”。我正在尝试将所有出现的“列表”替换为超链接 $linkPath,但找不到方法。帮忙?
Add-Type -AssemblyName "Microsoft.Office.Interop.Word"
$wdunits = "Microsoft.Office.Interop.Word.wdunits" -as [type]
$objWord = New-Object -ComObject Word.Application
$objWord.Visible = $false
# Text to find and replace by a link
$findText = "lists"
# Link to file
$linkPath = ".\Untitled.png"
# Source Word (2007+) file
$objDoc = $objWord.Documents.Open([FILE TO READ FROM])
# Resulting file
$saveAs = [FILE TO SAVE TO]
# Set Range to all document content
$range = $objDoc.Content
$range.movestart($wdunits::wdword,$range.start) | Out-Null
# Execute params
$matchCase = $false
$matchWholeWord = $true
$matchWildcards = $false
$matchSoundsLike = $false
$matchAllWordForms = $false
$forward = $true
$wrap = 1
$format = $False
$wdReplaceNone = 0
$wdFindContinue = 1
$wdReplaceAll = 2
# $wordFound is true is $findText is found in $range.
# $range.find.execute modifies the start of the range
$wordFound = $range.find.execute($findText,$matchCase,`
$matchWholeWord,$matchWildCards,$matchSoundsLike,`
$matchAllWordForms,$forward,$wrap)
if($wordFound){
$objDoc.Hyperlinks.Add($range,$linkPath,$null,$null,$findText) | Out-Null
}
$objDoc.SaveAs($saveAs)
$objDoc.Close()
$objWord.Quit()
$rc = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($objWord)
[gc]::Collect()
[gc]::WaitForPendingFinalizers()
参考
【问题讨论】:
标签: vba powershell ms-word