一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

關(guān)于批處理的學習之三

 daomucun 2008-12-25

3 賦值 調(diào)用

3.1 賦值

 

3.1.1 給變量賦予一個文字字符串的值

說到賦值,就得先弄懂 set 這條命令。set 這條命令比較復雜,在命令提示符中鍵入 set /? 后得到的幫助信息也很多。不過,簡單地說,使用 set 跟上變量,再用等號 = 跟上字符串就能簡單地給該變量賦值了。例如 set var=Hello world! 。為了確認一下變量 var 的值是否是 Hello world! ,可以用 set var 來查看變量 var 的值。用 set v 可以查看所有以字母 v 開頭變量的值。直接輸入 set 可以查看所有變量的值。另外,變量兩側(cè)加上百分符號 % 用來表示該變量的值(內(nèi)容)。這樣做可以將該變量的值賦給其他變量或是用做計算顯示等處理。

 

3.1.2 給變量賦予一個數(shù)值型的值

set 后面加上 /a 的參數(shù)可以給變量賦予一個數(shù)值型的值,例如 set /a var=48 表示將數(shù)字48賦給變量var。該數(shù)值型的變量是一個32位的整數(shù)型數(shù)值,即占用4個字節(jié),能表示的數(shù)值個數(shù)為2的32次方,含正負號,范圍為:-2147483648~2147483647。

3.1.3 從外部獲得輸入的賦值方式

set 后面加上 /p 的參數(shù),可以將變量設成用戶輸入的一行輸入。讀取輸入行之前,顯示指定的 提示文字。當然,提示文字也可以是空的。比如 set /p var=請輸入一些文字: ,可以顯示出一段提示文字"請輸入一些文字:"并能將用戶輸入的信息存到變量var里。/p 的參數(shù)還有很多諸如對字符串的替代、提取、增減等功能,具體可以參考 set 的相關(guān)幫助信息。

3.1.4 變量的的賦予、顯示、變換、計算等功能

可能此時有些朋友對百分號 % 的理解還處于迷茫狀態(tài),對此我們可以做一些實驗。首先,就像前文所說的那樣,給一個叫做 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! 。

此外,百分號可以對變量中的字符串有效地進行編輯或變換。
值得一提的是替換功能,其格式為:原始變量的名稱后面跟上冒號 : ,再加上想要被代替的內(nèi)容,緊接著一個等號 = ,然后再加上用來代替的新內(nèi)容,最后用兩個百分號把以上這些包括起來即可。雖然此時原始變量的值并沒有改變,但百分號里的內(nèi)容可以賦給一個變量,這個變量可以是原始變量。例:echo %var:o=z% ,效果為把 Hello world! 里所有的字母 o 都用字母 z 代替,并顯示出來,然而變量 var 的值卻沒有變化。
當然,我們并不會滿足于僅僅是代替一個字母——有時候我們需要代替兩個。set var2=%var:ld=ms and bugs% ,這條命令可以在把 Hello world! 里的 ld 替換成 ms and bugs 并將新的結(jié)果賦給變量 var2 ,變量 var 仍然不會變化。輸入 echo %var2% 確認一下結(jié)果是否為我們所期待的 Hello worms and bugs! 。

對變量中的字符串在特定位置上的刪減將用到這樣的格式:%var:~m%%var:~m,n% 。m 和 n 為整數(shù)參數(shù)。數(shù)字 m 為正數(shù)表示取變量 var 中從左側(cè)數(shù)第 m 個字符(單字節(jié)字符)以后的內(nèi)容;m 為負數(shù)則表示取變量 var 從右側(cè)數(shù)第 -m 個字符以及其右側(cè)的所有的字符,這就是第一條命令所產(chǎn)生的新字符串。如果數(shù)字 n 為正數(shù),表示在上述新字符串中,從其左側(cè)取 n 個字符的內(nèi)容;若 n 為負數(shù),則從其左側(cè)取字符直到還剩下 -n 個字符為止的內(nèi)容。

