PowerShell: matriz de matrices

PowerShell: matriz de matrices

Tengo archivos con la siguiente estructura:

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
...

En última instancia, quiero extraer archivos según un rango contiguo de los primeros tres dígitos del nombre de un archivo. Mi enfoque inicial es intentar Array of Arraysalmacenar información de directorio e información de archivos... que luego se utilizará para extraer y evaluar los primeros tres números y manipularlos más. Sin embargo, mi experiencia con arreglos en PS es limitada y tengo problemas a la hora de almacenar datos, acceder a ellos o ambos.

Si pudiera ayudarme a corregir mi sintaxis, se lo agradecería. Además, si hay un enfoque mejor que pueda considerar, estoy abierto a enfoques alternativos.

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.

Esperaría que la matriz devuelva algo como lo siguiente una vez que tenga la sintaxis correcta:

$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\

Estoy bastante seguro de que puedo manipular los datos una vez que pueda comprender firmemente cómo Array of Arraysse construyen y cómo se obtienen los datos.

¡Gracias!

Respuesta1

Creo que estás complicando mucho esto. no necesita ningún "formato de datos" adicional después de ejecutar el Get-ChildItemcomando. Simplemente necesita Group-Objectsu salida dependiendo de los primeros 3 caracteres de los nombres de archivos como este:

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

Esto te devolverá tus objetos, agrupados en sus respectivos prefijos, sin que se pierda ninguna información:

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}

por ejemplo, si expandes un grupo, el contenido se verá así:

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

Luego puedes acceder a él de diferentes maneras, por ejemplo así:

foreach ($Group in $AllItemsGrouped) {

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

}

información relacionada