Каталог Powershell, структурированный в формате json

#json #powershell

Вопрос:

Здравствуйте, я новичок в powershell.

Я пытаюсь создать каталог, структурированный в формате json, с помощью powershell. похоже на эти изображения ниже

Пример формата json структуры каталогов

Я исследовал некоторые способы сделать это и обнаружил, что это похожий или лучший способ именования каталогов и файлов в формате json.

 function Add-Tabstops{
    param($Count)
    $tabs = ""
    for($i=0; $i -lt $Count; $i  ){$tabs  = "  "}
    return $tabs
}

function Output-JsonChildren{
    param($Path, $Level = 1)
    return $(Get-ChildItem -Path $Path | Where-Object{$_} | ForEach-Object{
        (Add-Tabstops $Level)  
        "{`n"   
        (Add-Tabstops ($Level 1))  
        "`"name`"`: `"$($_.Name)`","   
        "`n"  
        (Add-Tabstops ($Level 1))   
        "`"children`": ["  
        $(if($_.psiscontainer){"`n"   (Output-JsonChildren -Path $_.FullName -Level ($Level 2))  "`n"   (Add-Tabstops ($Level 1))})  
        "]`n"   
        (Add-Tabstops ($Level))  
        "}"
    }) -join ",`n"
  
}

$JSON = Output-JsonChildren -Path "C:UsersGlenDesktopdemocontainer" |   Out-File "C:UsersGlenDesktopdemocontainertest.json"

"["
$JSON
"]"
 

Комментарии:

1. Если это работает для вас, почему бы просто не использовать его? КАК фпр is their a similar or better way into naming directory and files into json format? , что вы имеете в виду под этим? Всегда есть лучшие способы сделать что-то, но должна быть цель для того, что значит лучше. Т. Е. более быстрый, более элегантный код, меньше кода и т. Д. Вы не говорите, почему вы хотели бы это изменить. Что касается example... using hasttable , файлы справки PowerShell показывают это на примере, а также множество статей/примеров/видео по всему Интернету. Что вы искали?

Ответ №1:

Что-то вроде этого:

 function  build-json {
    param (
        [string]$fullPath
    )
    $hashtable = @{}
    $directories = get-childitem $fullPath -Directory
    try{
    $files = (get-childitem $fullPath -File)
    if($null -eq $files) {
        $hashtable.files = @()
    }
    else {
        $hashtable.files = [array]$files.Name
    }
    } 
    catch {
        echo 'xxx'
    }

    $hashtable.directories = @{}
    foreach($directory in $directories) {
        $element = Split-Path $directory.fullname -Leaf
        $hashtable.directories.$element = build-json -fullPath $directory.FullName -hashtable $hashtable
    }
    return $hashtable
}

$sourcefolder = 'E:xxxSoftwareyyypython392'

$result3 = build-json -fullPath $sourcefolder -hashtable @{}

 

Ответ №2:

Да, это возможно.

Вам нужно будет написать небольшую рекурсивную функцию, которая просматривает словари и собирает информацию для вас.

Вы можете использовать хэш-таблицу ( @{} ) или объект PowerShell, но предпочтительнее использовать хэш-таблицу.

Get-ChildItem и ConvertTo-Json являются ли ваши друзья

Комментарии:

1. @JeremyCaney, я закрыл предыдущий вопрос как дубликат этого.

2. не могли бы вы привести мне пример, который поможет начать использовать hasttable