ค้นหาเว็บไซต์

PowerShell สำหรับแต่ละวัตถุ [พร้อมตัวอย่าง]


วันนี้ ฉันจะอธิบายแนวคิดที่มีประโยชน์มากใน PowerShell: ForEach-Object cmdlet นี่คือ cmdlet ที่ใช้กันอย่างแพร่หลายใน PowerShell ฉันจะแสดงตัวอย่างโดยละเอียดของ PowerShell ForEach-Object

ForEach-Object cmdlet ใน PowerShell ประมวลผลแต่ละรายการในคอลเลกชันทีละรายการ เพื่อให้สามารถดำเนินการได้ เช่น การปรับเปลี่ยนคุณสมบัติหรือการดำเนินการคำสั่ง ตัวอย่างเช่น หากต้องการเพิ่มตัวเลขแต่ละตัวเป็นสองเท่าในลำดับ คุณสามารถใช้ 1..5 | ForEach-Object { $_ * 2 } ซึ่งเอาต์พุต 2, 4, 6, 8 และ 10

สำหรับแต่ละวัตถุใน PowerShell

ForEach-Object cmdlet ใน PowerShell ทำงานกับแต่ละรายการในคอลเลกชันของออบเจ็กต์อินพุต cmdlet นี้มีประโยชน์อย่างยิ่งเมื่อคุณต้องการประมวลผลแต่ละรายการทีละรายการในไปป์ไลน์ ForEach-Object ต่างจากคีย์เวิร์ด ForEach ที่ใช้ในบล็อกสคริปต์ ForEach-Object เป็น cmdlet ที่สามารถนำมาใช้โดยตรงในไปป์ไลน์

ไวยากรณ์ของ PowerShell ForEach-Object

ไวยากรณ์ของ ForEach-Object ใน PowerShell เป็นดังนี้:

ForEach-Object [-InputObject] <psobject> [-Begin <scriptblock>] [-Process <scriptblock>] [-End <scriptblock>] [<CommonParameters>]
  • -InputObject: ระบุออบเจ็กต์ที่จะประมวลผล พารามิเตอร์นี้เป็นทางเลือกเนื่องจาก ForEach-Object โดยทั่วไปจะได้รับอินพุตจากไปป์ไลน์
  • -Begin: กำหนดบล็อกสคริปต์ที่ทำงานก่อนบล็อกสคริปต์ กระบวนการ
  • -กระบวนการ: กำหนดบล็อกสคริปต์ที่ทำงานครั้งเดียวสำหรับแต่ละออบเจ็กต์อินพุต
  • -End: กำหนดบล็อกสคริปต์ที่ทำงานหลังจากบล็อกสคริปต์ กระบวนการ ได้ประมวลผลออบเจ็กต์อินพุตทั้งหมดแล้ว

อ่านวิธีใช้ Wildcards ใน PowerShell Switch

ตัวอย่างวัตถุ foreach ของ PowerShell

ตอนนี้ ผมจะแสดงตัวอย่างบางส่วนของวิธีใช้ foreach-object ใน PowerShell

ตัวอย่างที่ 1: พื้นฐาน ForEach-Object

สมมติว่าเรามีรายการตัวเลขและต้องการพิมพ์แต่ละหมายเลข นี่คือสคริปต์ที่มี foreach-object

1..5 | ForEach-Object { $_ }

ในตัวอย่างนี้ 1..5 สร้างลำดับตัวเลขตั้งแต่ 1 ถึง 5 และ ForEach-Object ประมวลผลแต่ละหมายเลขในลำดับ ตัวแปร $_ แสดงถึงออบเจ็กต์ปัจจุบันในไปป์ไลน์

ฉันรันสคริปต์ PowerShell ด้านบนโดยใช้โค้ด VS และคุณสามารถดูผลลัพธ์ได้ในภาพหน้าจอด้านล่าง:

ตัวอย่างที่ 2: ทำการคำนวณ

