private/Reconstruct-Object.ps1
|
function Reconstruct-Object { [CmdletBinding()] param([Parameter(Mandatory = $true)][string]$DirPath) $di = [System.IO.DirectoryInfo]::new($DirPath) if (-not $di.Exists) { return $null } $props = [ordered]@{} $allNumeric = $true $hasEntries = $false $allFiles = @($di.GetFiles("*.json")) + @($di.GetFiles("*.dat")) foreach ($file in $allFiles) { $hasEntries = $true $key = [System.IO.Path]::GetFileNameWithoutExtension($file.Name) if ($key -notmatch '^\d+$') { $allNumeric = $false; break } } if ($allNumeric) { foreach ($subDir in $di.GetDirectories()) { if ($subDir.Name -eq '.buckets') { continue } $hasEntries = $true if ($subDir.Name -notmatch '^\d+$') { $allNumeric = $false; break } } } if (-not $hasEntries) { return $null } if ($allNumeric) { $items = @{} foreach ($file in $allFiles) { $idx = [int][System.IO.Path]::GetFileNameWithoutExtension($file.Name) $value = Read-BucketFile -File $file if ($null -ne $value) { $items[$idx] = $value } } foreach ($subDir in $di.GetDirectories()) { if ($subDir.Name -eq '.buckets') { continue } $idx = [int]$subDir.Name $items[$idx] = Reconstruct-Object -DirPath $subDir.FullName } if ($items.Count -eq 0) { return $null } $sorted = $items.Keys | Sort-Object return [System.Collections.ArrayList]@($sorted | ForEach-Object { $items[$_] }) } else { $result = [ordered]@{} foreach ($file in $allFiles) { $key = [System.IO.Path]::GetFileNameWithoutExtension($file.Name) $value = Read-BucketFile -File $file if ($null -ne $value) { $result[$key] = $value } } foreach ($subDir in $di.GetDirectories()) { if ($subDir.Name -eq '.buckets') { continue } $result[$subDir.Name] = Reconstruct-Object -DirPath $subDir.FullName } if ($result.Count -eq 0) { return $null } return [PSCustomObject]$result } } |