Я работаю над модулем 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
}
}
}