MIRC 指令碼/進階/迴圈
第 3 章:分支和迴圈
| ← 入門 | mIRC 指令碼 | 定時器 → |
從零開始:熟悉 mIRC | 入門
學習技巧:分支和迴圈 | 定時器 | 使用者等級 | 文字匹配 | 檔案處理 | 雜湊表 | 對話方塊
高階主題:自定義視窗 | 代理 | 套接字
計劃:DLL | COM 物件 | 錯誤檢查和處理
迴圈和分支是 mIRC 指令碼中更為基礎的部分,幾乎你編寫的每個指令碼都會用到它們。它們有助於控制指令碼的流程並告訴它該做什麼。可以把它們想象成博物館裡的導遊,或者工廠裡的監工。導遊就像 if 語句,監工就像 while 迴圈。還有一種第三種語句,使用名為/goto的命令,它可以充當這兩種語句中的任何一種。
你將使用if, elseif和else比本節中的其他任何語句都多。如果沒有這些命令來告訴指令碼去哪裡以及做什麼,你的指令碼每次都會沿著一條線性的路徑執行到最後。If 語句也可以用於錯誤檢查,以確保指令碼執行所需的正確條件存在。
On *:Text:!*:#:{
if ($1 == !1) { msg $chan You picked the number 1, $nick $+ ! }
elseif ($1 == !2) { msg $chan You picked the number 2, $nick $+ ! }
else { msg $chan Your number was not 1 or 2, $nick $+ . }
}
|
這是一個使用 if 語句進行分支的遠端指令碼示例。第一個語句檢查$1是否等於!1。如果是,它將向頻道傳送訊息並停止。如果不是,它將繼續執行下一個語句,即elseif。此語句僅在if語句失敗時啟用。它檢查是否$1是否等於!2。如果是,它將向頻道傳送訊息。否則,它將移動到最後的方案,即else語句。這將向頻道傳送訊息,告知數字不是 1 或 2。
On *:Text:!*:#:{
if ($2) {
if ($2 == 1) { msg $chan You picked the number 1, $nick $+ ! }
elseif ($2 == !2) { msg $chan You picked the number 2, $nick $+ ! }
else { msg $chan Your number was not 1 or 2, $nick $+ . }
return
}
else { msg $chan You need to say ! and then a number. }
}
|
此指令碼演示了三件重要的事情。第一件事是檢查錯誤的能力。第一個 if 語句檢查是否存在兩個引數。第二個演示的是巢狀的 if 語句。這次的 if/elseif/else 巢狀在第一個 If 語句中。這些語句僅在包含它們的 If 為真時才會執行。然後,它們像往常一樣執行。最後演示的是/return命令,稍後將在下面簡要介紹。如果第一個 if 語句為真,它將停止指令碼以防止錯誤出現。
如果語句可以在命令列中使用,前提是使用雙字首 (//).
//if (1 = 1) { echo -a True! }
|
這將評估 if 語句並在括號內的命令執行。請注意,您需要使用管道在命令列上執行多個命令。
//if (1 = 1) { echo -a True! | echo -a 1 does equal 1! }
|
在 if-then-else 語句、$iif 識別符號或 while 迴圈中,可以使用!字首表示非。例如,if ($1 != 1)表示"如果 $1 不等於 1。"
$v1和$v2是識別符號,它們返回 if-then-else、$iif 或 while 命令中的第一個和第二個條件。在語句if (5 == 3), $v1中,5和$v2將等於3.
$iif是 ifif命令的識別符號版本。識別符號的語法為
$iif(c1 operator c2,true,false)
|
c1, c2和運算子與 ifif語句中的含義相同。c1和c2是語句檢查的條件,而運算子是條件比較的物件。
//echo -a $iif($?="Pick a number" == $?="Pick another number",$true,$false)
|
在命令列中輸入該命令。系統將提示您輸入兩個數字。如果輸入的數字相等,則該命令將$true回顯到您的螢幕上。否則,該命令將$false回顯到您的螢幕上。
還記得我之前做的工廠監工的比喻嗎?好吧,這就是它如何應用的。While 迴圈只是重複執行一組命令,直到提供的條件不再為真。可以把它想象成一個重複的 if 語句。
while (conditions) {
commands
}
|
這是 while 迴圈的語法。注意它看起來很像 if 語句?這裡的區別在於 while 迴圈會重複執行,直到條件為假。
On *:Text:!channels:#:{
var %chan = 1
while (%chan <= $chan(0)) {
var %chans = %chans $chan(%chan)
inc %chan
}
msg $chan I am on %chans $+ , $nick $+ .
}
|
此迴圈的功能是允許某人在頻道中輸入!channels,然後你將報告你所在的頻道。工廠監工是工作環境中某人告訴工人完成一項工作直到他們下班的隱喻。While 迴圈是工人,執行其“任務”,直到條件不再為真。在本例中,當變數%chan小於或等於你所在的頻道數 ($chan(0)) 時,它將頻道名稱新增到變數%chans中,然後增加%chan。一旦%chan大於$chan(0),它將停止並繼續執行下一條命令。
On *:Text:!channels:#:{
var %chan = 1
while (%chan <= $chan(0)) {
var %chans = %chans $chan(%chan)
}
msg $chan I am on %chans $+ , $nick $+ .
}
|
不要犯忘記在 while 迴圈中增加變數的錯誤。如果你沒有讓 while 迴圈能夠變為假,它將永遠執行下去,並鎖定 mIRC,直到你按下Ctrl+Break來停止它。
Goto 是一個不太常用的命令,但它很有用,可以充當 if 語句或 while 迴圈。
/goto point
...
:point
commands
|
這基本上是如何/goto工作的。你在指令碼中的某一行設定一個:point,然後在指令碼中的其他地方,你使用goto point跳到 point 後面的那一行。例如
On *:Text:!number*:#:{
if ($2 == 1) { goto 1 }
if ($2 == 2) { goto 2 }
if ($2 == 3) { goto 3 }
else { goto huh }
:1
msg $chan You picked 1!
return
:2
msg $chan You picked 2!
return
:3
msg $chan You picked 3!
return
:huh
msg $chan What number is that $+($nick,?)
}
|
在此示例中,指令碼將確定你選擇了哪個數字並告訴你它是什麼。如果你選擇了不是 1、2 或 3 的內容,指令碼將告訴你。注意 goto 在此指令碼中的作用。根據你的選擇,它將跳轉到指令碼中的某個特定位置。
alias who_ops {
var %op = 1
:start
if ($nick($chan,%op) isop $chan) { echo -a $v1 }
inc %op
if (%op <= $nick($chan,0)) {
goto start
}
}
|
這次,/goto語句不控制指令碼的分支,而是導致它迴圈,直到滿足某個條件。使用goto還是ifif或while
迴圈中使用了四個特殊命令;/halt, /break, /continue和/return. /break和/continue是特定於迴圈的,但是/halt和/return具有涉及停止當前正在執行的指令碼或例程的特殊用途。