无法在数组列表中显示多个 PSCustomObjects

Unable to display multiple PSCustomObjects in an Array list

我在同一个文件夹中有3个文件夹,里面有文件;只有 3 个子文件夹中有任何内容。

我想要完成的是:

  1. 查询根文件夹以获取其中的子文件夹(如果我想添加更多,这使它对我来说更加动态)。
  2. 分别查询每个文件夹,将所有输出文件(将当前循环迭代编号连接到名称)分配到 PSCustomObject.
  3. 然后,将每个新创建的 PSCustomObject 附加到我的 $myArray 变量 - 每个对象的名称 属性 基于当前文件夹名称.
  4. 最后,以Table格式显示PSCustomObjectarraylist

预期结果为:

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的所有内容,依此类推。您缺少的是 mergejoin 每个数组的每个元素成为一个 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
        }
    }
})