Windows 腳本學習(第三章:賦值 調用 參數)

  • 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 var1echo %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 里的字符串內容。 
::::::::::::::::::::::::::::::::

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容

  • 個人學習批處理的初衷來源于實際工作;在某個迭代版本有個BS(安卓手游模擬器)大需求,從而在測試過程中就重復涉及到...
    Luckykailiu閱讀 4,753評論 0 11
  • 《ijs》速成開發手冊3.0 官方用戶交流:iApp開發交流(1) 239547050iApp開發交流(2) 10...
    葉染柒丶閱讀 5,256評論 0 7
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,198評論 2 33
  • 批處理符號簡介 回顯屏蔽 @ 重定向1 >與>> 重定向2 < 管道符號 | 轉義符 ^ 邏輯命令符包括:&、&&...
    wyude閱讀 3,009評論 2 5
  • 身體不舒服的日子真的好難過啊!上周鼻子里面長痘痘,不要說吃東西了,連呼吸都是痛苦的,昨天剛慢慢的有好轉,結果今天發...
    略略略嘔嘔嘔閱讀 150評論 0 0