我尝试编写一个 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]
}
}