如果您堅持認為這種抽象的表達方式是根本無法解釋清楚這該死的 m 和無恥的 n 究竟是怎么回事的話,不如實驗一下下面的例子。為了方便查看效果,我們假定變量 var 中的內(nèi)容為 1234567890 (set var=1234567890),然后依次輸入以下命令并查看相應的結(jié)果。
輸入的命令    結(jié)果    效果                   
echo %var%    1234567890 顯示所有                 
echo %var:~4%   567890   從第4個字符以后開始顯示         
echo %var:~4,3%  567     從第4個字符以后開始顯示,并只顯示前3個  
echo %var:~-4%  7890    從倒數(shù)第4個字符開始顯示         
echo %var:~-4,3% 789     從倒數(shù)第4個字符開始顯示,并只顯示前3個  
echo %var:~4,-2% 5678    從第4個字符以后開始顯示,顯示到還剩2個為止
echo %var:~0,3%  123     從頭開始顯示,并只顯示前3個字符     

echo %var:~0,-3% 1234567   從頭開始顯示,顯示到還剩3個字符為止   

 

此外,set 也可以對數(shù)值型的變量進行常見的運算操作。
set /a num=48
set /a result=%num%+12
echo %result%

上面的命令表示先給數(shù)值 48 賦給變量 num ,然后再把變量 num 的數(shù)值與數(shù)值 12 相加后的結(jié)果賦給變量 result 。第3行可以顯示變量 result 的值,結(jié)果很明顯,是 60 。

 

3.2 調(diào)用

 

與很多編程類的東西一樣,批處理并不一定非得按照文本中命令的排列順序一行一行地執(zhí)行。如果遇到了 goto、callstart 這樣的跳轉(zhuǎn)、調(diào)用、啟動等語句,程序通常會變得多層化,執(zhí)行起來會更加有效。

3.2.1 跳轉(zhuǎn)

goto 對于多少有點編程基礎的朋友來說,想必不是一件難以理解的東西。goto 跟上標簽就能直接讓程序從該標簽處開始繼續(xù)執(zhí)行隨后的命令,不論標簽的位置是在該 goto 命令的前面還是后面。標簽必須以單個冒號 : 開頭,但不區(qū)分大小寫。有個特殊的標簽 :EOF:eof 能將控制轉(zhuǎn)移到當前批腳本文件的結(jié)尾處,它是不需要事先定義的。
::::::::::::跳轉(zhuǎn).bat::::::::::::

@echo off
goto :FirstLable

:SecondLable
echo 然后顯示這句
pause
goto :EOF

:FirstLable
echo 首先顯示這句
pause
goto :SecondLable

::::::::::::::::::::::::::::::::

3.2.2 調(diào)用

call 主要體現(xiàn)在兩個方面:一是調(diào)用該批處理以外的另一個批處理(事實上調(diào)用該批處理本身也可以,只是可能會帶來不必要的死循環(huán));另一方面是有著與 goto 類似的向特定標簽處跳轉(zhuǎn)的功能。然而,call 的獨特之處在于:在調(diào)用的批處理或標簽后的內(nèi)容處理完成以后,控制會繼續(xù)執(zhí)行 call 后面的語句。我們先來看一下用 call 進行跳轉(zhuǎn)的效果。為了方便對比,我們將上面的批處理作如下修改(淺色文字為修改部分)。
::::::::::::跳轉(zhuǎn).bat::::::::::::
@echo off
call :FirstLable

:SecondLable
echo 然后顯示這句
pause
goto :EOF

:FirstLable
echo 首先顯示這句
pause
::goto :SecondLable
::::::::::::::::::::::::::::::::

在用 call 跳轉(zhuǎn)到 :FirstLabel 處執(zhí)行到程序結(jié)尾后(此時 call 的任務才剛剛完成),會繼續(xù)回到 call 語句后的 :SecondLabel 處。假如 goto :SecondLabel 這一句沒有被注釋掉的話,那么控制會跳轉(zhuǎn)到 :SecondLabel 處直到 goto :EOFcall 的使命才真正完成。而且,call 在完成任務后,下面的 :SecondLabel 處內(nèi)容會再次執(zhí)行一遍。

call 作為調(diào)用其他新的批處理的用途時,當前批處理就會暫停,直到新的批處理結(jié)束后,之前的批處理才會繼續(xù)執(zhí)行。例如:直接調(diào)用當前路徑里的一個批處理 call test.bat ,或是要調(diào)用的批處理在當前路徑向上一級的abc文件夾里 call ..\abc\test.bat ,也可以使用絕對路徑找到目標批處理 call D:\abc\test.bat (路徑的寫法請參閱[前言]里命令 cd 的用法介紹)。當然,一個最直觀的例子往往更能說明問題。建立兩個批處理(假設他們在同一路徑下)"調(diào)用.bat"和"被調(diào)用.bat",它們的內(nèi)容分別為:
::::::::::::調(diào)用.bat::::::::::::
@echo off
echo 這里是 調(diào)用.bat
pause

