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 ถึง 10ForEach-Objectประมวลผลแต่ละหมายเลขตามลำดับ- คำสั่ง
ifจะตรวจสอบว่าตัวเลขปัจจุบัน ($_) เป็นเลขคู่ ($_ % 2 -eq 0) หรือไม่ - หากตัวเลขเป็นเลขคู่ คำสั่ง
continueจะข้ามบล็อกสคริปต์ที่เหลือและย้ายไปยังหมายเลขถัดไป - หากตัวเลขเป็นเลขคี่ ระบบจะพิมพ์โดยใช้
Write-Output
ผลลัพธ์จะเป็น:
1
3
5
7
9PowerShell foreach-วัตถุแบ่ง
คุณยังสามารถใช้คำสั่งแบ่งใน PowerShell foreach-object ฉันขอแสดงตัวอย่างให้คุณดู
ใน PowerShell คำสั่ง break ภายใน ForEach-Object cmdlet ใช้เพื่อออกจากลูปทั้งหมด โดยหยุดการประมวลผลรายการในไปป์ไลน์เพิ่มเติม สิ่งนี้มีประโยชน์สำหรับการยกเลิกลูปตั้งแต่เนิ่นๆ ตามเงื่อนไขเฉพาะ
สมมติว่าคุณมีรายการตัวเลข และคุณต้องการประมวลผลจนกว่าคุณจะเจอหมายเลข 5 ซึ่งเป็นจุดที่คุณต้องการหยุดการประมวลผลเพิ่มเติม
1..10 | ForEach-Object {
if ($_ -eq 5) {
break
}
Write-Output $_
}ในตัวอย่างนี้:
1..10สร้างลำดับตัวเลขตั้งแต่ 1 ถึง 10ForEach-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-วัตถุแบ่ง



