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 Arrays
almacenar 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 Arrays
se 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-ChildItem
comando. Simplemente necesita Group-Object
su 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
}