powershell 循环遍历数组中的数组

powershell 循环遍历数组中的数组

我尝试编写一个 powershell 脚本来创建一个文件夹,然后在该文件夹内创建文件。

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

这是我得到的结果。

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

答案1

$arr变量定义为锯齿状数组

锯齿状数组与多维数组:

两者都适用于保存列表的列表或数组的数组。

  • Jagged 比多维更快并且占用更少的内存,因为它只包含所需的元素数量。
  • 非锯齿状数组更像是一个矩阵,其中每个数组必须具有相同的大小。

以下代码片段显示了处理特定锯齿数组的正确方法$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"
    }
}

输出

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> 

答案2

尽管 StackOverflow 是发布此问题的更好的地方,但如果您使用 PowerShell,则没有必要使用经典的 for 循环。

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

$arr | %{
    $folder = $_

    Write-Output $folder[0]

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

%是一条捷径ForEach-Object。至于您的解决方案,请使用更具描述性的变量名称,以便更容易理解(对您自己而言)。

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

相关内容