PowerShell แบ่งสำหรับแต่ละวง
โดยปกติแล้ว ผู้เรียนจะสับสนกับ ForEach และ ForEach-Object ในขณะที่ใช้คำสั่ง break/continue ใน PowerShell แต่มี เป็นความแตกต่างที่ชัดเจนระหว่าง ForEach loop และ ForEach-Object cmdlet นั่นคือสาเหตุที่คำสั่ง break/continue ไม่ ทำงานใน ForEach-Object cmdlet ขณะที่ทำงานใน ForEachLoop
เราจะเรียนรู้เกี่ยวกับข้อความทั้งสองในบทความนี้ แต่ก่อนที่จะเจาะลึกรายละเอียด จำเป็นต้องทราบว่าข้อความทั้งสอง (break/ดำเนินการต่อ) ถูกนำมาใช้ในการเปลี่ยนแปลงการไหลของ วนซ้ำ แต่มีความแตกต่างระหว่างพวกเขา
คำสั่ง break จะออกจากลูปทันที โดยไม่คำนึงว่าเงื่อนไขที่ระบุจะเป็นไปตามเงื่อนไขหรือไม่ หมายความว่าการวนซ้ำที่เหลือของลูปจะถูกข้ามไป และการดำเนินการจะเริ่มจากคำสั่งที่ตามหลังลูปทันที
ในทางกลับกัน คำสั่ง continue จะไม่ออกจากลูป แต่จะข้ามการวนซ้ำปัจจุบันของลูปและย้ายไปยังการวนซ้ำครั้งถัดไป หมายความว่าโค้ดใดๆ ที่ตามหลังคำสั่ง continue ภายในการวนซ้ำปัจจุบันของการวนซ้ำจะถูกข้ามไป แต่ตัวการวนซ้ำนั้นยังคงดำเนินการต่อไปในการวนซ้ำครั้งถัดไป
มาเรียนรู้ด้วยตัวอย่างโค้ดด้านล่าง
การใช้คำสั่ง break/continue ใน ForEach Loop
ใช้คำสั่ง break ในลูป ForEach ใน PowerShell
ใช้คำสั่ง Break ใน ForEach Loop:
$range = 1..10
ForEach ($number in $range) {
if ($number -eq 5){
break
}
Write-Host $number
}
Write-Host "I am out of ForEach now."เอาท์พุท :
1
2
3
4
I am out of ForEach now.ขั้นแรก เราใช้ตัวดำเนินการ .. เพื่อสร้างช่วงของตัวเลขตามขีดจำกัดล่างและบนที่กำหนด และจัดเก็บไว้ในตัวแปร $range ต่อไป เราใช้ลูป ForEach เพื่อวนซ้ำในช่วง $range
สุดท้ายนี้ เราใช้คำสั่ง if กับตัวดำเนินการ -eq ในการวนซ้ำแต่ละครั้งเพื่อตรวจสอบว่าตัวเลขปัจจุบัน (แสดงด้วย $number) เท่ากับ < รหัส>5. หากเป็นเช่นนั้น ให้ออกจากลูปโดยใช้คำสั่ง break หรือพิมพ์หมายเลขโดยใช้ Write-Host cmdlet สุดท้าย เราใช้ Write-Host อื่นภายนอก ForEach เพื่อแสดงเมื่อเราออกจากลูป
โค้ดด้านบนออกจากลูป ForEach เมื่อ $number เท่ากับ 5 ด้วยเหตุนี้ Write-Host cmdlet ที่ตามหลังคำสั่ง break จะไม่ถูกดำเนินการ
ใช้คำสั่ง ดำเนินการต่อ ในลูป ForEach ใน PowerShell
ใช้คำสั่ง Continue ใน ForEach Loop:
$range = 1..10
foreach ($number in $range) {
if ($number -eq 5){
continue
}
Write-Host $number
}
Write-Host "I am out of ForEach now."เอาท์พุท :
1
2
3
4
6
7
8
9
10
I am out of ForEach now.
ตัวอย่างนี้เหมือนกับตัวอย่างก่อนหน้า แต่คราวนี้เราใช้คำสั่ง continue เมื่อคำสั่ง if เป็นที่พอใจ คำสั่ง continue จะข้ามการวนซ้ำปัจจุบันและข้ามไปยังการวนซ้ำถัดไป โปรดทราบว่าคำสั่งใดๆ ที่ตามหลังคำสั่ง continue จะไม่ถูกดำเนินการ
ใช้คำสั่ง break และ continue ในลูป ForEach ใน PowerShell
ใช้คำสั่งแบ่ง/ดำเนินการต่อใน ForEach Loop:
$range = 1..10
foreach ($number in $range) {
if ($number -eq 5){
continue
}elseif($number -eq 9){
break
}
Write-Host $number
}
Write-Host "I am out of ForEach now."เอาท์พุท :
1
2
3
4
6
7
8
I am out of ForEach now.ตัวอย่างนี้เป็นการรวมตัวอย่างโค้ดสองตัวอย่างสุดท้ายเข้าด้วยกัน มันข้ามการวนซ้ำที่หมายเลข 5 และดำเนินการต่อด้วยการวนซ้ำครั้งต่อๆ ไป แต่ออกจากการวนซ้ำเมื่อหมายเลขคือ 9
breakยังสามารถใช้ได้ภายในสวิตช์และกับดักใน PowerShell
มาเพิ่มความแปลกใหม่ให้กับตัวอย่างข้างต้น สมมติว่าสถานการณ์ที่คุณใช้ลูป ForEach ภายในลูป While ตอนนี้ คุณมีอาร์เรย์สองตัว โดยแต่ละอาร์เรย์มีค่าจำนวนเต็ม while วนซ้ำบน array1 ในทางกลับกัน ForEach จะวนซ้ำบน array2 สำหรับการวนซ้ำทุกครั้งของลูป While ใช้คำสั่ง break ภายใน ForEach ตามคำสั่ง if ที่ระบุ
ประเด็นที่น่าสังเกตคือคำสั่ง break จะทำลายลูป ForEach ทันทีที่คำสั่ง if เป็นที่พอใจ แต่งานของคุณคือการทำลาย ForEach และ While ทั้งสองวนซ้ำโดยใช้คำสั่ง break หนึ่งคำสั่งที่คุณผูกพันที่จะใช้ภายใน ForEach ทำอย่างไร? มาเรียนรู้กันในตัวอย่างต่อไปนี้
ใช้คำสั่ง break ที่มีป้ายกำกับในลูป ForEach
หากต้องการใช้ break ที่มีป้ายกำกับใน ForEach ใน PowerShell:
- สร้างอาร์เรย์สองตัวที่มีค่าจำนวนเต็มและจัดเก็บไว้ในตัวแปรแยกกัน
- ใช้
whileเพื่อวนซ้ำอาร์เรย์แรก สำหรับการวนซ้ำ
whileทุกครั้ง:- ใช้
ForEachเพื่อวนซ้ำอาร์เรย์ที่สอง
- ใช้
- ใช้คำสั่ง
ifพร้อมด้วยตัวดำเนินการ-eqเพื่อตรวจสอบว่าหมายเลขปัจจุบันของอาร์เรย์ที่สองเท่ากับ8หรือไม่ - หากเป็นเช่นนั้น ให้แยกลูป
ForEachและwhileหรือพิมพ์หมายเลขและเลื่อนไปยังการวนซ้ำครั้งถัดไป
Write-Host cmdlets สองรายการเพื่อสาธิตเมื่อเราปล่อยลูป ForEach และ while ไว้ใช้คำสั่งแบ่งที่มีป้ายกำกับใน ForEach วง:
$array1 = @(1,2,3,4)
$array2 = @(5,6,7,8,9)
$i=0
:breakAll while($i -lt $array1.length){
ForEach ($number in $array2) {
if ($number -eq 8){
break breakAll
}
Write-Host $number
}
$i++
Write-Host "I am out of ForEach now."
}
Write-Host "I am out of While now."เอาท์พุท :
5
6
7
I am out of While now.ที่นี่ เราใช้คำสั่ง break ที่มีป้ายกำกับ ซึ่งจะออกจากลูปที่มีป้ายกำกับ แทนที่จะออกจากลูปปัจจุบันใน PowerShell
การใช้คำสั่ง break/continue/return ใน ForEach-Object Cmdlet
ใช้คำสั่ง break ใน ForEach-Object cmdlet ใน PowerShell
ใช้คำสั่งแบ่งใน ForEach-Object Cmdlet:
$range = 1..10
$range | ForEach-Object {
if ($_ -eq 5){
break
}
Write-Host $_
}
Write-Host "I am out of ForEach_Object now."เอาท์พุท :
1
2
3
4เราคาดว่าคำสั่ง break จะออกจาก ForEach-Object ที่หมายเลข 5 และดำเนินการ Write-Host ภายนอก ForEach-Object เพื่อพิมพ์ข้อความ I am out of ForEach_Object now. แต่ได้ยกเลิกสคริปต์ทั้งหมดที่หมายเลข 5
ใช้คำสั่ง ดำเนินการต่อ ใน ForEach-Object cmdlet ใน PowerShell
ใช้คำสั่ง Continue ใน ForEach-Object Cmdlet:
$range = 1..10
$range | ForEach-Object {
if ($_ -eq 5){
continue
}
Write-Host $_
}
Write-Host "I am out of ForEach_Object now."เอาท์พุท :
1
2
3
4คำสั่ง ดำเนินการต่อ ยังใช้งานไม่ได้เท่าที่ควร แทนที่จะข้ามการวนซ้ำที่หมายเลข 5 และดำเนินการต่อจากการวนซ้ำครั้งถัดไป สคริปต์ได้ยกเลิกสคริปต์ที่หมายเลข 5 และไม่ได้พิมพ์ข้อความ I am out of ForEach_Object ทันที . ข้อความ
ดังนั้น สองตัวอย่างข้างต้นแสดงให้เห็นว่าคำสั่ง break และ continue ไม่สามารถใช้เพื่อเปลี่ยนแปลงโฟลว์ของ ForEach-Object; เราจำเป็นต้องใช้คำสั่ง return ดูตัวอย่างต่อไปนี้
ใช้คำสั่ง return ใน ForEach-Object cmdlet ใน PowerShell
ใช้คำสั่ง Return ใน ForEach-Object Cmdlet:
$range = 1..10
$range | ForEach-Object {
if ($_ -eq 5){
return
}
Write-Host $_
}
Write-Host "I am out of ForEach_Object now."เอาท์พุท :
1
2
3
4
6
7
8
9
10
I am out of ForEach_Object now.ดูสิ return ข้ามการวนซ้ำที่หมายเลข 5 และดำเนินการต่อจากการวนซ้ำครั้งถัดไป โปรดจำไว้ว่า การใช้คำสั่ง return ภายในลูป ForEach จะทำให้สคริปต์เสียหายทั้งหมด เนื่องจากคำสั่ง break และ continue ทำกับ ForEach-Object.
นั่นคือทั้งหมดที่เกี่ยวกับ PowerShell ที่แบ่ง ForEach loop