call 被調(diào)用.bat

echo 現(xiàn)在又回到了 調(diào)用.bat
pause

::::::::::::::::::::::::::::::::

:::::::::::被調(diào)用.bat:::::::::::
echo 這里是 被調(diào)用.bat
pause

::::::::::::::::::::::::::::::::
編輯并保存好這兩個批處理,然后運行批處理"調(diào)用.bat",所得到的結(jié)果跟我們預期的完全一致。

3.2.3 啟動

start 雖然也不是一個簡單的命令,但用法絕對不難理解。來幾個例子:start msconfig 用來打開"系統(tǒng)配置應用程序";start notepad 則可以打開一個記事本;start "這就是所謂的標題" cmd 用來打開一個新的命令提示符;start "隨便寫個標題" http://www.baidu.com 便打開百度的首頁;而 start "開玩了" E:\game\starcraft\starcraft.exe 卻是開始星際爭霸(如果您的電腦里安裝了星際且路徑與上述一致的話)等等。雖然 start 的參數(shù)很多(具體用法在輸入 help start 后可以得到),但通常情況下我們只需要知道 start 后面加上標題,再跟上想要執(zhí)行程序、命令或網(wǎng)址即可。值得注意的是:標題要用雙引號引用起來,否則會被作為可執(zhí)行的文件來處理;所要執(zhí)行的東西如果不是系統(tǒng)內(nèi)部程序或命令的話,則需要我們給出具體的路徑,比如絕對路徑。
當然,start 也可以打開另外一個批處理。這看起來似乎與 call 相仿,卻有一些區(qū)別。為了對比 callstart 之間的效果差異,可以在上一個例子中修改"調(diào)用.bat"中的 call 被調(diào)用.batstart 被調(diào)用.bat 。從"調(diào)用.bat"開始執(zhí)行后,"被調(diào)用.bat"也的確能夠被調(diào)用。但之前的批處理也同時繼續(xù)執(zhí)行著。事實上,此時這兩個程序已經(jīng)完全獨立開了,是兩個獨立的進程。

 

3.3 參數(shù)

上文提到了調(diào)用,這里就不得不補充一下參數(shù)。何謂參數(shù)?假如您要使用命令 dir ,那后面所跟的路徑文件名也好、/p (分頁顯示)也好、/w (寬列表顯示)也好、又或者是 /s (所有目錄及子目錄)也好,這些都能被稱作為參數(shù)。對于一條命令來說,它除了能返回(輸出)給我們一些信息以外,我們還經(jīng)常給它輸入一些信息,被輸入的信息就是參數(shù);然而,對于一個批處理來說,它除了能為我們工作(輸出結(jié)果)以外,有時也需要外界給他一些信息。

3.3.1 參數(shù)的傳遞

為了很好的認識到這一點,我們先稍微修改一下上文所使用的"被調(diào)用.bat"這個批處理文件,使之能夠接受處理外界給它的輸入?yún)?shù)。
:::::::::::被調(diào)用.bat:::::::::::
echo 這里是 被調(diào)用.bat
echo 您輸入的第1條參數(shù)為 %1
echo 您輸入的第2條參數(shù)為 %2

pause

::::::::::::::::::::::::::::::::
其中,%1%2 分別代表運行"被調(diào)用.bat"批處理時所跟的兩個參數(shù)。那么它該如何獲得所謂的參數(shù)1和參數(shù)2呢。雙擊運行"被調(diào)用.bat"當然是不行的了。可以在命令提示符里輸入"被調(diào)用.bat"的全名,并在后面加上兩個參數(shù)即可(如果"被調(diào)用.bat"不在當前工作路徑,需要輸入"被調(diào)用.bat"的路徑,比如絕對路徑,以便讓計算機找到它)。就像:D:\批處理\test\被調(diào)用.bat Tom and Jerry 。運行時我們會發(fā)現(xiàn) %1%2 分別顯示為 Tom 和 and ,Jerry 為作為第3個參數(shù)來處理,但該批處理中卻未用到 %3 。提示:在XP等操作系統(tǒng)中,對于漢字的輸入可用 Ctrl + 空格 切換出中文輸入法;也可以按 Tab 鍵讓其自動切換并補充完成您所想要輸入的路徑。

