Powershell: Структура файлов каталогов в JSON

#json #powershell #hashtable

Вопрос:

Здравствуйте, я новичок в PowerShell. У меня есть путь к файлу 4-го уровня.

Корневой каталогдиректория1директория2директория3 файлы

Структура файла всегда остается неизменной.

Вот мой код, проблема в том, что он повторяет одни и те же значения

 #Place Root Folder in desktop
$Fullpath = 'C:UsersGlen SaleDesktopdonor'
$rootDir = $Fullpath.Split('')[4]

#Get Creationtime of matching root folder
$session = Get-ChildItem 'C:UsersGlen SaleDesktop' -Filter $rootDir



    $organfolder = Get-ChildItem 'C:UsersGlen SaleDesktopdonor' -Directory 
foreach ($dir in $organfolder){
    Get-ChildItem $dir.FullName -File 
    $biospyfolder = Get-ChildItem $dir.FullName -Directory
    foreach($dir2 in $biospyfolder){
        gci $dir2.fullname -File
        $sectionfolder = gci $biospyfolder.fullname -Directory
        foreach($dir3 in $sectionfolder){
           $tiffFiles= gci $dir3.fullname -File
        }
    }
}


function recurse {

    Get-ChildItem -LiteralPath $Fullpath   |
    ForEach-Object { 
        $Obj = [ordered]@{
             session_id = $session.CreationTime | Get-Date -f ("yyyyMMdd") 
             session_date = $session.CreationTime | Get-Date -f ("yyyy/MM/dd") 
                #$rootDir 
                organ=@{ 
                     organ_id= $organfolder.namer#[0]
                        biospy= @( 
                            @{biospy_id = $biospyfolder.name#[0]
                                section= @(
                                    @{section_id= $sectionfolder.name#[0]
                                      tiff_files = $tiffFiles.name#[0]  
                                    }
                                )
                        })
           }
        }
    } {
        $Obj
    }
}


recurse  | ConvertTo-Json -Depth 100 #| out-file ''
 

Вывод, который я получаю, повторяется.
Результаты:

 [
    {
        "session_id":  "20210418",
        "session_date":  "2021/04/18",
        "organ":  {
                      "organ_id":  [
                                       "FBG01",
                                       "FBG02"
                                   ],
                      "biospy":  [
                                     {
                                         "biospy_id":  "FBG01.12.1",
                                         "section":  [
                                                         {
                                                             "section_id":  [
                                                                                "FBG01.12.1.1",
                                                                                "FBG01.12.1.2"
                                                                            ],
                                                             "tiff_files":  [
                                                                                "No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f00d0.TIF",
                                                                                "No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f00d1.TIF",
                                                                                "No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f00d2.TIF",
                                                                                "No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f00d3.TIF",
                                                                                "No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f01d0.TIF",
                                                                                "No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f01d1.TIF"
                                                                            ]
                                                         }
                                                     ]
                                     }
                                 ]
                  }
    },
    {
        "session_id":  "20210418",
        "session_date":  "2021/04/18",
        "organ":  {
                      "organ_id":  [
                                       "FBG01",
                                       "FBG02"
                                   ],
                      "biospy":  [
                                     {
                                         "biospy_id":  "FBG01.12.1",
                                         "section":  [
                                                         {
                                                             "section_id":  [
                                                                                "FBG01.12.1.1",
                                                                                "FBG01.12.1.2"
                                                                            ],
                                                             "tiff_files":  [
                                                                                "No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f00d0.TIF",
                                                                                "No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f00d1.TIF",
                                                                                "No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f00d2.TIF",
                                                                                "No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f00d3.TIF",
                                                                                "No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f01d0.TIF",
                                                                                "No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f01d1.TIF"
                                                                            ]
                                                         }
                                                     ]
                                     }
                                 ]
                  }
    }
]
 

