powershell วนรอบ arrary ใน arrary


2

ฉันพยายามเขียนสคริปต์ 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

คำตอบ:


2

$arrตัวแปรถูกกำหนดให้เป็นอาร์เรย์ขรุขระ :

Jagged Array กับArray หลายมิติ :

ทั้งสองมีประโยชน์สำหรับการเก็บรายชื่อของรายการหรืออาร์เรย์ของอาร์เรย์

  • 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> 

นี่คือสิ่งที่ฉันกำลังมองหา ฉันสามารถเข้าใจได้ว่าทำไมโฟลเดอร์ยังคงปรากฏในลูปที่สองของฉัน
เม.ย.

1

ในขณะที่ StackOverflow เป็นสถานที่ที่ดีกว่าในการโพสต์สิ่งนี้หากคุณกำลังทำงานกับ PowerShell คุณไม่จำเป็นต้องใช้รูปแบบดั้งเดิมสำหรับลูป

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

อาร์เรย์ด้านบนเป็นเพียงตัวอย่าง ฉันจะมีอาร์เรย์ 1 กับ 100 โฟลเดอร์แล้วอาร์เรย์ 2 จะมีชื่อไฟล์ 100
พฤษภาคม

ฉันลองนี่ # การแก้ไขจะเป็น $ arr [$ i] [$ folderKey] แต่มันยังคงแสดงชื่อโฟลเดอร์ในวงที่ 2 ฉันไม่ต้องการรับชื่อโฟลเดอร์เพราะฉันไม่ต้องการสร้างไฟล์ที่มีชื่อโฟลเดอร์ นี้เป็นปกติ
พฤษภาคม

หากคุณแก้ไขบรรทัดที่ 16 เอาต์พุตของคุณจะเป็นสิ่งที่คุณคาดหวัง เห็นได้ชัดว่าคุณจะต้องแก้ไขรหัสเพื่อให้ตรงกับความต้องการของคุณ มีเพียงเพื่อชี้ให้เห็นข้อผิดพลาดที่คุณได้รับในรหัสดั้งเดิมของคุณ รหัสด้านบนในขณะนี้เท่านั้นส่งออกชื่อโฟลเดอร์
Seth
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.