寫過 C 語言的朋友都清楚 main() 函數(shù)可以有兩個參數(shù)仪糖,argc 和 argv奈辰,argc 是命令行參數(shù)個數(shù),argv 則用于訪問具體參數(shù)缩滨,使用起來非常容易。那么用 AHK 如何訪問命令行參數(shù)呢泉瞻?
官方文檔有介紹脉漏,但并不是很詳細,容易讓人看后感覺一頭霧水袖牙,這里簡單整理一下侧巨。
獲取參數(shù)的個數(shù)
要處理參數(shù),得先清楚有沒有參數(shù)鞭达,也就是獲取參數(shù)的個數(shù)司忱。
%0% 內(nèi)部變量是用來存放參數(shù)個數(shù)的,這樣可以用 MsgBox 彈出參數(shù)個數(shù)畴蹭,是不是很簡單坦仍?
MsgBox, %0%
但需要注意的時,如果一個變量名是 a叨襟,我們可以用 MsgBox, %a% 和 MsgBox, % a 兩種方式在 MsgBox 中訪問 a繁扎。但此時我們不能用 MsgBox, % 0 來訪問參數(shù)個數(shù),因為這樣會直接彈出數(shù)字 0糊闽。那么如果我一定要在 MsgBox 的參數(shù)前加 % 呢梳玫?可以先將 %0% 轉(zhuǎn)存到其他變量:
; 注意這里不能用 :=
argc = %0%
MsgBox, % argc
這樣 argc 就和其他變量無異了。
如果我們想判斷命令行參數(shù)有多少個右犹,也有兩種方式:
第一種方式提澎,也是官方文檔中的例子:
if 0 = 2
{
MsgBox, 有兩個參數(shù)
}
有些朋友看到這就一頭霧水了,0 怎么會等于 2念链?其實這句 if 判斷里盼忌,2 確實是數(shù)字 2,而 0 并非數(shù)字 0掂墓,而是 %0% 的值谦纱,也就是命令行參數(shù)的個數(shù)。從這里也可以看出 AHK 語言不嚴謹?shù)牡胤桨鹉骸H绻麑嵲谡J為這樣判斷太違背直覺服协,無法接受,也可以使用迂回的辦法啦粹。
第二種方式:
argc = %0%
if (argc == 2)
{
MsgBox, 有兩個參數(shù)
}
這樣就正常多了偿荷。但需要注意,如下用法是錯誤的:
if (%0% == 2)
{
MsgBox, 有兩個參數(shù)
}
這也是讓很多人困惑的地方唠椭。畢竟 %0% 是特例跳纳,不能像用其他正常變量一樣使用,需要特殊記憶一下贪嫂。
獲取具體參數(shù)
當(dāng)我們知道了參數(shù)個數(shù)寺庄,就可以去讀參數(shù)的值了,有了剛才的鋪墊力崇,這一步也容易很多了斗塘。
%1% 是第一個參數(shù),%2% 是第二個參數(shù)亮靴,依次類推馍盟。而訪問 %1% %2% 的方式,和訪問 %0% 是一樣的茧吊。為了不違反直覺贞岭,還是建議先將參數(shù)轉(zhuǎn)存到一個有意義的變量名,再作處理搓侄,例如:
flag = %1%
if (flag == "-c")
{
MsgBox, -c 參數(shù)已傳入
}
遍歷所有參數(shù)
遍歷所有參數(shù)是一種常見的處理方法瞄桨,在 AHK 里也是比較容易的:
Loop, %0%
{
param := %A_Index%
MsgBox, %param%
}
這里又有事情需要注意了。這個 Loop 看起來沒什么讶踪,%0% 就是參數(shù)的個數(shù)芯侥,有幾個參數(shù)就循環(huán)幾次,但param := %A_Index%
乳讥,這里用的是:=
筹麸,而不是=
。這個之前的param = %1%
是不同的雏婶。為什么有這樣的區(qū)別呢物赶?
A_Index 存放的是一個數(shù)字,如果直接用param := A_Index
留晚,那么 param 的值自然也就是數(shù)字了酵紫,而不是對應(yīng)的參數(shù)。所以需要用%
將這個數(shù)字解析成參數(shù)错维。這個用法又和通常的變量有所不同奖地。
這種用法并非處理命令行參數(shù)時的特例,我們可以看下這個例子:
a := "b"
b := "c"
d := %a%
MsgBox, %d%
a 的值是 b赋焕,b 的值是 c参歹,d := %a%
中,%a% 的值是 b隆判,所以這里的d := %a%
等同于d := b
犬庇,于是 d 的值是 c僧界。也就是可以將變量的值解析成變量名,再去取變量的值臭挽,這樣的技巧在很多語言里都可以用捂襟。
付費解決 Windows、Linux欢峰、Shell葬荷、C、C++纽帖、AHK宠漩、Python、JavaScript懊直、Lua 等領(lǐng)域相關(guān)問題扒吁,靈活定價,歡迎咨詢吹截,微信 ly50247瘦陈。