คุณสามารถใช้ ForEach-Object เพื่อดำเนินการต่างๆ กับแต่ละออบเจ็กต์ในไปป์ไลน์ได้ ตัวอย่างเช่น สมมติว่าเราต้องการเพิ่มแต่ละหมายเลขในรายการเป็นสองเท่า จากนั้นคุณสามารถเขียนสคริปต์ด้านล่างได้

1..5 | ForEach-Object { $_ * 2 }

สคริปต์นี้จะส่งออก:

2
4
6
8
10

ตัวอย่างที่ 3: เปลี่ยนชื่อไฟล์ในไดเร็กทอรีโดยใช้ foreach-object

สมมติว่าคุณมีไดเร็กทอรีที่มีไฟล์ที่ต้องเปลี่ยนชื่อเพื่อรวมการประทับเวลา คุณสามารถใช้ ForEach-Object เพื่อรับสิ่งนี้ได้ ดังตัวอย่างด้านล่าง:

Get-ChildItem -Path "C:\MyFolder" -File | ForEach-Object {
    $newName = "{0}_{1}{2}" -f $_.BaseName, (Get-Date -Format "yyyyMMdd"), $_.Extension
    Rename-Item -Path $_.FullName -NewName $newName
}

คุณสามารถดูภาพหน้าจอด้านล่าง ซึ่งจะเปลี่ยนชื่อไฟล์ทั้งหมดในโฟลเดอร์หลังจากที่ฉันรันสคริปต์ PowerShell ด้านบน

ตัวอย่างที่ 4: แก้ไขคีย์รีจิสทรีโดยใช้ foreach-object

ฉันขอแสดงตัวอย่างที่ซับซ้อนอีกตัวอย่างหนึ่งของ foreach-object

สมมติว่าคุณจำเป็นต้องอัปเดตคีย์รีจิสทรีเฉพาะสำหรับรายการคอมพิวเตอร์ คุณสามารถใช้ ForEach-Object เพื่อดำเนินการนี้ได้

$computers = @("Computer1", "Computer2", "Computer3")
$computers | ForEach-Object {
    Invoke-Command -ComputerName $_ -ScriptBlock {
        Set-ItemProperty -Path "HKLM:\Software\MyApp" -Name "Setting" -Value "NewValue"
    }
}

สคริปต์นี้จะอัปเดตคีย์รีจิสทรีในคอมพิวเตอร์แต่ละเครื่องในรายการ

PowerShell foreach-object พร้อมด้วย Begin, Process และ End Script Blocks

cmdlet ForEach-Object ใน PowerShell ช่วยให้คุณกำหนดบล็อกสคริปต์ได้ 3 บล็อก: เริ่มต้น, กระบวนการ และ End บล็อกสคริปต์เหล่านี้สามารถดำเนินการเตรียมใช้งาน ประมวลผล และล้างข้อมูลได้

นี่คือตัวอย่าง:

สมมติว่าเราต้องการคำนวณผลรวมของรายการตัวเลขโดยใช้ PowerShell เราสามารถใช้บล็อกสคริปต์ Begin, Process และ End เพื่อให้บรรลุสิ่งนี้:

$sum = 0
1..5 | ForEach-Object -Begin { $sum = 0 } -Process { $sum += $_ } -End { $sum }

ในตัวอย่างนี้:

  • บล็อก Begin จะเริ่มต้นตัวแปร $sum เป็น 0
  • บล็อก กระบวนการ จะเพิ่มตัวเลขแต่ละตัวลงในตัวแปร $sum
  • บล็อก End จะแสดงผลรวมสุดท้าย

ผลลัพธ์จะเป็น:

15

อ่าน PowerShell สำหรับแต่ละวง

กรองวัตถุด้วย Where-Object ใน PowerShell foreach-object

นี่คือตัวอย่างที่น่าตื่นเต้นของการกรองออบเจ็กต์ด้วย Where-Object ใน PowerShell foreach-object

คุณสามารถใช้ Where-Object cmdlet กับ ForEach-Object เพื่อให้บรรลุเป้าหมายนี้ได้

