2 votes

powershell loop through arrary in arrary

J'essaie d'écrire un script powershell script pour créer un dossier et ensuite créer des fichiers à l'intérieur de ce dossier.

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

Voici le résultat que j'obtiens.

First Folder
1
2
First Folder
1
2
Second Folder
1
2
Second Folder
1
2

2voto

JosefZ Points 11907

En $arr est définie comme une variable réseau en dents de scie :

En dents de scie tableaux vs. Multidimensionnel tableaux :

Les deux sont utiles pour contenir des listes de listes ou des tableaux de tableaux.

  • Jagged est plus rapide et utilise moins de mémoire que multidimensionnel, car il ne contient que le nombre d'éléments dont il a besoin.
  • Un tableau non dentelé ressemble davantage à une matrice où chaque tableau doit avoir la même taille.

L'extrait de code suivant montre la bonne façon de traiter un tableau irrégulier particulier $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"
    }
}

Sortie :

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>

1voto

Seth Points 8547

Bien que StackOverflow serait un meilleur endroit pour poster ceci, si vous travaillez avec PowerShell, il n'y a pas de réel besoin d'utiliser le classique boucle for.

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

$arr | %{
    $folder = $_

    Write-Output $folder[0]

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

En % est un raccourci ForEach-Object . En ce qui concerne votre solution, utilisez des noms de variables plus descriptifs pour la rendre plus facile à comprendre (pour vous).

$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]
    }
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X