為了進一步驗證這一點,我們再改一下批處理"調(diào)用.bat",讓它在調(diào)用其他批處理時加上參數(shù)
::::::::::::調(diào)用.bat::::::::::::
@echo off
echo 這里是 調(diào)用.bat
pause

call 被調(diào)用.bat Hello world!

echo 現(xiàn)在又回到了 調(diào)用.bat
pause

::::::::::::::::::::::::::::::::

3.3.2 參數(shù)的輸入與輸出

參數(shù)不僅可以是值,也可以是變量。如果是變量的話,它既可以作為輸入,也可以作為輸出。為此,我們需要分別再改一次"調(diào)用.bat"和"被調(diào)用.bat"。

::::::::::::調(diào)用.bat::::::::::::
@echo off
echo 這里是 調(diào)用.bat
pause

set /p Num=請輸入一個整數(shù):
set Square=

call 被調(diào)用.bat Num Square

echo 現(xiàn)在又回到了 調(diào)用.bat ,而且,%Num% 的平方是 %Square%
pause

::::::::::::::::::::::::::::::::

:::::::::::被調(diào)用.bat:::::::::::
echo 這里是 被調(diào)用.bat
echo 您輸入的第1條參數(shù)為 %1
echo 您輸入的第2條參數(shù)為 %2

set /a %2 = %1 * %1

echo 經(jīng)過計算后,您輸入的第1條參數(shù)為 %1
echo 經(jīng)過計算后,您輸入的第1條參數(shù)為 %2

pause

::::::::::::::::::::::::::::::::

可以看出,變量 Num 和 Square 在"被調(diào)用.bat"中是作為值來看待的,而不是變量。另外,嘗試將"調(diào)用.bat"中的 call 被調(diào)用.bat Num Square 換為 call 被調(diào)用.bat %Num% Square ,然后再對比一下結(jié)果,相信您一定會有所收獲。

3.3.3 函數(shù)

在一個批處理的內(nèi)部調(diào)用時,使用參數(shù)會怎么樣呢?那么這就是函數(shù)的雛形。把之前的"跳轉(zhuǎn).bat"稍微也改一下
::::::::::::跳轉(zhuǎn).bat::::::::::::
@echo off
call :FirstLable 很好很強大

:SecondLable
echo 然后顯示這句
pause
goto :EOF

:FirstLable
echo 首先顯示這句,后面跟的參數(shù)為 %1
pause

::::::::::::::::::::::::::::::::

對于 goto 所跟的標簽或 start 所跟的程序,它們后面能否加參數(shù)呢?答案是:前者是否定的;后者是肯定的,試試看。

3.4 后記

 

寫了那么多天,也許我們應該來點更實際更有用的東西。前幾天無意中發(fā)現(xiàn)了一個163郵箱登錄器,在此作為例子介紹一下。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    人妻一区二区三区多毛女| 黄色日韩欧美在线观看| 空之色水之色在线播放| 精品推荐久久久国产av| 丝袜视频日本成人午夜视频| 91麻豆精品欧美一区| 又大又紧又硬又湿又爽又猛| 神马午夜福利一区二区| 国产二级一级内射视频播放| 午夜久久久精品国产精品| 五月激情五月天综合网| 午夜亚洲精品理论片在线观看| 高清亚洲精品中文字幕乱码| 国产精品丝袜一二三区| 日韩特级黄色大片在线观看| 日韩欧美黄色一级视频| 一区二区三区日韩在线| 人妻精品一区二区三区视频免精| 老外那个很粗大做起来很爽| 男人操女人下面国产剧情| 日韩免费国产91在线| 精品欧美日韩一区二区三区| 亚洲专区中文字幕视频| 91亚洲国产—区=区a| 国产午夜福利在线免费观看| 欧美一区二区三区性视频| 欧美精品一区二区三区白虎| 精品亚洲av一区二区三区| 久久黄片免费播放大全| 中文字幕日韩欧美亚洲午夜 | 精品少妇人妻一区二区三区| 亚洲一区二区三区免费的视频| 欧美在线观看视频免费不卡| 亚洲av熟女一区二区三区蜜桃| 黑人粗大一区二区三区| 91爽人人爽人人插人人爽| 神马午夜福利免费视频| 九九热最新视频免费观看| 大香蕉网国产在线观看av| 欧美av人人妻av人人爽蜜桃| 色婷婷激情五月天丁香|