มากรองเฉพาะเลขคู่ออกจากรายการแล้วเพิ่มเป็นสองเท่า:

1..10 | Where-Object { $_ % 2 -eq 0 } | ForEach-Object { $_ * 2 }

cmdlet Where-Object กรองตัวเลขและ ForEach-Object ประมวลผลตัวเลขที่กรอง ผลลัพธ์จะเป็น:

4
8
12
16
20

คุณยังสามารถดูผลลัพธ์ในภาพหน้าจอด้านล่างหลังจากที่ฉันรันสคริปต์ด้านบนโดยใช้โค้ด VS

PowerShell foreach-object พร้อมอาร์เรย์และคอลเลกชัน

ForEach-Object มีประโยชน์อย่างยิ่งเมื่อทำงานกับอาร์เรย์และคอลเล็กชัน PowerShell ลองพิจารณาตัวอย่างที่เรามีอาร์เรย์ของสตริงที่แสดงชื่อไฟล์ และเราต้องการเพิ่มส่วนต่อท้ายให้กับชื่อไฟล์แต่ละชื่อ

$files = @("file1.txt", "file2.txt", "file3.txt")
$files | ForEach-Object { "$_ - backup" }

สคริปต์นี้จะส่งออก:

file1.txt - backup
file2.txt - backup
file3.txt - backup

ซ้อนกันสำหรับแต่ละวัตถุใน PowerShell

คุณสามารถซ้อน ForEach-Object cmdlets เพื่อดำเนินการที่ซับซ้อนมากขึ้นได้ ตัวอย่างเช่น สมมติว่าเรามีรายการไดเร็กทอรี และเราต้องการแสดงรายการไฟล์ทั้งหมดในแต่ละไดเร็กทอรี

นี่คือตัวอย่างของตัวอย่าง foreach-object ที่ซ้อนกัน

$directories = @("C:\Folder1", "C:\Folder2")
$directories | ForEach-Object {
    Get-ChildItem $_ | ForEach-Object {
        $_.FullName
    }
}

สคริปต์นี้จะแสดงรายการเส้นทางแบบเต็มของไฟล์ทั้งหมดในไดเร็กทอรีที่ระบุ

การจัดการข้อผิดพลาดกับ PowerShell foreach-object

ตอนนี้ให้ฉันแสดงวิธีการจัดการข้อผิดพลาดกับ PowerShell foreach-object พร้อมตัวอย่าง

สมมติว่าเรามีรายการเส้นทางของไฟล์และต้องการอ่านเนื้อหาของแต่ละไฟล์ เราจัดการกับข้อผิดพลาดที่อาจเกิดขึ้นได้โดยใช้บล็อก Try และ Catch :

$files = @("C:\file1.txt", "C:\file2.txt", "C:\nonexistent.txt")
$files | ForEach-Object {
    Try {
        Get-Content $_
    } Catch {
        Write-Host "Error reading file: $_"
    }
}

ในตัวอย่างนี้ ข้อผิดพลาดจะถูกตรวจพบหากไม่มีไฟล์อยู่ และข้อความจะแสดงแทนการยกเลิกสคริปต์

อ่าน PowerShell สำหรับลูป

PowerShell foreach-วัตถุดำเนินการต่อ

ให้เราเข้าใจรายละเอียดวิธีใช้คำสั่ง PowerShell foreach-object Continue พร้อมตัวอย่าง

ใน PowerShell คำสั่ง continue ภายใน ForEach-Object cmdlet ใช้เพื่อข้ามการวนซ้ำปัจจุบันและไปยังรายการถัดไปในไปป์ไลน์ สิ่งนี้มีประโยชน์เมื่อข้ามบางรายการตามเงื่อนไขโดยไม่ยุติการวนซ้ำทั้งหมด

สมมติว่าคุณมีรายการตัวเลขและต้องการประมวลผลเฉพาะเลขคี่ โดยข้ามเลขคู่ไป คุณสามารถใช้คำสั่ง continue ภายใน ForEach-Object ได้ดังนี้:

