无法在数组列表中显示多个 PSCustomObjects
Unable to display multiple PSCustomObjects in an Array list
我在同一个文件夹中有3个文件夹,里面有文件;只有 3 个子文件夹中有任何内容。
我想要完成的是:
- 查询根文件夹以获取其中的子文件夹(如果我想添加更多,这使它对我来说更加动态)。
- 分别查询每个文件夹,将所有输出文件(将当前循环迭代编号连接到名称)分配到
PSCustomObject
.
- 然后,将每个新创建的
PSCustomObject
附加到我的 $myArray
变量 - 每个对象的名称 属性 基于当前文件夹名称.
- 最后,以Table格式显示
PSCustomObject
的arraylist。
预期结果为:
subfolder1 subfolder2 subfolder3
---------- ---------- -----------
1: 1 4: 2 6: 3
2: New folder 5: New folder 7: New folder
3: New folder (2) 8: New folder (2)
我目前得到的只是数组中的第一个对象:
subfolder1
----------
1: 1
2: New folder
3: New folder (2)
...但是,我可以将逗号用作一元运算符,它会显示列表中的其他对象。利用 .psobject
的数组内部成员也是如此,它也会在那里显示对象。
足够多的背景故事,这是我的代码:
Get-ChildItem -Path "C:\Users\Abraham\Desktop\test" -Directory |
ForEach-Object -Begin {
$myArray = [System.Collections.ArrayList]::new()
$i = 0
} -Process {
foreach ($folder in $input)
{
$name = $folder.BaseName
$myArray.Add(
$(foreach ($file in (Get-ChildItem -Path $folder.FullName))
{
$i++
[PSCustomObject]@{
$name = "{0}: {1}" -f $i,$file.Name
}
})
) | Out-Null
}
} -End {
$myArray
}
问题:
关于如何让附加的 PSCustomObject
以 table 格式显示的任何想法?
奇怪的是我可以使用Select-Object -First 1/2/3
,并且能够访问每个对象。也可以这样做:$myArray.foreach{$_ | ft *}
但是,它将它展平,所以我不能再将组合结果显示为 table;任何其他方法对我都不起作用,例如管道到 Write-Output
.
基本上,您的代码所做的是将每个文件夹的内容存储在 Object[]
中,其中 $myArray[0]
是 subFolder1
的所有内容,$myArray[1]
是subFolder2
的所有内容,依此类推。您缺少的是 merge 或 join 每个数组的每个元素成为一个 PSCustomObject
的部分,如下所示:
[pscustomobject]@{
subfolder1 = '2: New folder'
subfolder2 = '5: New folder'
subfolder3 = '7: New folder'
}
这是我对这个问题的解决方案:
using namespace System.Collections.Generic
using namespace System.Collections
(Get-ChildItem -Path "C:\Users\Abraham\Desktop\test" -Directory).foreach({
begin {
$myArray = [Dictionary[string, ArrayList]]::new()
$i = 0
}
process {
foreach ($file in Get-ChildItem -Path $_.FullName)
{
$i++
$file = "{0}: {1}" -f $i,$file.Name
if($thisKey = $myArray[$_.BaseName])
{
$null = $thisKey.Add($file)
continue
}
$null = $myArray.Add($_.BaseName, @($file))
}
}
end {
$max = $myArray.Keys.ForEach({ $myArray[$_].Count }) | Measure-Object -Maximum
for($i = 0; $i -lt $max.Maximum; $i++)
{
$out = [ordered]@{}
foreach($key in $myArray.Keys)
{
$out[$key] = $myArray[$key][$i]
}
[pscustomobject]$out
}
}
})
我在同一个文件夹中有3个文件夹,里面有文件;只有 3 个子文件夹中有任何内容。
我想要完成的是:
- 查询根文件夹以获取其中的子文件夹(如果我想添加更多,这使它对我来说更加动态)。
- 分别查询每个文件夹,将所有输出文件(将当前循环迭代编号连接到名称)分配到
PSCustomObject
. - 然后,将每个新创建的
PSCustomObject
附加到我的$myArray
变量 - 每个对象的名称 属性 基于当前文件夹名称. - 最后,以Table格式显示
PSCustomObject
的arraylist。
预期结果为:
subfolder1 subfolder2 subfolder3
---------- ---------- -----------
1: 1 4: 2 6: 3
2: New folder 5: New folder 7: New folder
3: New folder (2) 8: New folder (2)
我目前得到的只是数组中的第一个对象:
subfolder1
----------
1: 1
2: New folder
3: New folder (2)
...但是,我可以将逗号用作一元运算符,它会显示列表中的其他对象。利用 .psobject
的数组内部成员也是如此,它也会在那里显示对象。
足够多的背景故事,这是我的代码:
Get-ChildItem -Path "C:\Users\Abraham\Desktop\test" -Directory |
ForEach-Object -Begin {
$myArray = [System.Collections.ArrayList]::new()
$i = 0
} -Process {
foreach ($folder in $input)
{
$name = $folder.BaseName
$myArray.Add(
$(foreach ($file in (Get-ChildItem -Path $folder.FullName))
{
$i++
[PSCustomObject]@{
$name = "{0}: {1}" -f $i,$file.Name
}
})
) | Out-Null
}
} -End {
$myArray
}
问题:
关于如何让附加的 PSCustomObject
以 table 格式显示的任何想法?
奇怪的是我可以使用Select-Object -First 1/2/3
,并且能够访问每个对象。也可以这样做:$myArray.foreach{$_ | ft *}
但是,它将它展平,所以我不能再将组合结果显示为 table;任何其他方法对我都不起作用,例如管道到 Write-Output
.
基本上,您的代码所做的是将每个文件夹的内容存储在 Object[]
中,其中 $myArray[0]
是 subFolder1
的所有内容,$myArray[1]
是subFolder2
的所有内容,依此类推。您缺少的是 merge 或 join 每个数组的每个元素成为一个 PSCustomObject
的部分,如下所示:
[pscustomobject]@{
subfolder1 = '2: New folder'
subfolder2 = '5: New folder'
subfolder3 = '7: New folder'
}
这是我对这个问题的解决方案:
using namespace System.Collections.Generic
using namespace System.Collections
(Get-ChildItem -Path "C:\Users\Abraham\Desktop\test" -Directory).foreach({
begin {
$myArray = [Dictionary[string, ArrayList]]::new()
$i = 0
}
process {
foreach ($file in Get-ChildItem -Path $_.FullName)
{
$i++
$file = "{0}: {1}" -f $i,$file.Name
if($thisKey = $myArray[$_.BaseName])
{
$null = $thisKey.Add($file)
continue
}
$null = $myArray.Add($_.BaseName, @($file))
}
}
end {
$max = $myArray.Keys.ForEach({ $myArray[$_].Count }) | Measure-Object -Maximum
for($i = 0; $i -lt $max.Maximum; $i++)
{
$out = [ordered]@{}
foreach($key in $myArray.Keys)
{
$out[$key] = $myArray[$key][$i]
}
[pscustomobject]$out
}
}
})