標籤:

[基礎] 如何用 AHK 處理命令行參數

寫過 C 語言的朋友都清楚 main() 函數可以有兩個參數,argc 和 argv,argc 是命令行參數個數,argv 則用於訪問具體參數,使用起來非常容易。那麼用 AHK 如何訪問命令行參數呢?

官方文檔有介紹,但並不是很詳細,容易讓人看後感覺一頭霧水,這裡簡單整理一下。

獲取參數的個數

要處理參數,得先清楚有沒有參數,也就是獲取參數的個數。

%0% 內部變數是用來存放參數個數的,這樣可以用 MsgBox 彈出參數個數,是不是很簡單?

MsgBox, %0%

但需要注意的時,如果一個變數名是 a,我們可以用 MsgBox, %a% 和 MsgBox, % a 兩種方式在 MsgBox 中訪問

a。但此時我們不能用 MsgBox, % 0 來訪問參數個數,因為這樣會直接彈出數字 0。那麼如果我一定要在 MsgBox 的參數前加 %

呢?可以先將 %0% 轉存到其他變數:

; 注意這裡不能用 :=argc = %0%MsgBox, % argc

這樣 argc 就和其他變數無異了。

如果我們想判斷命令行參數有多少個,也有兩種方式:

第一種方式,也是官方文檔中的例子:

if 0 = 2{ MsgBox, 有兩個參數}

有些朋友看到這就一頭霧水了,0 怎麼會等於 2?其實這句 if 判斷里,2 確實是數字 2,而 0 並非數字 0,而是 %0%

的值,也就是命令行參數的個數。從這裡也可以看出 AHK 語言不嚴謹的地方。如果實在認為這樣判斷太違背直覺,無法接受,也可以使用迂迴的辦法。

第二種方式:

argc = %0%if (argc == 2){ MsgBox, 有兩個參數}

這樣就正常多了。但需要注意,如下用法是錯誤的:

if (%0% == 2){ MsgBox, 有兩個參數}

這也是讓很多人困惑的地方。畢竟 %0% 是特例,不能像用其他正常變數一樣使用,需要特殊記憶一下。

獲取具體參數

當我們知道了參數個數,就可以去讀參數的值了,有了剛才的鋪墊,這一步也容易很多了。

%1% 是第一個參數,%2% 是第二個參數,依次類推。而訪問 %1% %2% 的方式,和訪問 %0% 是一樣的。為了不違反直覺,還是建議先將參數轉存到一個有意義的變數名,再作處理,例如:

flag = %1%if (flag == "-c"){ MsgBox, -c 參數已傳入}

遍歷所有參數

遍歷所有參數是一種常見的處理方法,在 AHK 里也是比較容易的:

Loop, %0%{ param := %A_Index% MsgBox, %param%}

這裡又有事情需要注意了。這個 Loop 看起來沒什麼,%0% 就是參數的個數,有幾個參數就循環幾次,但param := %A_Index%,這裡用的是:=,而不是=。這個之前的param = %1%是不同的。為什麼有這樣的區別呢?

A_Index 存放的是一個數字,如果直接用param := A_Index,那麼 param 的值自然也就是數字了,而不是對應的參數。所以需要用%將這個數字解析成參數。這個用法又和通常的變數有所不同。

這種用法並非處理命令行參數時的特例,我們可以看下這個例子:

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 等領域相關問題,靈活定價,歡迎諮詢,微信 ly50247。


推薦閱讀:

[基礎] 如何在 AHK 中運行其他軟體
AutoHotKey 常用函數或小技巧有哪些分享?
【熱鍵】組合鍵與序列鍵
用AutoHotkey(AHK) 使用滑鼠手勢在win10下快速切換虛擬桌面?

TAG:AutoHotkey |