![PowerShell: 配列の配列](https://rvso.com/image/1638130/PowerShell%3A%20%E9%85%8D%E5%88%97%E3%81%AE%E9%85%8D%E5%88%97.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
...
最終的には、ファイル名の最初の 3 桁の連続した範囲に基づいてファイルを抽出したいと考えています。最初のアプローチは、Array of Arrays
ディレクトリ情報とファイル情報を保存することです。その後、最初の 3 桁を抽出して評価し、さらに操作します。ただし、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
これを非常に複雑にしすぎていると思います。コマンドを実行した後は、それ以上の「データ フォーマット」は必要ありません。次のように、ファイル名の最初の 3 文字に応じて出力を変更Get-ChildItem
するだけで済みます。Group-Object
$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
}