-
3.1 賦值
-
3.1.1 給變量賦予一個文字字符串的值
說到賦值,就得先弄懂 set 這條命令。
set 這條命令比較復雜,在命令提示符中鍵入 set /?后得到的幫助信息也很多。
不過,簡單地說,使用 set 跟上變量,再用等號 = 跟上字符串就能簡單地給該變量賦值了。
例如 set var=Hello world!
。
為了確認一下變量 var 的值是否是 Hello world!
可以用set var
來查看變量 var 的值。
用 set v
可以查看所有以字母 v 開頭變量的值。
直接輸入 set
可以查看所有變量的值。
另外,變量兩側加上百分符號【 % 】 用來表示該變量的值(內容)。
這樣做可以將該變量的值賦給其他變量或是用做計算顯示等處理。
-
3.1.2 給變量賦予一個數值型的值
在 set 后面加上 /a 的參數可以給變量賦予一個數值型的值
例如 set /a var=48
表示將數字48賦給變量var。
該數值型的變量是一個32位的整數型數值,即占用4個字節,
能表示的數值個數為2的32次方,含正負號,范圍為:-2147483648~2147483647。
-
3.1.3 從外部獲得輸入的賦值方式
在 set 后面加上 /p 的參數,
可以將變量設成用戶輸入的一行輸入。
讀取輸入行之前,顯示指定的 提示文字。
當然,提示文字也可以是空的。比如 set /p var=請輸入一些文字:
,
可以顯示出一段提示文字"請輸入一些文字:"并能將用戶輸入的信息存到變量var里。
/p 的參數還有很多諸如對字符串的替代、提取、增減等功能,具體可以參考 set 的相關幫助信息。
-
3.1.4 變量的值的賦予、顯示、變換、計算等功能
可能此時有些朋友對百分號 【 % 】的理解還處于迷茫狀態,對此我們可以做一些實驗。首先,就像前文所說的那樣,給一個叫做 var 的變量賦值Hello world! (在命令行里輸入set var=Hello world!
)。
然后我們的打算把變量 var 里的值賦給另一個變量 var1 ,
做法是:set var1=%var%
,此時 var1 里的值也是 Hello world! 了。
假如不使用百分號 % 僅僅是 set var1=var
的話,
那么此時變量 var1 所得到的值僅僅是 var 這3個字母而已。
再回顧一下 echo 的用法,分別嘗試輸入 echo var1
和 echo %var1%
,
所得到的返回輸出分別為:var1 和 Hello world! 。
此外,百分號可以對變量中的字符串有效地進行編輯或變換。
值得一提的是替換功能,其格式為:
原始變量的名稱后面跟上冒號 : ,再加上想要被代替的內容,
緊接著一個等號 = ,然后再加上用來代替的新內容,
最后用兩個百分號把以上這些包括起來即可。
雖然此時原始變量的值并沒有改變,但百分號里的內容可以賦給一個變量,這個變量可以是原始變量。
例: echo %var:o=z%
,效果為把 Hello world! 里所有的字母 o 都用字母 z 代替,并顯示出來,然而變量 var 的值卻沒有變化。
當然,我們并不會滿足于僅僅是代替一個字母—有時候我們需要代替兩個。
set var2=%var:ld=ms and bugs%
,這條命令可以在把 Hello world! 里的 ld 替換成 ms and bugs 并將新的結果賦給變量 var2 ,變量 var 仍然不會變化。
輸入echo %var2%
確認一下結果是否為我們所期待的 Hello worms and bugs! 。
對變量中的字符串在特定位置上的刪減將用到這樣的格式:%var:~m% 和 %var:~m,n% 。
m 和 n 為整數參數。
m 為正數表示取變量 var 中從左側數第 m 個字符(單字節字符)以后的內容;
m 為負數表示取變量 var 中從右側數第 -m 個字符以及其右側的所有的字符,
這就是第一條命令所產生的新字符串。
如果數字 n 為正數,表示在上述新字符串中,從其左側取 n 個字符的內容;若 n 為負數,則從其左側取字符直到還剩下 -n 個字符為止的內容。
如果您堅持認為這種抽象的表達方式是根本無法解釋清楚這該死的 m 和無恥的 n 究竟是怎么回事的話,不如實驗一下下面的例子。
為了方便查看效果,我們假定變量 var 中的內容為 1234567890 (set var=1234567890
),然后依次輸入以下命令并查看相應的結果。
輸入的命令 結果 效果
echo %var% 1234567890 顯示所有
echo %var:~4% 567890 從第4個字符以后開始顯示
echo %var:~4,3% 567 從第4個字符以后開始顯示,并只顯示前3個
echo %var:~-4% 7890 從倒數第4個字符開始顯示
echo %var:~-4,3% 789 從倒數第4個字符開始顯示,并只顯示前3個
echo %var:~4,-2% 5678 從第4個字符以后開始顯示,顯示到還剩2個為止
echo %var:~0,3% 123 從頭開始顯示,并只顯示前3個字符
echo %var:~0,-3% 1234567 從頭開始顯示,顯示到還剩3個字符為止
此外,set 也可以對數值型的變量進行常見的運算操作。
set /a num=48
set /a result=%num%+12
echo %result%
上面的命令表示先給數值 48 賦給變量 num ,然后再把變量 num 的數值與數值 12 相加后的結果賦給變量 result 。第3行可以顯示變量 result 的值,結果很明顯,是 60 。
-
3.2 調用
與很多編程類的東西一樣,批處理并不一定非得按照文本中命令的排列順序一行一行地執行。如果遇到了 goto、call、start 這樣的跳轉、調用、啟動等語句,程序通常會變得多層化,執行起來會更加有效。
-
3.2.1 跳轉
goto 對于多少有點編程基礎的朋友來說,想必不是一件難以理解的東西。
goto 跟上標簽就能直接讓程序從該標簽處開始繼續執行隨后的命令,不論標簽的位置是在該 goto 命令的前面還是后面。
標簽必須以單個冒號 : 開頭,但不區分大小寫。有個特殊的標簽 :EOF 或 :eof 能將控制轉移到當前批腳本文件的結尾處,它是不需要事先定義的。
::::::::::::跳轉.bat::::::::::::
@echo off
goto :FirstLable
:SecondLable
echo 然后顯示這句
pause
goto :EOF
:FirstLable
echo 首先顯示這句
pause
goto :SecondLable
::::::::::::::::::::::::::::::::
-
3.2.2 調用
call 主要體現在兩個方面:
一是調用該批處理以外的另一個批處理(事實上調用該批處理本身也可以,只是可能會帶來不必要的死循環);
另一方面是有著與 goto 類似的向特定標簽處跳轉的功能。
然而,call 的獨特之處在于:
在調用的批處理或標簽后的內容處理完成以后,控制會繼續執行 call 后面的語句。
我們先來看一下用 call 進行跳轉的效果。
為了方便對比,我們將上面的批處理作如下修改(淺色文字為修改部分)。
::::::::::::跳轉.bat::::::::::::
@echo off
call :FirstLable
:SecondLable
echo 然后顯示這句
pause
goto :EOF
:FirstLable
echo 首先顯示這句
pause
::goto :SecondLable
::::::::::::::::::::::::::::::::
在用 call 跳轉到 :FirstLabel 處執行到程序結尾后(此時 call 的任務才剛剛完成),會繼續回到 call 語句后的 :SecondLabel 處。
假如 goto :SecondLabel 這一句沒有被注釋掉的話,那么控制會跳轉到 :SecondLabel 處直到 goto :EOF 處 call 的使命才真正完成。
而且,call 在完成任務后,下面的 :SecondLabel 處內容會再次執行一遍。
當 call 作為調用其他新的批處理的用途時,當前批處理就會暫停,直到新的批處理結束后,之前的批處理才會繼續執行。
例如:直接調用當前路徑里的一個批處理 call test.bat ,或是要調用的批處理在當前路徑向上一級的abc文件夾里 call ..\abc\test.bat ,也可以使用絕對路徑找到目標批處理 call D:\abc\test.bat
(路徑的寫法請參閱[前言]里命令 cd 的用法介紹)。
當然,一個最直觀的例子往往更能說明問題。建立兩個批處理(假設他們在同一路徑下)"調用.bat"和"被調用.bat",它們的內容分別為:
::::::::::::調用.bat::::::::::::
@echo off
echo 這里是 調用.bat
pause
call 被調用.bat
echo 現在又回到了 調用.bat
pause
::::::::::::::::::::::::::::::::
:::::::::::被調用.bat:::::::::::
echo 這里是 被調用.bat
pause
::::::::::::::::::::::::::::::::
編輯并保存好這兩個批處理,然后運行批處理"調用.bat",所得到的結果跟我們預期的完全一致。
-
3.2.3 啟動
start 雖然也不是一個簡單的命令,但用法絕對不難理解。來幾個例子:
start msconfig
用來打開"系統配置應用程序";
start notepad
則可以打開一個記事本;
start "這就是所謂的標題" cmd
用來打開一個新的命令提示符;
start "隨便寫個標題" http://www.baidu.com
便打開百度的首頁;
start "開玩了" E:\game\starcraft\starcraft.exe
卻是開始星際爭霸(如果您的電腦里安裝了星際且路徑與上述一致的話)等等。
雖然 start 的參數很多(具體用法在輸入 help start 后可以得到),但通常情況下我們只需要知道 start 后面加上標題,再跟上想要執行程序、命令或網址即可。值得注意的是:標題要用雙引號引用起來,否則會被作為可執行的文件來處理;所要執行的東西如果不是系統內部程序或命令的話,則需要我們給出具體的路徑,比如絕對路徑。
當然,start 也可以打開另外一個批處理。這看起來似乎與 call 相仿,卻有一些區別。為了對比 call 和 start 之間的效果差異,可以在上一個例子中修改"調用.bat"中的 call 被調用.bat 為 start 被調用.bat 。從"調用.bat"開始執行后,"被調用.bat"也的確能夠被調用。但之前的批處理也同時繼續執行著。事實上,此時這兩個程序已經完全獨立開了,是兩個獨立的進程。
-
3.3 參數
上文提到了調用,這里就不得不補充一下參數。何謂參數?
假如您要使用命令 dir ,那后面所跟的路徑文件名也好、/p (分頁顯示)也好、/w (寬列表顯示)也好、又或者是 /s (所有目錄及子目錄)也好,這些都能被稱作為參數。對于一條命令來說,它除了能返回(輸出)給我們一些信息以外,我們還經常給它輸入一些信息,被輸入的信息就是參數;然而,對于一個批處理來說,它除了能為我們工作(輸出結果)以外,有時也需要外界給他一些信息。
-
3.3.1 參數的傳遞
為了很好的認識到這一點,我們先稍微修改一下上文所使用的"被調用.bat"這個批處理文件,使之能夠接受處理外界給它的輸入參數。
:::::::::::被調用.bat:::::::::::
echo 這里是 被調用.bat
echo 您輸入的第1條參數為 %1
echo 您輸入的第2條參數為 %2
pause
::::::::::::::::::::::::::::::::
其中,%1 和 %2 分別代表運行"被調用.bat"批處理時所跟的兩個參數。
那么它該如何獲得所謂的參數1和參數2呢。雙擊運行"被調用.bat"當然是不行的了。可以在命令提示符里輸入"被調用.bat"的全名,并在后面加上兩個參數即可(如果"被調用.bat"不在當前工作路徑,需要輸入"被調用.bat"的路徑,比如絕對路徑,以便讓計算機找到它)。就像:D:\批處理\test\被調用.bat Tom and Jerry
。運行時我們會發現 %1 和 %2 分別顯示為 Tom 和 and ,Jerry 為作為第3個參數來處理,但該批處理中卻未用到 %3 。提示:在XP等操作系統中,對于漢字的輸入可用 Ctrl + 空格 切換出中文輸入法;也可以按 Tab 鍵讓其自動切換并補充完成您所想要輸入的路徑。
為了進一步驗證這一點,我們再改一下批處理"調用.bat",讓它在調用其他批處理時加上參數
::::::::::::調用.bat::::::::::::
@echo off
echo 這里是 調用.bat
pause
call 被調用.bat Hello world!
echo 現在又回到了 調用.bat
pause
::::::::::::::::::::::::::::::::
-
3.3.2 參數的輸入與輸出
參數不僅可以是值,也可以是變量。如果是變量的話,它既可以作為輸入,也可以作為輸出。為此,我們需要分別再改一次"調用.bat"和"被調用.bat"。
::::::::::::調用.bat::::::::::::
@echo off
echo 這里是 調用.bat
pause
set /p Num=請輸入一個整數:
set Square=
call 被調用.bat Num Square
echo 現在又回到了 調用.bat ,而且,%Num% 的平方是 %Square% 。
pause
::::::::::::::::::::::::::::::::
:::::::::::被調用.bat:::::::::::
echo 這里是 被調用.bat
echo 您輸入的第1條參數為 %1
echo 您輸入的第2條參數為 %2
set /a %2 = %1 * %1
echo 經過計算后,您輸入的第1條參數為 %1
echo 經過計算后,您輸入的第2條參數為 %2
pause
::::::::::::::::::::::::::::::::
可以看出,在批處理"被調用.bat"中的 call 被調用.bat Num Square 里,變量 Num 和 Square 被傳遞過去的只是變量名而已,而不是變量中的數值。另外,嘗試將"調用.bat"中的 call 被調用.bat Num Square
換為 call 被調用.bat %Num% Square
,然后再對比一下結果,相信您一定會有所收獲。
-
3.3.3 函數
在一個批處理的內部調用時,使用參數會怎么樣呢?那么這就是函數的雛形。把之前的"跳轉.bat"稍微也改一下
::::::::::::跳轉.bat::::::::::::
@echo off
call :FirstLable 很好很強大
:SecondLable
echo 然后顯示這句
pause
goto :EOF
:FirstLable
echo 首先顯示這句,后面跟的參數為 %1
pause
::::::::::::::::::::::::::::::::
對于 goto 所跟的標簽或 start 所跟的程序,它們后面能否加參數呢?
答案是:前者是否定的;后者是肯定的,試試看。
-
3.4 后記
寫了那么多天,也許我們應該來點更實際更有用的東西。前幾天無意中發現了一個163郵箱登錄器,在此作為例子介紹一下。
:::::::163郵箱登錄器.bat::::::::
@echo off
::不顯示命令行
mode con cols=32 lines=8
::設置窗口的尺寸
title 163郵箱登錄器
::設置該批處理的標題
color 3a
::設置背景(暗靛色)和文字(亮綠色)的顏色。
::另外,在命令提示符中輸入 color/? 可獲得詳細的顏色信息
set /p username=帳號:
set /p password=密碼:
::給出輸入的提示,并將字符串賦給相應的變量
start "正在登錄郵箱" "https://reg.163.com/logins.jsp?username=%username%&password=%password%&url=http://fm163.163.com/coremail/fcg/ntesdoor2"
::事實上,那個網址鏈接才是整個程序的核心部分,注意其中的 %username% 和 %password% 分別是指變量 username 和 password 里的字符串內容。
::::::::::::::::::::::::::::::::