2016-08-22 5 views
0

У меня есть сценарий, который я создаю для рекурсии через дерево файлов, создаю объект для представления этого дерева и распечатаю его в JSON. Однако по какой-то причине дочерние объекты отображаются пустым, когда я пытаюсь их распечатать. Вот код, который я до сих пор:Рекурсия через каталоги: дочерние объекты отображаются пустым?

$dir = "c:\dell" 

# Top-level object to hold the directory tree 
$obj = @{} 

function recurse($dir, [ref]$obj) { 

    write-host "recursing into $dir" 

    # Object to hold this subdir & children 
    $thisobj = @{} 

    # List the files & folders in this directory 
    $folders = Get-ChildItem $dir | Where-Object { $_.PSIsContainer -eq $true } 
    $files = Get-ChildItem $dir | Where-Object { $_.PSIsContainer -eq $false } 

    #write-host $folders 

    # Iterate through the subdirs in this directory 
    foreach ($f in $folders) { 
     # Recurse into this subdir 
     recurse $f.fullname ([ref]$thisobj) 
    } 

    # Iterate through the files in this directory and add them to 
    foreach ($f in $files) { 
     write-host " - adding file to thisobj: $f" 
     $thisobj | add-member -MemberType NoteProperty -Name $f -value 10 
    } 

    # Print out this subtree 
    "$dir thisobj: " 
    $thisobj | convertto-json -depth 100 

    # Add this subtree to parent obj 
    $obj | Add-Member -MemberType NoteProperty -name $dir -value $thisobj 

    write-host "finished processing $dir" 

} 

# Initial recursion 
recurse $dir ([ref]$obj) 

write-host "final obj:" 
$obj | ConvertTo-Json -depth 100 

Вот что я пытаюсь получить конечный результат выглядеть следующим образом:

{ 
    "updatepackage": { 
     "log": { 
      "DELLMUP.log": 5632 
     } 
     "New Text Document.txt": 0 
    } 
    "list.csv": 588 
} 
+1

Можете ли вы привести пример JSON, который вы хотите получить из этого процесса? У меня такое чувство, что то, что вы сделали здесь, скорее всего, больше кода, чем нужно. – alroc

+0

Возможно, но я не смог найти лучшего способа. Я добавил образец вывода к вопросу. – wmassingham

+0

Что должен сделать ваш сценарий? –

ответ

1

Я думаю, вам лучше переписать recurse вернуть объект, представляющий каталог а не изменять один из параметров:

function recurse { 
    param($Dir) 

    Get-ChildItem -LiteralPath $Dir | 
    ForEach-Object { 
     $Obj = [ordered]@{} 
    } { 
     $Obj.Add($_.PSChildName, $(
      if($_.PSIsContainer) { 
       recurse $_.PSPath 
      } else { 
       $_.Length 
      } 
     )) 
    } { 
     $Obj 
    } 
} 

recurse c:\dell | ConvertTo-Json -Depth 100 
+0

Это дает результат, который я хочу. Можете ли вы объяснить синтаксис того, как вы использовали ForEach-Object? – wmassingham

+0

@wmassingham '1..3 | ForEach-Object {'Begin'} {"Process $ _"} {'End'} 'Я просто использую все три (' Begin', 'Process' и' End') блоки, а всего лишь блок «Process». – PetSerAl

Смежные вопросы