首先,我知道网上有很多这方面的资源。事实上,资源太多了,以至于我很难找到解决我特定问题的方法。
目标:
我们有一个文件夹,里面装满了 word 和 excel 文档,这些文档相互指向,还指向其他 word 文档。它们所在的网络共享已更改,因此指向的链接file://\\old_share\folder\document.doc
不再有效。我的目的是浏览每个文档,并将链接的地址更改为新的共享,例如file://\\new_share\folder\document.doc
。
这些word文档是不同版本混合的,所以有些是docx,有些是doc,等等。
我目前拥有的:
我尝试过使用 Python、PowerShell 和 C#。确切的实现几乎相同。我打开 word.application 的句柄,然后打开文档,然后尝试遍历超链接字段并完成我的工作。
现在我很乐意将它们打印到屏幕上,所以这是我目前所拥有的最小例子。
$word = New-Object -ComObject word.application
$word.Visible = $false
$word.ScreenUpdating = $false
$folder = "\\new_share\folder"
$docs = Get-ChildItem -Recurse -LiteralPath $folder -file -include '*.doc*'
foreach($doc in $docs){
$thisDoc = $word.Documents.Open($_.FullName)
$link = [pscustomobject]@{
FileName = $doc.FullName
HyperLink = $thisDoc.Address
}
Write-Host "$($link.FileName) => $($link.HyperLink)"
$thisDoc.Close()
}
$Word.Quit()
# cleanup com objects
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($word) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
从这里我希望看到地址,所以一堆 (\old_share\folder...),我得到的却是一堆带有 $null 地址字段的超链接。我确信我做错了什么,但我真的很感激任何想法。
使用 com 对象打开文件并读取超链接字段。
我也考虑过直接解压 docx 文件,然后直接在 xml 里面更改链接,但并非所有文档都是 docx,而且我觉得这样做会更慢、更复杂。
要搜索和更改
.Address
Word 文档中的超链接属性,您需要循环遍历文档.Hyperlinks
集合,正如我已经评论过的那样。下面的代码将为您完成该操作。