PowerShell won't iterate through a document

0

A PowerShell script won't iterate through a document to change each hyperlink in the document.

The script runs through a document library on SharePoint online and can open each document in the library. Then it should iterate through each document and pull any hyperlinks that it finds and then split the hyperlink into two parts. The script should then add the second half onto a new URL and update the Address to be the new, updated 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

The script can currently iterate through the library and open each document, the issue comes when there are multiple hyperlinks in the document. It changes the first URL correctly, but every other link after that receives the following errors:

Object has been deleted. At C:\filepath.ps1 :36 char:5 + $_.address = $newUrl

The object invoked has disconnected from its clients. (Exception from HRESULT: 0x80010108 (RPC_E_DISCONNECTED)) At C:\filepath.ps1:39 char:9 + $document.save()

The object invoked has disconnected from its clients. (Exception from HRESULT: 0x80010108 (RPC_E_DISCONNECTED)) At C:\filepath.ps1:40 char:9 + $document.close([Ref]$save)

You cannot call a method on a null-valued expression. At C:\filepath.ps1:33 char:5 + $result = $newURI.Split("=") | Select-Object -Skip 1 -First 1

powershell
sharepoint
sharepoint-online
asked on Stack Overflow Oct 15, 2019 by Liam Cosgrove

1 Answer

0

If the $_.address value like "/sites/team?ID=1", the $newURI will null, then run $newURI.Split("=") | Select-Object -Skip 1 -First 1 will get "You cannot call a method on a null-valued expression".

You can check if the $newURI is null before use $newURI.Split method.

Or we can replace the code below.

$newURI = ([uri]$_.address).AbsoluteUri
$result = $newURI.Split("=") | Select-Object -Skip 1 -First 1

with

if($_.Address)
{   
    $result = $_.Address.Split("=") | Select-Object -Skip 1 -First 1
}
else
{
    $_
}
answered on Stack Overflow Oct 16, 2019 by LZ_MSFT • edited Oct 17, 2019 by LZ_MSFT

User contributions licensed under CC BY-SA 3.0