bucle PowerShell a través de la matriz en la matriz

2

Intento escribir un script de powershell para crear una carpeta y luego crear archivos dentro de esa carpeta.

$arr = @(
            ("First Folder",@("1", "2")),
            ("Sceond Folderr", @("1","2"))
        )

for ($i=0; $i -lt $arr.length; $i++)
{
    #New-Item -Path $arr[$i] -ItemType directory
    for ($a=0; $a -lt $arr[$i].length; $a++)
    {
        $file=$arr[$a]
        #New-Item -Path "$file.txt" -ItemType File
        $file
    }
}

Este es el resultado que obtengo.

First Folder
1
2
First Folder
1
2
Second Folder
1
2
Second Folder
1
2
maj
fuente

Respuestas:

2

los $arr variable se define como una matriz dentada :

Dentado arrays vs. Multidimensional matrices

Ambos son útiles para mantener listas de listas o matrices de matrices.

  • Jagged es más rápido y usa menos memoria que multidimensional, ya que contiene solo la cantidad de elementos que necesita.
  • Una matriz no dentada es más como una matriz donde cada matriz debe tener el mismo tamaño.

El siguiente fragmento de código muestra la forma correcta de manejar la matriz dentada en particular $arr:

$arr = @(
            ("First Folder",@("1", "2")),
            ("Sceond Folderr", @("11","12"))
        )

for ($i=0; $i -lt $arr.length; $i++)
{
    $dire = $arr[$i][0]
    #New-Item -Path $dire -ItemType directory
    for ($a=0; $a -lt $arr[$i].length; $a++)
    {
        $file=$arr[$i][1][$a]
        #New-Item -Path "$dire`\$file`.txt" -ItemType File
        "$dire`\$file`.txt"
    }
}

Salida :

PS D:\PShell> D:\PShell\SU\1285156.ps1
First Folder\1.txt
First Folder\2.txt
Sceond Folderr\11.txt
Sceond Folderr\12.txt

PS D:\PShell> 
JosefZ
fuente
Esto es exactamente lo que estaba buscando. Pude entender por qué la carpeta todavía se mostraba en mi segundo bucle
maj
1

Si bien StackOverflow sería un lugar mejor para publicar esto, si está trabajando con PowerShell, no hay necesidad real de usar el clásico para los bucles.

$arr = @(
            ("First Folder",@("1", "2")),
            ("Second Folder", @("1","2"))
        )

$arr | %{
    $folder = $_

    Write-Output $folder[0]

    $folder[1] | %{
        Write-Output "SubItem:", $_
    }
}

los % es un atajo ForEach-Object. En cuanto a su solución, utilice nombres de variables más descriptivos para que sea más fácil de entender (para usted mismo).

$arr = @(
            ("First Folder",@("1", "2")),
            ("Sceond Folderr", @("1","2"))
        )

# ForEach item from 0 to 1
for ($i=0; $i -lt $arr.length; $i++)
{
    # ForEach item from 0 to $arr[$i].length
    # 0, 0 - 1, 0, 0 -1 
    for ($folderKey=0; $folderKey -lt $arr[$i].length; $folderKey++)
    {
        Write-Output "Value for `$i is $i and value for `$folderKey is $folderKey"

        # Always prints just what's on the index of $i
        $file=$arr[$i]
        $file

        # The fix would be $arr[$i][$folderKey]
    }
}
Seth
fuente
La matriz anterior fue solo un ejemplo. Tendré la matriz 1 con la carpeta 100 y luego la matriz 2 tendrá el nombre de 100 archivos.
maj
Intento esto # La solución sería $ arr [$ i] [$ folderKey] pero aún mostraba el nombre de las carpetas, en el segundo ciclo no me gusta obtener el nombre de las carpetas porque no quiero crear un archivo con el nombre de la carpeta. esto es normal
maj
Si modifica la línea 16, su salida será lo que espera. Obviamente, tendrías que modificar el código para satisfacer tu necesidad. Solo está ahí para señalar el error que recibió en su código original. Actualmente, el código anterior solo muestra el nombre de la carpeta.
Seth