PowerShell:数组的数组

PowerShell:数组的数组

我有以下结构的文件:

c:\root\dir1\001 (BRP-01 Some) Text.tif
c:\root\dir2\002 (BRP-01 Some Different) Text.tif
c:\root\dir3\001 (BRP-01 Some) Text.tif
...

最终,我想根据文件名前三位数字的连续范围提取文件。我最初的方法是尝试Array of Arrays存储目录信息和文件信息...然后随后对其进行提取和评估前三个数字并进一步操作。但是,我对 PS 中数组的经验有限,在存储数据、访问数据或两者时我遇到了问题。

如果您能帮助我纠正语法,我将不胜感激。此外,如果有更好的方法可以考虑,我愿意接受其他方法。

PS C:\root\> Get-ChildItem *.tif -recurse | foreach-object {$a=$_.DirectoryName; $b=$_.Name; $c+=@(@($a,$b)); foreach ($i in $c) {echo $i[0]}
# I realize something "breaks" after $c+= ... but I am unsure what. The script runs but I cannot access the respective fields as expected or the data isn't being populated as expected.

一旦我有正确的语法,我希望数组返回类似下面的内容:

$i[0]: 
       c:\root\dir1\
       c:\root\dir2\
       c:\root\dir3\
$i[1]: 
       001 (BRP-01 Some) Text.tif
       002 (BRP-01 Some Different) Text.tif
       001 (BRP-01 Some) Text.tif
$i[0][1]: c:\root\dir1\

Array of Arrays我非常有信心,一旦我能牢牢掌握如何构建数据以及如何从中调用数据,我就能操纵数据。

谢谢!

答案1

我认为你把这个事情搞得太复杂了。运行命令后,你不需要再进行任何“数据格式化” Get-ChildItem。你只需要Group-Object根据文件名的前 3 个字符来输出,如下所示:

$AllItemsGrouped = Get-ChildItem *.tif -recurse | Group-Object { $_.Name.Substring(0,3) }

这将返回您的对象,按其各自的前缀分组,而不会丢失任何信息:

PS C:\Install\testdir500> gci | group-object { $_.Name.substring(0,3) }

Count Name                      Group
----- ----                      -----
    3 001                       {001test - Kopie (2).txt, 001test - Kopie.txt, 001test.txt}
    2 002                       {002test - Kopie.txt, 002test.txt}
    1 003                       {003test - Kopie - Kopie.txt}

例如,如果你展开一个组,其内容如下:

PS C:\Install\testdir500> gci | group-object { $_.Name.substring(0,3) } | select -expand Group -first 1


    Verzeichnis: C:\Install\testdir500


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       30.11.2020     09:55              0 001test - Kopie (2).txt
-a----       30.11.2020     09:55              0 001test - Kopie.txt
-a----       30.11.2020     09:55              0 001test.txt

然后您可以通过不同的方式访问它,例如像这样:

foreach ($Group in $AllItemsGrouped) {

    $CurrentGroup = $Group.Group
    Do-Something -With $CurrentGroup

}

相关内容