Модуль Powershell - Как рекурсивно выполнять вызовы Invoke-RestMethod на основе ввода - PullRequest
0 голосов
/ 15 марта 2019

Я работаю над модулем powershell для взаимодействия с REST API.

API перечисляет содержимое папки, используя шаблон '$Site/api/folders/' для корня и '$Site/api/folders/$FolderID/contents' для подпапок.

Функция, которую я построил ниже для вывода списка содержимого на основе предоставленного имени папки, работает для извлечения списка папок из корня, и если указано $Folder и это дочерний элемент корня, он извлекает содержимое потянув список корневых папок, используя FindIndex, чтобы найти идентификатор для папки с таким именем, а затем сделав вызов REST (строки 48-65).

Мой вопрос: как я могу сделать это для вложенных папок независимо от количества уровней? Если пользователь указал '-Folder /myfolder/subfolder/morefolders/ilovefolders', как я могу пройти через каждый из них для отображения соответствующих результатов?

Заранее благодарен за любую помощь, я относительно новичок в этом и читаю, пока у меня не болят глаза, чтобы все это сделать правильно.

Функция:

function Get-SiteDir {
    [CmdletBinding()]
    PARAM
    (
        [string]$Site,
        [string]$Email,
        [string]$Password,
        [string]$Folder,
        [string]$FolderID
    )
        If ($Site.Length -eq 0) {
        Try {
            $Site = (Get-ItemProperty -Path HKCU:\SOFTWARE\Company\Site\config).Site
        }
        Catch [System.Management.Automation.ItemNotFoundException] {
            Write-Host -ForegroundColor Red "No Site specified. Either configure using Set-SiteConfig or pass a site URI with the -Site key."
        }
        Catch {
            Write-Host -ForegroundColor Red "Something went wrong, please check your configuration and connection and try again."
        }
    }
    If ($Email.Length -eq 0) {
        Try {
            $Email = (Get-ItemProperty -Path HKCU:\SOFTWARE\Company\Site\config).Email
        }
        Catch [System.Management.Automation.ItemNotFoundException] {
            Write-Host -ForegroundColor Red "No site login e-mail specified. Either configure using Set-SiteConfig or pass a site URI with the -Email key."
        }
        Catch {
            Write-Host -ForegroundColor Red "Something went wrong, please check your configuration and connection and try again."
        }
    }
        If ($Password.Length -eq 0) {
        Try {
            $Password = (Get-ItemProperty -Path HKCU:\SOFTWARE\Company\Site\config).Password | ConvertFrom-SecureString
        }
        Catch [System.Management.Automation.ItemNotFoundException] {
            Write-Host -ForegroundColor Red "No site login password specified. Either configure using Set-SiteConfig or pass a site URI with the -Password key."
        }
        Catch {
            Write-Host -ForegroundColor Red "Something went wrong, please check your configuration and connection and try again."
        }
    }
    If (!(Test-Path Variable:Global:$SiteSession) -or ($Global:SiteSession.Cookies.GetCookies("$Site/api/account/login").Expired -eq $true)) {
            Write-Host "New-SiteSession -Site $Site -Email $Email -Password $Password"
    }

    $RootFolders = Invoke-RestMethod -Uri "$Site/api/folders/" -WebSession $Global:SiteSession
    $RootFolderList = [Collections.Generic.List[Object]]($Folders)

    If (($Folder.Length -eq 0) -And ($FolderID.Length -eq 0)) {
        Return $RootFolders | Sort-Object -Property name | Select-Object -Property name, id, userPermissions | Format-Table -AutoSize
    } 
    Else {
        If ($Folder.Length -eq 0) {
            $FolderContents = Invoke-RestMethod -Uri "$Site/api/folders/$FolderID/contents" -WebSession $Global:SiteSession
            Return $FolderContents | Sort-Object -Property name | Select-Object -Property name, id, userPermissions | Format-Table -AutoSize
        }
        Else {
            $RootFolderIndex = $FolderList.FindIndex( {$args[0].name -eq "$Folder"} )
            $FolderId = $RootFolderList.id[$RootFolderIndex]
            $FolderContents = Invoke-RestMethod -Uri "$Site/api/folders/$FolderID/contents" -WebSession $Global:SiteSession
            Return $FolderContents | Sort-Object -Property name | Select-Object -Property name, id, userPermissions | Format-Table -AutoSize
        }
    }
}

