Powershell:将目录文件结构转化为 JSON

问题描述

您好,我是 PowerShell 的新手。我有一个 4 级的文件路径。

Rootedirectory\directory1\directory2\directory3\ 文件

文件结构始终保持不变。

这是我的代码,问题是它重复了相同的值

#Place Root Folder in desktop
$Fullpath = 'C:\Users\Glen Sale\Desktop\donor'
$rootDir = $Fullpath.Split('\')[4]

#Get Creationtime of matching root folder
$session = Get-ChildItem 'C:\Users\Glen Sale\Desktop' -Filter $rootDir



    $organfolder = Get-ChildItem 'C:\Users\Glen Sale\Desktop\donor' -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","No Sample 0.05 40X_Bottom Slide_R_p00_0_A01f01d1.TIF"
                                                                            ]
                                                         }
                                                     ]
                                     }
                                 ]
                  }
    }
]

这是我想要的正确分类的结果

{
  "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",{
            "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:\USERS\GLEN SALE\DESKTOP\DOnor
+---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
            

解决方法

它来自您编写递归函数的方式,因为 Foreach-object 具有特殊的语法。

看:

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

给出:

3

第一个脚本块是在循环之前发起者执行一次,第二个是循环执行次数与对象数量相同,第三个是在结束时执行一次。

但你只用了两个

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

给出:

3
3
3

第一个脚本块启动器执行一次,循环 {$obj} 执行多次。

,

我使用类和嵌套循环找到了解决我的问题的方法

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:\Users\v-mtouri\Desktop\donor)
{
    $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