PowerShell不会遍历文档

时间:2019-10-15 12:19:16

标签: powershell sharepoint sharepoint-online

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

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
{
    $_
}