1..10 | ForEach-Object {
    if ($_ % 2 -eq 0) {
        continue
    }
    Write-Output $_
}

ในตัวอย่างนี้:

  • 1..10 สร้างลำดับตัวเลขตั้งแต่ 1 ถึง 10
  • ForEach-Object ประมวลผลแต่ละหมายเลขตามลำดับ
  • คำสั่ง if จะตรวจสอบว่าตัวเลขปัจจุบัน ($_) เป็นเลขคู่ ($_ % 2 -eq 0) หรือไม่
  • หากตัวเลขเป็นเลขคู่ คำสั่ง continue จะข้ามบล็อกสคริปต์ที่เหลือและย้ายไปยังหมายเลขถัดไป
  • หากตัวเลขเป็นเลขคี่ ระบบจะพิมพ์โดยใช้ Write-Output

ผลลัพธ์จะเป็น:

1
3
5
7
9

PowerShell foreach-วัตถุแบ่ง

คุณยังสามารถใช้คำสั่งแบ่งใน PowerShell foreach-object ฉันขอแสดงตัวอย่างให้คุณดู

ใน PowerShell คำสั่ง break ภายใน ForEach-Object cmdlet ใช้เพื่อออกจากลูปทั้งหมด โดยหยุดการประมวลผลรายการในไปป์ไลน์เพิ่มเติม สิ่งนี้มีประโยชน์สำหรับการยกเลิกลูปตั้งแต่เนิ่นๆ ตามเงื่อนไขเฉพาะ

สมมติว่าคุณมีรายการตัวเลข และคุณต้องการประมวลผลจนกว่าคุณจะเจอหมายเลข 5 ซึ่งเป็นจุดที่คุณต้องการหยุดการประมวลผลเพิ่มเติม

1..10 | ForEach-Object {
    if ($_ -eq 5) {
        break
    }
    Write-Output $_
}

ในตัวอย่างนี้:

  • 1..10 สร้างลำดับตัวเลขตั้งแต่ 1 ถึง 10
  • ForEach-Object ประมวลผลแต่ละหมายเลขตามลำดับ
  • คำสั่ง if จะตรวจสอบว่าตัวเลขปัจจุบัน ($_) เท่ากับ 5 หรือไม่
  • หากตัวเลขคือ 5 คำสั่ง break จะออกจากลูป และหยุดการประมวลผลใดๆ เพิ่มเติม
  • หากตัวเลขไม่ใช่ 5 จะพิมพ์โดยใช้ Write-Output

ผลลัพธ์จะเป็น:

1
2
3
4

การวนซ้ำจะสิ้นสุดลงเมื่อพบหมายเลข 5 และไม่มีการประมวลผลหรือพิมพ์ตัวเลขเพิ่มเติม หัวข้อนี้อธิบายวิธีใช้คำสั่งแบ่งภายใน ForEach-Object เพื่อควบคุมขั้นตอนการประมวลผลและยุติการวนซ้ำตามเงื่อนไขเฉพาะ

ฉันรันสคริปต์ PowerShell ข้างต้นแล้ว และคุณสามารถดูผลลัพธ์ได้ในภาพหน้าจอด้านล่าง:

บทสรุป

ฉันหวังว่าคุณจะรู้วิธีใช้ foreach-object ใน PowerShell ด้วยตัวอย่างข้างต้น ด้วยเหตุนี้ ข้าพเจ้าจึงได้อธิบายสิ่งต่อไปนี้ด้วย

  • PowerShell foreach-object พร้อมด้วย Begin, Process และ End Script Blocks
  • กรองวัตถุด้วย Where-Object ใน PowerShell foreach-object
  • PowerShell foreach-object พร้อมอาร์เรย์และคอลเลกชัน
  • ซ้อนกันสำหรับแต่ละวัตถุใน PowerShell
  • การจัดการข้อผิดพลาดกับ PowerShell foreach-object
  • PowerShell foreach-วัตถุดำเนินการต่อ
  • PowerShell foreach-วัตถุแบ่ง

บทความที่เกี่ยวข้อง