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

}

관련 정보