PowerShell脚本不会遍历文档来更改文档中的每个超链接。
该脚本在SharePoint Online上的文档库中运行,并且可以打开库中的每个文档。然后,它应该遍历每个文档并提取找到的所有超链接,然后将超链接分为两部分。然后,脚本应将后半部分添加到新URL上,并将地址更新为新的更新URL。
add-type -AssemblyName "Microsoft.Office.Interop.Word"
$wdunits = “Microsoft.Office.Interop.Word.wdunits” -as [type]
$donotsave = “Microsoft.Office.Interop.Word.wdDoNotSaveChanges” -as [type]
$save = “Microsoft.Office.Interop.Word.wdSaveChanges” -as [type]
$application = New-Object -ComObject Word.Application
$application.Visible = $false
$tenancy = "https://tenancy.sharepoint.com"
$url = "https://tenancy.sharepoint.com/sites/siteName/"
Connect-PnPOnline -Url $url -UseWebLogin
$library = Get-PnPList | Where-Object {$_.Title -eq "libraryName"}
$items = Get-PnPListItem -List $library
foreach ($item in $items) {
if ($item["FileLeafRef"] -match ".doc*") {
Write-Host "File Name: "$item["FileLeafRef"]
$item["FileLeafRef"]
$item["FileRef"]
Write-Host `
$documentLocation = "https://tenancy.sharepoint.com"+$item["FileRef"]
$documentLocation
$document = $application.Documents.Open($documentLocation)
$docURLS = @($document.Hyperlinks)
$docURLS | foreach{
Start-Sleep -Seconds 7
$newURI = ([uri]$_.address).AbsoluteUri
$result = $newURI.Split("=") | Select-Object -Skip 1 -First 1
$result
$newUrl = "https://tenancy.sharepoint.com/sites/siteName/_layouts/DocIdRedir.aspx?ID="+$result
$_.address = $newUrl
Write-Verbose ("Updating {0} to {1}" -f $_.Address,$newUrl) -Verbose
}
$document.save()
$document.close([Ref]$save)
$item.File.Update()
}
}
$application.quit()
Disconnect-PnPOnline
该脚本当前可以遍历库并打开每个文档,当文档中有多个超链接时,就会出现此问题。 它可以正确更改第一个URL,但是此后的所有其他链接都会收到以下错误:
对象已被删除。 在C:\ filepath.ps1:36 char:5 + $ _。address = $ newUrl
所调用的对象已与其客户端断开连接。 (来自HRESULT的异常:0x80010108(RPC_E_DISCONNECTED)) 在C:\ filepath.ps1:39 char:9 + $ document.save()
所调用的对象已与其客户端断开连接。 (来自HRESULT的异常:0x80010108(RPC_E_DISCONNECTED)) 在C:\ filepath.ps1:40 char:9 + $ document.close([Ref] $ save)
您不能在空值表达式上调用方法。 在C:\ filepath.ps1:33 char:5 + $ result = $ newURI.Split(“ =”)|选择对象-跳过1-开始1
答案 0 :(得分:0)
如果$ _。address值类似于“ / sites / team?ID = 1”,则$ newURI将为空,然后运行$ newURI.Split(“ =”)| Select-Object -Skip 1 -First 1将显示“您不能在空值表达式上调用方法”。
在使用$ newURI.Split方法之前,您可以检查$ newURI是否为空。
或者我们可以替换下面的代码。
$newURI = ([uri]$_.address).AbsoluteUri
$result = $newURI.Split("=") | Select-Object -Skip 1 -First 1
使用
if($_.Address)
{
$result = $_.Address.Split("=") | Select-Object -Skip 1 -First 1
}
else
{
$_
}