These is the result that I want which is categorize correctly

 {
  "session_id": "20210409",
  "session_date": "2021/04/09",
  "organ": {
    "organ_id": "FBG01",
    "biopsy": [
      {
        "biopsy_id": "FBG01.12.1",
        "section": [
          {
            "section_id": "FBG01.12.1.1",
            "tiff_files": [
              "FBG01 12 hr_Bottom Slide_R_p01_0_A01f00d0.TIF",
              "FBG01 12 hr_Bottom Slide_R_p01_0_A01f01d0.TIF",
              "FBG01 12 hr_Bottom Slide_R_p01_0_A01f02d0.TIF"
            ]
          },
          {
            "section_id": "FBG01.12.1.2",
            "tiff_files": [
              "FBG01 12 hr_Bottom Slide_R_p01_0_A01f20d0.TIF",
              "FBG01 12 hr_Bottom Slide_R_p01_0_A01f21d0.TIF",
              "FBG01 12 hr_Bottom Slide_R_p01_0_A01f22d0.TIF"
            ]
          }
        ]
      },
      {
        "biopsy_id": "FBG01.18.1",
        "section": [
          {
            "section_id": "FBG01.18.1.1",
            "tiff_files": [
              "FBG01 12 hr_Bottom Slide_R_p01_0_A01f00d0.TIF",
              "FBG01 12 hr_Bottom Slide_R_p01_0_A01f01d0.TIF",
              "FBG01 12 hr_Bottom Slide_R_p01_0_A01f02d0.TIF"
            ]
          },
          {
            "section_id": "FBG01.18.1.2",
            "tiff_files": [
              "FBG01 18 hr_Bottom Slide_R_p01_0_A01f20d0.TIF",
              "FBG01 18 hr_Bottom Slide_R_p01_0_A01f21d0.TIF",
              "FBG01 18 hr_Bottom Slide_R_p01_0_A01f22d0.TIF"
            ]
          }
        ]
      }
    ]
  }
}
 

Если вам нужно посмотреть, как выглядит каталог

 C:USERSGLEN SALEDESKTOPDONOR
 ---FBG01
|   ---FBG01.12.1
|        ---FBG01.12.1.1
|       |       No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f02d3.TIF
|       |       No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f03d0.TIF
|       |       No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f03d1.TIF
|       |       No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f03d2.TIF
|       |       No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f03d3.TIF
|       |       
|       ---FBG01.12.1.2
|               No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f00d0.TIF
|               No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f00d1.TIF
|               No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f00d2.TIF
|               No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f00d3.TIF
|               No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f01d0.TIF
|               No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f01d1.TIF
|               
---FBG02
    ---FBG01.12.1
         ---FBG01.12.1.1
        |       No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f02d3.TIF
        |       No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f03d0.TIF
        |       No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f03d1.TIF
        |       No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f03d2.TIF
        |       No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f03d3.TIF
        |       
        ---FBG01.12.1.2
                No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f00d0.TIF
                No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f00d1.TIF
                No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f00d2.TIF
                No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f00d3.TIF
                No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f01d0.TIF
                No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f01d1.TIF
            
 

Ответ №1:

Я нашел решение своей проблемы, используя класс и вложенный цикл

 class section
{
    [System.String]$section_id = ''
    [System.String[]]$tiff_files = @()
}
class biopsy
{
    [System.String]$biopsy_id = ''
    [section[]]$section = @()
}
class organ
{
    [System.String]$organ_id = ''
    [biopsy[]]$biopsy = @()
}
class session
{
    [System.String]$session_id = ''
    [System.String]$session_date = ''
    [organ[]]$organ = @()
}

 

$session = [session]@{
    session_id = 'session_id'
    session_date = 'session_date'
}
foreach($o in Get-ChildItem -Directory -Path C:Usersv-mtouriDesktopdonor)
{
    $organ = [organ]@{organ_id = $o.Name}
    $session.organ  = $organ
    foreach ($b in Get-ChildItem -Directory -Path $o.FullName)
    {
        $biopsy = [biopsy]@{biopsy_id = $b.Name}
        $organ.biopsy  = $biopsy
        foreach ($s in Get-ChildItem -Directory -Path $b.FullName)
        {
            $section = [section]@{
                section_id = $s.Name
                tiff_files = Get-ChildItem -File -Path $s.FullName | Select-Object -ExpandProperty Name
            }
            $biopsy.section  = $section
        }
    }
}

 

$session | ConvertTo-Json -Depth 10
 

Ответ №2:

Это происходит от того, как вы пишете свою функцию рекурсии, потому Foreach-object что у нее особый синтаксис.

Смотреть на :

 1..3| foreach-object {$n=0}{$a=$n  }{$a}
 

дает :

 3
 

Первый блок скрипта-инициатор, выполняемый один раз перед циклом, второй-цикл, выполняемый столько раз, сколько объектов, и третий, выполняемый один раз в конце.

Но вы используете только два

 1..3| foreach-object {$a=$n  }{$a}
 

что дает :

 3
3
3
 

Первый инициатор блока сценария выполняется один раз, а цикл {$obj} выполняется несколько раз.

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

1. как бы я добавил это в свой код или как это правильно сделать

2. Я скопировал вставленную вами правку. похоже, что метательные выражения разрешены только в качестве первого элемента конвейера

3. и другие, я нашел решение, опубликовав свой ответ