#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. и другие, я нашел решение, опубликовав свой ответ