เกี่ยวกับ เบรค
คำอธิบายสั้น ๆ
อธิบายคำสั่ง break ซึ่งมีวิธีการออกจากบล็อกควบคุมปัจจุบัน
คำอธิบายยาว
คำสั่ง break ให้วิธีการออกจากบล็อกควบคุมปัจจุบัน การดำเนินการดำเนินต่อไปในคำสั่งถัดไปหลังจากบล็อกควบคุม คำสั่งนี้รองรับป้ายกำกับ ป้ายกำกับคือชื่อที่คุณกำหนดให้กับคำสั่งในสคริปต์
การใช้ break ในลูป
เมื่อคำสั่ง break ปรากฏในลูป เช่น foreach, for, do หรือ ขณะที่วนซ้ำ PowerShell จะออกจากลูปทันที
คำสั่ง break สามารถรวมป้ายกำกับที่ช่วยให้คุณออกจากลูปที่ฝังไว้ได้ ป้ายกำกับสามารถระบุคำหลักแบบวนซ้ำใดๆ เช่น foreach, for หรือ While ในสคริปต์
ตัวอย่างต่อไปนี้แสดงวิธีการใช้คำสั่ง break เพื่อออกจากคำสั่ง for:
for($i=1; $i -le 10; $i++) {
Write-Host $i
break
}
ในตัวอย่างนี้ คำสั่ง break จะออกจากลูป for เมื่อตัวแปร $i เท่ากับ 1 แม้ว่า for > คำสั่งประเมินเป็น จริง จนกว่า $i มากกว่า 10 PowerShell จะเข้าถึงคำสั่งตัวแบ่งในครั้งแรกที่รันลูป for
เป็นเรื่องปกติมากขึ้นที่จะใช้คำสั่ง break ในการวนซ้ำซึ่งต้องตรงตามเงื่อนไขภายใน พิจารณาตัวอย่างคำสั่ง foreach ต่อไปนี้:
$i=0
$varB = 10,20,30,40
foreach ($val in $varB) {
if ($val -eq 30) {
break
}
$i++
}
Write-Host "30 was found in array index $i"
ในตัวอย่างนี้ คำสั่ง foreach จะวนซ้ำอาร์เรย์ $varB คำสั่ง if ประเมินเป็น False ในสองครั้งแรกที่รันลูป และตัวแปร $i จะเพิ่มขึ้น 1 ครั้ง ครั้งที่สามที่รันลูป $i เท่ากับ 2 และตัวแปร $val เท่ากับ 30 ณ จุดนี้ คำสั่ง break จะรัน และลูป foreach ออก
การใช้ break ที่มีป้ายกำกับในการวนซ้ำ
คำสั่ง break สามารถรวมป้ายกำกับได้ หากคุณใช้คีย์เวิร์ด break ที่มีป้ายกำกับ PowerShell จะออกจากลูปที่มีป้ายกำกับแทนที่จะออกจากลูปปัจจุบัน ป้ายชื่อคือเครื่องหมายทวิภาคตามด้วยชื่อที่คุณกำหนด ป้ายกำกับต้องเป็นโทเค็นแรกในคำสั่ง และต้องตามด้วยคีย์เวิร์ดที่วนซ้ำ เช่น While
break ย้ายการดำเนินการออกจากลูปที่มีป้ายกำกับ ในลูปแบบฝัง สิ่งนี้จะให้ผลลัพธ์ที่แตกต่างจากคีย์เวิร์ด break ที่ได้เมื่อใช้โดยตัวมันเอง ตัวอย่างนี้มีคำสั่ง while พร้อมด้วยคำสั่ง for:
:myLabel while (<condition 1>) {
for ($item in $items) {
if (<condition 2>) {
break myLabel
}
$item = $x # A statement inside the For-loop
}
}
$a = $c # A statement after the labeled While-loop
หากเงื่อนไข 2 ประเมินเป็น จริง การทำงานของสคริปต์จะข้ามไปที่คำสั่งหลังลูปที่มีป้ายกำกับ ในตัวอย่าง การดำเนินการจะเริ่มต้นอีกครั้งด้วยคำสั่ง $a=$c
คุณสามารถซ้อนลูปที่มีป้ายกำกับได้หลายรายการ ดังที่แสดงในตัวอย่างต่อไปนี้
:red while (<condition1>) {
:yellow while (<condition2>) {
while (<condition3>) {
if ($a) {break}
if ($b) {break red}
if ($c) {break yellow}
}
Write-Host "After innermost loop"
}
Write-Host "After yellow loop"
}
Write-Host "After red loop"
หากตัวแปร $b ประเมินเป็น True การทำงานของสคริปต์จะดำเนินต่อหลังจากการวนซ้ำที่มีป้ายกำกับว่า "สีแดง" หากตัวแปร $c ประเมินเป็น True การดำเนินการควบคุมสคริปต์จะดำเนินต่อหลังจากการวนซ้ำที่มีป้ายกำกับว่า "สีเหลือง"
หากตัวแปร $a ประเมินเป็น True การดำเนินการจะดำเนินการต่อหลังจากลูปในสุด ไม่จำเป็นต้องมีป้ายกำกับ
PowerShell ไม่จำกัดว่าป้ายกำกับสามารถกลับมาดำเนินการได้ไกลแค่ไหน ป้ายกำกับยังสามารถส่งผ่านการควบคุมข้ามขอบเขตการเรียกใช้สคริปต์และการเรียกใช้ฟังก์ชันได้
การใช้ break ในคำสั่ง switch
ในโครงสร้าง switch break ทำให้ PowerShell ออกจากบล็อกโค้ด switch
คำหลัก break ใช้เพื่อออกจากโครงสร้าง switch ตัวอย่างเช่น คำสั่ง switch ต่อไปนี้ใช้คำสั่ง break เพื่อทดสอบเงื่อนไขที่เฉพาะเจาะจงที่สุด:
$var = "word2"
switch -regex ($var) {
"word2" {
Write-Host "Exact" $_
break
}
"word.*" {
Write-Host "Match on the prefix" $_
break
}
"w.*" {
Write-Host "Match on at least the first letter" $_
break
}
default {
Write-Host "No match" $_
break
}
}
ในตัวอย่างนี้ ตัวแปร $var ถูกสร้างขึ้นและเตรียมใช้งานเป็นค่าสตริง word2 คำสั่ง switch ใช้คลาส Regex เพื่อจับคู่ค่าตัวแปรก่อนด้วยคำว่า word2 เนื่องจากค่าตัวแปรและการทดสอบแรกในคำสั่ง switch ตรงกัน บล็อกโค้ดแรกในคำสั่ง switch จึงทำงาน
เมื่อ PowerShell ไปถึงคำสั่ง break คำสั่งแรก คำสั่ง switch จะออก ถ้าคำสั่ง break สี่คำสั่งถูกลบออกจากตัวอย่าง จะถือว่าตรงตามเงื่อนไขทั้งสี่ประการ ตัวอย่างนี้ใช้คำสั่ง break เพื่อแสดงผลลัพธ์เมื่อตรงตามเงื่อนไขที่เฉพาะเจาะจงที่สุด
การใช้ break ในคำสั่ง trap
หากคำสั่งสุดท้ายที่ดำเนินการในเนื้อความของคำสั่ง trap คือ break วัตถุข้อผิดพลาดจะถูกระงับและข้อยกเว้นจะถูกโยนทิ้งอีกครั้ง
ตัวอย่างต่อไปนี้สร้างข้อยกเว้น DivideByZeroException ที่ติดอยู่โดยใช้คำสั่ง trap
function test {
trap [DivideByZeroException] {
Write-Host 'divide by zero trapped'
break
}
$i = 3
'Before loop'
while ($true) {
"1 / $i = " + (1 / $i--)
}
'After loop'
}
test
โปรดสังเกตว่าการดำเนินการหยุดที่ข้อยกเว้น ไม่เคยเข้าถึง After loop ข้อยกเว้นจะถูกโยนทิ้งอีกครั้งหลังจากดำเนินการ trap
Before loop
1 / 3 = 0.333333333333333
1 / 2 = 0.5
1 / 1 = 1
divide by zero trapped
ParentContainsErrorRecordException:
Line |
10 | "1 / $i = " + (1 / $i--)
| ~~~~~~~~~~~~~~~~~~~~~~~~
| Attempted to divide by zero.
อย่าใช้ break นอกลูป switch หรือ trap
เมื่อใช้ break ภายนอกโครงสร้างที่รองรับโดยตรง (ลูป, switch, trap) PowerShell จะค้นหา up the call stack สำหรับโครงสร้างปิดล้อม หากไม่พบโครงสร้างที่ปิดล้อม รันสเปซปัจจุบันจะถูกยกเลิกอย่างเงียบๆ
ซึ่งหมายความว่าฟังก์ชันและสคริปต์ที่ใช้ ตัวแบ่ง ภายนอกโครงสร้างปิดที่สนับสนุนโดยไม่ได้ตั้งใจสามารถยุติ ผู้เรียก โดยไม่ได้ตั้งใจได้
การใช้ break ภายในไปป์ไลน์ break เช่น บล็อกสคริปต์ ForEach-Object ไม่เพียงแต่ออกจากไปป์ไลน์เท่านั้น แต่ยังอาจยุติรันสเปซทั้งหมดอีกด้วย
ดูเพิ่มเติม
- about_Comparison_Operators
- เกี่ยวกับ_ดำเนินการต่อ
- เกี่ยวกับ_สำหรับ
- about_Foreach
- เกี่ยวกับ_สวิตช์
- เกี่ยวกับ_โยน
- about_Trap
- about_Try_Catch_ในที่สุด
- เกี่ยวกับ_ในขณะที่