Azure PowerShell Runbook с вложенной функцией - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть Azure PowerShell Runbook, где я использую командлеты SharePoint-PnP, который работает совершенно нормально. Но у меня проблема с вызовом функции. Отметим, что скрипт работает нормально локально, но не в Azure Runbook.

$SPCredentials = Get-AutomationPSCredential -Name 'ServiceAccount'
Connect-PnPOnline -Url $SPUrl -Credentials $SPCredentials

$SPList = New-PnPList -Title "$($ObjektNr)-$($ObjektName)" -Template DocumentLibrary -OnQuickLaunch -EnableContentTypes
Write-Output "Bibliothek erstellt"
Add-PnPContentTypeToList -List $SPList -ContentType $SPCTName -DefaultContentType
Write-Output "Inhaltstyp hinzugefügt"
Remove-PnPContentTypeFromList -List $SPList -ContentType "Dokument"
Write-Output "Inhaltstyp entfernt"
Set-PnPList -Identity $SPList -EnableContentTypes $false -EnableVersioning $true -EnableMinorVersions $false
Write-Output "Listeneinstellungen vorgenommen"

$SPList = Get-PnPList -Identity "$($ObjektNr)-$($ObjektName)"
$SPRootFolder = "$($SPList.RootFolder.Name)/"
Write-Output "Neue Bibliothek abgerufen"

$SPTerms = Get-PnPTerm -TermSet $SPTermSet -TermGroup $SPTermGroup -IncludeChildTerms -Recursive
Write-Output "Terms abgerufen"

Function getTerms($Terms)
{
    Write-Output "Funktion ausgeführt"
    Foreach ($Term in $Terms)
    {
        If ($Term.PathOfTerm.Contains(";"))
        {
            Add-PnPFolder -Name $Term.Name -Folder "$($SPRootFolder)$($Term.PathOfTerm.Substring(0, $Term.PathOfTerm.LastIndexOf(";")).Replace(";","/"))"

            $values = @()
            $splitTerms = $Term.PathOfTerm.Split(";")
            $count = $splitTerms.Count - 1

            For ($i=0; $i -le $count; $i++)
            {
                If ($i -eq 0)
                {
                    $values += "$($SPTermGroup)|$($SPTermSet)|$($splitTerms[$i])"
                }
                Else
                {
                    $values += "$($values[-1])|$($splitTerms[$i])"
                }
            }

            Set-PnPDefaultColumnValues -List $SPList -Field "Metadaten" -Value $values -Folder "$($Term.PathOfTerm.Replace(";","/"))"
        }
        else
        {
            Add-PnPFolder -Name $Term.Name -Folder $SPRootFolder

            Set-PnPDefaultColumnValues -List $SPList -Field "Metadaten" -Value $Term.Id -Folder $Term.Name
        }

        If ($Term.Terms.Count -gt 0)
        {
            getTerms($Term.Terms)
        }
    }
}

getTerms($SPTerms)

Теперь проблема в том, что я вызываю функцию getTerms внутри функции getTerms (четвертая строка снизу) , Кажется, после повторного вызова этой функции весь сценарий запускается с самого начала, а не только функции с параметрами.

Спасибо за любую помощь!

С уважением, Марк

1 Ответ

0 голосов
/ 21 апреля 2020

В идеале это не должно начинаться с самого начала! Чтобы проверить дважды, я бы порекомендовал вам добавить строки записи-вывода непосредственно перед и после вызова функции getTerms (т.е. около 4-й строки снизу), а также непосредственно перед фактической функцией getTerms. И затем проверьте, печатается ли контент, предоставленный вами в этих строках записи-вывода, в ожидаемом порядке или нет.

Кроме того, я бы посоветовал вам попробовать следующий подход, чтобы увидеть, решена ли ваша проблема.

Function getTerms($Terms)
{
    Write-Output "Funktion ausgeführt"
    Foreach ($Term in $Terms)
    {
        If ($Term.PathOfTerm.Contains(";"))
        {
            Add-PnPFolder -Name $Term.Name -Folder "$($SPRootFolder)$($Term.PathOfTerm.Substring(0, $Term.PathOfTerm.LastIndexOf(";")).Replace(";","/"))"
            $values = @()
            $splitTerms = $Term.PathOfTerm.Split(";")
            $count = $splitTerms.Count - 1
            For ($i=0; $i -le $count; $i++)
            {
                If ($i -eq 0)
                {
                    $values += "$($SPTermGroup)|$($SPTermSet)|$($splitTerms[$i])"
                }
                Else
                {
                    $values += "$($values[-1])|$($splitTerms[$i])"
                }
            }
            Set-PnPDefaultColumnValues -List $SPList -Field "Metadaten" -Value $values -Folder "$($Term.PathOfTerm.Replace(";","/"))"
        }
        else
        {
            Add-PnPFolder -Name $Term.Name -Folder $SPRootFolder
            Set-PnPDefaultColumnValues -List $SPList -Field "Metadaten" -Value $Term.Id -Folder $Term.Name
        }
        If ($Term.Terms.Count -gt 0)
        {
            getTerms($Term.Terms)
        }
    }
}

Function main()
{
    $SPCredentials = Get-AutomationPSCredential -Name 'ServiceAccount'
    Connect-PnPOnline -Url $SPUrl -Credentials $SPCredentials

    $SPList = New-PnPList -Title "$($ObjektNr)-$($ObjektName)" -Template DocumentLibrary -OnQuickLaunch -EnableContentTypes
    Write-Output "Bibliothek erstellt"
    Add-PnPContentTypeToList -List $SPList -ContentType $SPCTName -DefaultContentType
    Write-Output "Inhaltstyp hinzugefügt"
    Remove-PnPContentTypeFromList -List $SPList -ContentType "Dokument"
    Write-Output "Inhaltstyp entfernt"
    Set-PnPList -Identity $SPList -EnableContentTypes $false -EnableVersioning $true -EnableMinorVersions $false
    Write-Output "Listeneinstellungen vorgenommen"

    $SPList = Get-PnPList -Identity "$($ObjektNr)-$($ObjektName)"
    $SPRootFolder = "$($SPList.RootFolder.Name)/"
    Write-Output "Neue Bibliothek abgerufen"

    $SPTerms = Get-PnPTerm -TermSet $SPTermSet -TermGroup $SPTermGroup -IncludeChildTerms -Recursive
    Write-Output "Terms abgerufen"

    getTerms($SPTerms)
}

main()
...