![PowerShell: Массив массивов](https://rvso.com/image/1638130/PowerShell%3A%20%D0%9C%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%BE%D0%B2.png)
У меня есть файлы со следующей структурой:
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
}