PowerShell не будет перебирать документ - PullRequest
0 голосов
/ 15 октября 2019

Скрипт PowerShell не будет перебирать документ для изменения каждой гиперссылки в документе.

Сценарий запускается через библиотеку документов в SharePoint в Интернете и может открывать каждый документ в библиотеке. Затем он должен перебирать каждый документ и извлекать любые найденные гиперссылки, а затем разбивать гиперссылку на две части. Затем скрипт должен добавить вторую половину на новый 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 ("=") |Select-Object -Skip 1 -First 1

1 Ответ

0 голосов
/ 16 октября 2019

Если значение адреса $ _., Например, "/ sites / team? ID = 1", $ newURI будет нулевым, а затем запустите $ newURI.Split ("=") |Select-Object -Skip 1 -First 1 получит «Вы не можете вызвать метод для выражения с нулевым значением».

Вы можете проверить, является ли $ newURI нулевым, перед использованием метода $ newURI.Split.

Или мы можем заменить код ниже.

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