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

PowerShell 7: Foreach-Object -Parallel


ด้วย PowerShell 7 มีการแนะนำคุณสมบัติใหม่: Foreach-Object -Parallel คุณลักษณะแบบขนานจะเร่งความเร็วลูปใน PowerShell ในบล็อกโพสต์นี้ ฉันจะเปรียบเทียบเทคนิคเก่ากับเทคนิคใหม่ และฉันมั่นใจว่าผู้อ่านจะต้องประหลาดใจอย่างแน่นอน กระโดดเข้าไปเลย

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

ถึงเวลาเปลี่ยนเป็น PowerShell 7 เนื่องจาก Foreach-Object -Parallel เปิดเธรดแบบขนานและวนซ้ำแต่ละรายการในลูปแบบขนาน นั่นจะช่วยเร่งรันไทม์ของลูปได้อย่างมาก

Foreach-Object -Parallel คืออะไร

Foreach-Object -Parallel ให้การประมวลผลออบเจ็กต์อินพุตแบบขนาน PowerShell จะประมวลผลออบเจ็กต์อินพุตครั้งละ 5 รายการเท่านั้น ขีดจำกัดนี้สามารถเพิ่มได้ด้วยพารามิเตอร์ -ThrottleLimit

ตัวอย่าง :


$test = 'sid-500.com','orf.at','8.8.8.8','cnn.com'

$test | ForEach-Object -Parallel {Test-Connection -TargetName $_}

ตอนนี้เรามาดูกันว่ามีประโยชน์มากแค่ไหน

เปรียบเทียบ foreach | Foreach-วัตถุ | Foreach-วัตถุ-ขนาน

ฉันได้เตรียมตัวอย่างเพื่อความเข้าใจที่ดีขึ้น ฉันจะสแกนพอร์ตเพื่อทดสอบว่าพอร์ตเปิดอยู่หรือไม่ นอกจากนี้ ฉันใช้ Measure-Command เพื่อวัดว่าโค้ดจะทำงานนานแค่ไหน มีวัตถุประสงค์เพื่อเปรียบเทียบเทคนิคเก่ากับเทคนิคใหม่

แต่ละ()

รหัสแรกจะทดสอบโฮสต์ 192.0.78.24 (sid-500.com) ด้วย foreach() หมายเลขพอร์ตที่ทดสอบคือ 443 (HTTPS), 80 (HTTP), 53 (DNS) และ 88 (Kerberos)


Measure-Command {

$port = '443','80','53','88'

foreach ($p in $port) {

Test-NetConnection -ComputerName 192.0.78.24 -Port $p -WarningAction Ignore

}} | Select-Object Minutes,Seconds

นี่คือผลลัพธ์:

โอเค ใช้เวลาประมาณ 1 นาที 18 วินาที อย่างไรก็ตาม รหัสทั้งหมดถูกดำเนินการใน Visual Studio Code ซึ่งในขณะนั้นเป็นตัวแก้ไขเริ่มต้นของ PowerShell 7

Foreach-วัตถุ

ต่อไป ฉันจะลองใช้ Foreach-Object โดยไม่มีการประมวลผลแบบขนาน

Measure-Command {

$port = '443','80','53','88'

$port |

ForEach-Object {Test-NetConnection -ComputerName 192.0.78.24 -Port $_ -WarningAction Ignore}

} | Select-Object Minutes,Seconds

เหมือนกันที่นี่

ซึ่งนำฉันไปสู่คุณสมบัติใหม่

Foreach-วัตถุ-ขนาน

ก่อนอื่น ตามที่กล่าวไว้ในตอนต้น โปรดจำไว้ว่า Foreach-Object -Parallel ถูกจำกัดไว้ที่ 5 บล็อกสคริปต์ในแต่ละครั้ง การตั้งค่านี้สามารถเพิ่มได้ด้วยพารามิเตอร์ -ThrottleLimit ไม่มีปัญหา ฉันจะใช้วัตถุประมวลผลแบบขนานเพียง 4 ชิ้นเท่านั้น

มันจะได้เปรียบความเร็วอะไร? นี่คือในการดำเนินการ


Measure-Command {

$port = '443','80','53','88'

$port |

ForEach-Object -Parallel {Test-NetConnection -ComputerName 192.0.78.24 -Port $_ -WarningAction Ignore}

} | Select-Object Minutes,Seconds

เร็วกว่าสองเท่า! มหัศจรรย์!

ข้อมูลเพิ่มเติมเกี่ยวกับคุณลักษณะแบบขนานใหม่ที่นี่: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/foreach-object?view=powershell-7

ขอให้สนุกกับการเร่งความเร็วสคริปต์ของคุณด้วย PowerShell 7 และ Foreach-Object -Parallel

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