1 Ответ

1 голос
/ 16 марта 2019

Ну, я не уверен, что это самый элегантный или эффективный способ сделать это, но я смог заставить его работать. Для тех, кто хочет сделать что-то подобное, соответствующая часть кода обновлена ​​ниже. Это приведет к удалению любых начальных или конечных слешей, затем подсчитает количество слешей плюс один, чтобы определить, сколько уровней необходимо сканировать, а затем перебрать каждую папку, чтобы найти ее дочерний идентификатор.

$RootFolders = Invoke-RestMethod -Uri "$Site/api/folders/" -WebSession $Global:SiteSession
$RootFolderList = [Collections.Generic.List[Object]]($RootFolders)

If (([string]::IsNullOrWhiteSpace($Folder)) -And ([string]::IsNullOrWhiteSpace($FolderID))) {
    Return $RootFolders | Sort-Object -Property name | Select-Object -Property name, id, userPermissions | Format-Table -AutoSize
} 
Else {
    If ([string]::IsNullOrWhiteSpace($Folder)) {
        $FolderContents = Invoke-RestMethod -Uri "$Site/api/folders/$FolderID/contents" -WebSession $Global:SiteSession
        Return $FolderContents | Sort-Object -Property name | Select-Object -Property name, id, userPermissions | Format-Table -AutoSize
    }
    Else {
        $Folder = $Folder.Trim("\")
        $FolderDepth = ([regex]::Matches($Folder, "\\")).count + 1
        $FolderTree = $Folder -split '\\'

        If ($FolderDepth -eq 1) {
            $RootFolderIndex = $RootFolderList.FindIndex( {$args[0].name -eq "$Folder"} )
            If ($RootFolderIndex -eq -1) {
                Write-Error "A folder `"$Folder`" does not exist. Please check your spelling and try again." -ErrorAction Stop
            }
            $FolderId = $RootFolderList.id[$RootFolderIndex]
            $FolderContents = Invoke-RestMethod -Uri "$Site/api/folders/$FolderID/contents" -WebSession $Global:SiteSession
            Return $FolderContents | Sort-Object -Property name | Select-Object -Property name, id, userPermissions | Format-Table -AutoSize
        }
        Else {
            for ($i=0; $i -lt $FolderDepth; $i++) {
                If ($i -eq 0) {
                    $FolderIndex = $RootFolderList.FindIndex( {$args[0].name -eq $FolderTree[$i] } )
                    If ($FolderIndex -eq -1) {
                        Write-Error "A folder `"$Folder`" does not exist. Please check your spelling and try again." -ErrorAction Stop
                    }
                    $FolderId = $RootFolderList.id[$FolderIndex]
                    $FolderContents = Invoke-RestMethod -Uri "$Site/api/folders/$FolderID/contents" -WebSession $Global:SiteSession
                    $FolderList = [Collections.Generic.List[Object]]($FolderContents)
                }
                Else {
                    $FolderIndex = $FolderList.FindIndex( {$args[0].name -eq $FolderTree[$i]} )
                    If ($FolderIndex -eq -1) {
                        Write-Error "A folder `"$Folder`" does not exist. Please check your spelling and try again." -ErrorAction Stop
                    }
                    $FolderId = $FolderList.id[$FolderIndex]
                    $FolderContents = Invoke-RestMethod -Uri "$Site/api/folders/$FolderID/contents" -WebSession $Global:SiteSession
                    $FolderList = [Collections.Generic.List[Object]]($FolderContents)
                }
            }
            Return $FolderContents | Sort-Object -Property name | Select-Object -Property name, id, userPermissions | Format-Table -AutoSize
        }
    }
}
...