【轉】Windows批處理學習(二)——批處理(1)

轉自:http://akudy.blog.51cto.com/2277883/1239032


前記

   前面整理了MS-DOS常用命令,爲什麼先整理DOS命令,因爲DOS命令是批處理的基礎,只有打好基礎才能進入下一步的學習。閒話少撤,下面步入正題。

什麼是DOS批處理?

   批處理(Batch)是一種實現批量處理操作的腳本文件,通常說的批處理有兩類:DOS批處理和PS批處理,其中DOS批處理就只我們接下來將到的,PS批處理是基於PhotoShop圖片編輯軟件的一種批處理圖片處理的腳本。我們這裏講到的是DOS批處理,與PS批處理沒有半毛錢的關係。

   在Windows系統中,批處理可以稱爲一種基於DOS操作系統的簡單腳本語言,實質它是有一系列(一個或多個)DOS命令組成的一個文件;主要用於實現自動批量的執行DOS命令而設計的。在Windows中通常將腳本稱爲宏,宏就是一系列命令組織在一起作爲一個單獨的命令來完成某一項任務。通過查看命令行工具的可執行程序,可以知道,批處理的腳本文件可以是“.bat”、“.exe”、“.com”、“.cmd”作爲擴展名的文件,大多數情況下我們遇到的批處理是一個“.bat”文件。

   批處理是一種解釋型腳本語言,它是有MS-DOS或Windows系統內嵌的命令解釋器(通常爲command.com或cmd.exe)解釋執行的,它並不進行復雜的編譯過程,所以通常文本編輯器編輯保存爲“.bat”文件後就可以直接運行。正因爲它很從編寫到執行的過程很簡單,所以最適合沒有任何環境下的裸機下使用;肯定都在想現在編程語言這麼流行,遠遠要比單純的DOS批處理靈活、規範的多,但爲什麼還有了解DOS批處理呢?因爲現下大多數的編程語言都需要嚴格的編譯,然後才能執行,也就是說它們需要一個特定的編譯環境,而DOS批處理必須要,只有你是Windows系統應該都支持的。試想一下,在一個沒有任何環境的Windows機器前,需要批量修改多個文件的名稱,你的第一反映,一個一個改,當然不是不可以,但是你不覺得煩嗎!當你瞭解批處理後就可以使用一個腳本輕鬆的搞定(首先設個懸念...至於如何實現,下面會慢慢講到)。

DOS批處理的使用

1.系統環境變量

   學習什麼,雖然都是慢慢體會其特點,但是我還是先將批處理的特點列出來,作爲參照標準。上面介紹批處理實質就是一個或多個DOS命令組成的一個文件,所以在編寫批處理腳本時,它的特點與MS-DOS命令特定基本一致。

  • 批處理由MS-DOS命令行組成,用於實現文件、目錄、文本文件內容等的批量處理操作。

  • 批處理中的命令、命令選項以及參數是不區分大小寫的,但是某些特殊情況下參數(主要指字符串常量)是區分大小寫的。

  • 批處理中的代碼行使用換行符(包括Enter鍵等)進行分割或結束;一句代碼的命令、選項以及參數等符號之間使用空白符(包括Tab鍵、Space鍵等)或其他特殊符號(包括“,”、“=”或“;”等)進行分割。

  • 批處理的解析執行是按照從代碼開始到結束的順序執行的,也就是“自上而下”的順序,哪條代碼先出現就先解析執行,然後繼續向後執行。

  • 批處理值執行過程中,當遇到錯誤代碼行時會捕獲錯誤信息並進行向下執行,直到越多終止符爲止。也就是說當遇到錯誤是不會回滾錯位代碼行之前的操作,同時會進行執行錯誤代碼行之後的代碼。

2.批處理支持的類型

   任何編程語言所支持的類型無非就三種:數字、字符和邏輯值。數字可以衍生爲整數以及浮點數、字符可以衍生爲字符串。MS-DOS操作系統作爲最早的磁盤操作系統,估計沒有考慮到數據的運算,而只是單純的實現文件或目錄的管理功能。所以對應批處理來說只支持整數數字和字符(串)兩種類型。

   在任何編程語言中,數值的表示都是有一定範圍的,在批處理中數值的表示範圍一般受限於處理器的位長,對32位的機器來說,整數值的表示範圍爲0x80000000h~0x7FFFFFFFh,即-2147483648~+2147483647。大多數情況下我們使用的都是十進制的數值表示法,由0~9這10個數字組成的值,同時批處理還支持八進制和十六進制的標識符,其中八進制以“0”爲前綴,由0~7這8個數字組成的值,例如010表示十進制的8;十六進制以“0x”爲前綴,由0~9這10個數字和A、B、C、D、E、F這6個字母組成的數值,例如0xA表示十進制的10。(進製表示法其實是數學知識)

   對於字符來說,字符就是自然界中你所能想到並能描述出來的單個符號,字符一般與編碼格式聯繫的比較緊密,何爲編碼格式,說白了就是將符號使用二進制的方式表示的標準(現在的編碼格式比較多,需要了解的請自行查資料,常見的就是ASCII和Unicode兩種字符集編碼規範)。對應MS-DOS來說,初期的DOS基本只支持ASCII字符,也就是英文狀態下的符號;由於需要國際化,所以現在基本都支持Unicode字符,也就是各國的字符符號。字符串,簡單的理解就是有一個或多個字符組成的一段文字,批處理中可以直接支持字符串的表示,例如“ABC”可以直接使用,而在某些特定的情況下,字符串需要做一個特殊的處理,最常見的特殊處理方式就是使用英文狀態下的“""”或“''”將字符串引起來;例如當在處理一個帶有空白符的目錄時可能會使用到,當在進行字符串比較的時候也可能使用到。

3.批處理中的特殊字符符號

   關於批處理的特殊符號的整理,我感覺有些糾結,因爲特殊符號與批處理語句聯繫的非常緊密,單獨的來說符號,估計你也不知道怎麼用,所以這個地方將集合批處理語句來解釋各個特殊符號的使用方式。

   批處理中的特殊符號用於支持批處理程序的解析執行,這些符號屬於批處理中保留的字符(串),具有特定的表示意思,在批處理中常見的特殊符號見下表。

作用類型 符號 說明
回顯屏蔽 @ 用於關閉命令顯示。默認情況下MS-DOS解釋器會解析並輸出使用的命令行命令,使用“@命令”可以關閉該命令的顯示
輸出重定向 > 將輸出信息重定向到指定的設備或文件,系統默認輸出到顯示器。“>”在會覆蓋原有內容,“>>”在在原有內容上進行追加
>>
輸入重定向 < 將輸入信息來源重定向爲指定的設備或文件,以換行符終止。系統默認從顯示器讀取輸入信息
管道重定向 | 將管道符號前面命令的輸出結果重定向輸出到管道符號後面的命令中去,作爲後面命令的輸入。語法爲:命令1|命令2
轉義字符 ^
將特殊符號轉化爲一般符號,即剝離特殊符號的特殊地位。主要用在:|、&、>、<符號上
$ 將特殊的字符轉換爲一個特定的值,主要用在“prompt”命令模式中
邏輯命令符 &
無條件執行符號後面的命令
&& 當符號前面的命令成功執行時,執行符號後面的命令,否則不執行
|| 當符號前面的命令失敗時,執行符號後面的命令,否則不執行
通配符 * 表示任意個字符,可以表示一個字符,也可以表示多個字符,通常用於表示所有內容,常用在文件或內容查找中
? 表示任意一個字符串,常用在文件或內容查找中
引用符 % 普通環境下對變量的引用,格式爲“%xxx%”;特殊情況下還可以對參數進行引用,格式爲“%number”,其中number爲0~9中的任一個整數
! 特殊環境下對變量的引用,格式爲“!xxx!”,通常用在啓用延遲變量擴展功能後的環境,默認是不啓用的
3.1.回顯屏蔽:“@”

   在批處理中“@”符號一般用在命令去,用於屏蔽MS-DOS解析器對該命令的回顯輸出功能。默認情況下MS-DOS在執行批處理腳本是會將一行行命令顯示輸出到MS-DOS解釋器的控制檯,然後再執行。這個問題怎麼理解?可以這樣看,在命令行中輸入DOS命令然後鍵入回車鍵,即可以執行輸入的命令語句,由於MS-DOS解釋器換行符的限定,所以我們不能在MS-DOS解釋器中輸入多行命令語句,只能單行單行的輸入執行,然後再輸入執行……爲了解決這個弱點,可以將多條命令放在一起解釋執行,於是批處理腳本就誕生了。

   那麼我們來看看批處理腳本是如何解釋執行的,首先我們知道批處理是順序解釋執行的,也就是從腳本的開始第一行命令開始進行執行,一直到腳本的結尾最後一行命令。實質上MS-DOS解釋器會讀取每一行命令,然後執行,就相當於上面講到的命令行命令的執行一樣,首先輸入命令然後按回車鍵執行,只不過這裏是從批處理文件中讀取一行內容然後輸入到MS-DOS解釋器,緊接着自動鍵入回車鍵進行執行,然後在讀取下一行內容……,所以也就出現了在MS-DOS解釋器中顯示行內容的過程。因此批處理中提供了“@”符號來屏蔽回顯輸出的過程。用法比較簡單:

@命令

“@”只是一個用於修飾命令的符號,所以命令的用法並不會受到“@”符號的影響,意思就是說命令該怎麼還是怎麼用。需要注意的是“@”符號只對使用“@”符號的命令起到回顯屏蔽的操作,不對其後的命令語句起作用。下面我們可以使用文本新建一個bat文件測試一下(新建記事本,修改擴展名爲bat確定即可),寫入:

1
2
set var=abc
pause

保存後,雙擊執行;然後在修改爲:

1
2
@set var=abc
pause

保存後,雙擊執行,可以通過對比發現“@”符號的具體作用。

3.2.輸出重定向:“>”、“>>”

   “>”和“>>”稱爲輸出重定向符號,通俗一點的理解就是可以將內容輸出到指定的設備或文件。通常這兩個符號與命令一起使用,用於將命令的響應信息即執行命令的結果輸出到指定的文件中,對於MS-DOS命令行來說,執行任何一個命令都會有對應的輸出信息,默認情況下,這個輸出的內容會顯示在MS-DOS解釋器的控制檯中,當然這種情況是不便於查看的,因此批處理中提供了“>”和“>>”重定向符號來將內容輸出到指定的地方。用法比較簡單:

命令 ... > 文件地址

命令 ... >> 文件地址

與“@”符號一樣,“>”和“>>”符號不會影響命令本身的用法,只不過右邊必須要指定保存輸出內容的文件地址,可以是文件的相對路徑,也可以是文件的絕對路徑,默認爲相對路徑,同時執行快磁盤分區輸出。

   爲什麼會提供兩種輸出重定向的符號?理所當然,兩種重定向符號的作用必定不同,其中“>”符號用於將輸出內容寫入到一個空的文件中,也就是說文件的內容爲空,當文件內容不爲空時會首先擦除文件內容,然後在寫入輸出內容;“>>”符號用於將輸入內容追加到指定的文件中,文件內容可以是空,也可以是非空的;兩者的共同點就是在文件不存在時會自動新建文件。簡單的理解就是“>”爲寫入新內容,而“>>”爲追加內容,怎麼將都是空話,只有親自體驗到了才能體會到。例如在新建的bat文件中輸入以下代碼:

1
2
3
4
@echo 123 > C:\a.txt
@echo abc > C:\a.txt
@echo 123 >> C:\b.txt
@echo abc >> C:\b.txt

保存後執行可以看到C盤中新建a.txt和b.txt兩個文件,a.txt的內容是“abc”,b.txt的內容是“123 abc”。

3.3.輸入重定向:“<”

   “<”稱爲輸入重定向符號,通俗的理解就是可以從指定的文件中讀取一行內容到當前位置。通常與命令結合使用,用於從文件中讀取一行內容作爲命令的參數使用,而對於MS-DOS中任何一個具有輸入參數的命令來說,默認是從MS-DOS解釋器中接收輸入信息的,當然這樣就不夠靈活,不能維護代碼的完整性,所以就出現了“<”符號。用法相對比較簡單:

命令 ... < 文件地

同樣,命令的用法與原始用法基本一致,只不過“< 文件地址”部分可以作爲命令的某些選項或參數的替代品。但是通常情況下我們值使用文件保存對應的參數信息,不保存命令的選項信息。特別注意的文件地址所指定的文件必須存在,可以是相對路徑或絕對路徑。例如首先在C盤中新建一個a.txt文本文件並隨便編寫內容,在新建的bat文件中輸入以下代碼:

1
2
3
@set /p var= < C:\a.txt
@echo %var%
@pause

保存後執行可以看到輸入的輸出了a.txt文件中的第一行內容。這個地方需要注意的是,“<”符號只能讀取文件的第一行內容,這裏說的行主要是通過換行符(Enter鍵)進行分割。與該符號一起使用的最多的命令就是“set”命令。

3.4.管道重定向:“|”

   “|”稱爲管道符,作用就是將符號前的輸出內容作爲符號後的輸入內容,之前我們遇到過“type ... |more”的寫法,其作用就是將“type ...”命令行的輸出內容作爲“more”命令的輸入內容,“type ...”用於查看文件內容,“more”用於分頁顯示,所以就實現類文件內容的分頁顯示功能。“|”管道符的用法相對嚴格一點:

命令1 ... | 命令2 ...

“|”符號一般需要兩個命令參數,符號前的命令作爲輸出內容的命令,一般必須要有內容輸入,符號後的命令作爲接收輸入內容的命令;即將命令1的輸出內容作爲命令2的輸入參數。下面我們通過例子來理解。

1
2
@type C:\a.txt | more
@pause

上面的例子可以將C盤中a.txt的文件內容進行分屏顯示。再看下面的例子:

1
2
3
@echo bbbbbbb > C:\b.txt
@echo y|del /p C:\b.txt
@pause

其中“del /p”用於刪除文件並在刪除之前提示確認,當輸入“y”則刪除,輸入其他則不刪除。上面的代碼是說將“y”作爲“del /p”的輸入內容進行處理。

   可以看成“|”符號和“<”符號都可以實現輸入內容的重定向操作,不過“|”是從命令行控制檯的上一個命令輸入信息中獲取內容,而“<”是從一個特定的文件中獲取內容的第一行信息。

3.5.轉義字符:“^”、“$”

   “^”是批處理中通用的轉義字符,可以將特殊符號轉化爲一般符號進行處理。當我們要輸出“>”文本字符時,該如何處理?直接使用會將“>”符號作爲重定向符號進行處理,這時就需要使用轉義字符。轉義字符的使用比較簡單:

^特殊字符

這裏所說的特殊字符一般指“|”、“&”、“<”、“>”這四個符號。例如:

1
2
@echo aaaaa ^> C:\a.txt
@pause

保存並執行,我們可以看到在控制檯輸出了“aaaaa > C:\a.txt”的文本內容,並沒有將“>”作爲重定向符號處理。

   “$”轉義符號是“prompt”命令中的轉義字符,通常後面接一個特定的字母表示一個結果。可以使用“prompt/?”或“help prompt”命令來查看使用說明。在這裏就不多講了。

3.6.邏輯命令符:“&”、“&&”、“||”

   批處理中提供了三種邏輯命令符:“&”、“&&”和“||”。三個邏輯命令符的作爲分別爲:

  • “&”符號——無條件執行符號後的命令語句。也就是符號後的語句一定會執行,這個符號大多用於命令的連接執行,即默認情況下MS-DOS只能解析一行的命令執行(以換行符爲分隔符),通常情況下一條命令作爲一行語句;可以使用“&”符號將多條命令連接起來執行達到一行書寫多條命令的效果。

  • “&&”符號——只有當符號前面的命令執行成功時纔會執行符號後面的命令語句,否則符號後的命令語句不會執行。

  • “||”符號——只有當符號前面的命令執行失敗時纔會執行符號後面的命令語句,否則符號後的命令語句不會執行。

   三個運算符都必須兩條命令語句參與,基本上都是由符號前的語句來決定符號後的語句是否執行。用法類是“|”管道符號,可以自行嘗試練習。

3.7.通配符:“*”、“?”

   通配符是一種特殊的符號,可用於模糊搜索,當我們不確定文件名稱時可以使用通配符來代替符合標準的文件名。批處理中提供兩種通配符“*”和“?”。在當我面不確定內容的時候可以使用通配符代替一個或多個或所有字符,其中“*”用於表示一個或多個任意字符串,而“?”用於表示一個任意字符。例如:

1
2
move *.txt temp\all.txt
mvoe a?.txt temp\a.txt

其中第一個命令行用於將當前目錄中的所有的“.txt”文件移動到temp目錄下並將內容合併後輸出到all.txt文件;第二個命令行用於將當前目錄中所有以a開頭的兩個字符作爲文件名的文件移動到temp目錄下並將內容合併後輸出到a.txt文件中。

3.8.引用符:“%”、“!”

   這裏所說的引用符,主要是指在批處理中對環境變量以及參數信息的應用。也就是說使用這種符號標識的字符會被解析爲一種變量,從而引用變量對應的值,當然這裏說是引用,不是很確切,實質是一種特殊字符的替換方式。

   “%”是比較靈活的引用符號,常見的基本有三種用法:使用“%xxx%”引用普通的非延遲環境變量擴展環境下的環境變量;使用“%number”引用特殊命令中的參數值,使用0-9表示參數的索引,即number的值是0-9之間的整數;作爲字符“%”的轉義字符,例如“%%”表示一個“%”字符,“%%%%”表示兩個“%”字符。三種用法的標準格式爲:

%變量名%

%參數索引

%%...

   默認情況下,MS-DOS解釋器在執行到“%xxx%”字符串的時候會將兩個“%”之間的字符表達式“xxx”解析爲變量名,然後在環境變量中查找該變量名對應的值來替換“%xxx%”字符串,從而達到引用變量的效果。同理,當執行到“%number”的表達式時,會自動查找對應索引的參數值來替換“%number”字符串,默認情況下%0用於表示當前執行的批處理文件的絕對路徑。

   “!”符號是對變量引用符號“%”的一個擴展,這個符號只有在開啓了延遲環境變量擴展功能後才能使用,也就是出現在“setlocal”和“endlocal”之間。在延遲環境變量擴展環境中與“%”引用變量的方式一樣,使用“!xxx!”的方式來引用環境變量,用法如下:

!變量名!

   在延遲環境變量環境下,當MS-DOS解釋器執行到“!xxx!”字符串的時候會將兩個“!”之間的字符表達式“xxx”解析爲變量名,然後在環境變量中查找該變量名對應的值來替換“!xxx!”字符串,從而達到引用變量的效果;當然,它沒有參數引用和字符轉義的功能。至於爲什麼會有這個符號的擴展,將在以後講到。

4.批處理中的算術符號

   上面已經講到批處理支持數值類型的表示,同樣支持數值類型的運算處理,當然批處理比較弱智,只支持整數類型的數值的算術運算,不僅支持基本的數學算術運算,還支持高級的算術運算。批處理支持的所有的算術運算符號如下表:

類型 符號 名稱描述
說明
分組 () 括號 括號內優選運算
一元操作符 ! 邏輯非 非0爲1,非其它值爲0
~ 按位非 對二進制碼進行位取反,1變爲0,1變爲0
- 負號 表示負數
算術(二元)操作符 *
乘法運算
/ 除法運算,求整除的商
% 模運算,求整除後的餘數
+ 加法運算
- 減法運算
邏輯(二元)操作符 <<
左移位 對二進制碼進行左移位操作,去除左邊高位,右邊低位補0
>> 右移位 對二進制碼進行右移位操作,去除右邊低位,左邊高位補0(正數)或1(負數)
&
按位與 對二進制碼進行位比較,全爲1則爲1,否則爲0
^ 按位異或 對二進制碼進行位比較,相同爲0,相異爲1
| 按位或 對二進制碼進行位比較,全爲0則爲0,否則爲1
賦值(二元)操作符 = 賦值 將右邊的值賦值給左邊的標識符
*= 乘法賦值 左邊標識符表示的值乘以右邊的值後賦值給左邊的標識符
/= 除法賦值 左邊標識符表示的值除以右邊的值後賦值給左邊的標識符
%= 模賦值 左邊標識符表示的值模上右邊的值後賦值給左邊的標識符
+= 加法賦值 左邊標識符表示的值加上右邊的值後賦值給左邊的標識符
-= 減法賦值 左邊標識符表示的值減去右邊的值後賦值給左邊的標識符
&=
按位與賦值 左邊標識符表示的值位與右邊的值後複製給左邊的標識符
^= 按位異或賦值 左邊標識符表示的值位異或右邊的值後賦值給左邊的標識符
|= 按位或賦值 左邊標識符表示的值位或右邊的值後賦值給左邊的標識符
<<= 左移位賦值 左邊標識符表示的值左移位右邊的值後賦值給左邊的標識符
>>= 右移位賦值 左邊標識符表示的值右移位右邊的值後賦值給左邊的標識符
其他 , 分隔符 SET命令支持多個表達式的運算處理

上面所列出來的就是批處理中所支持的算術操作符,只有在算術操作環境下才能被視爲算術操作符,否則視爲字符進行處理。在混合運算中,符號參與運算的順序爲:分組>一元運算>算術運算>邏輯運算>賦值運算>其他;其中元素分組元素內的符號運算順序基本爲乘除模優選,加減其次。這裏值得注意的是“&”、“^”、“|”、“>>”、“<<”,這些符號在字符中有着特殊的意思,所以必須使用轉義字符(“^”)進行轉義纔可以使用。具體怎麼使用,後面會提到。

後記

   感覺這一篇介紹的主要是批處理的符號,就佔用了這麼多文字,可見批處理的確是有存在的意義的,所以瞭解批處理也是有所必要的,下一篇將介紹批處理命令語句的使用,如果將命令語句放到這一篇一起講就太多了,不宜查看,所以於心不忍而又不得已,希望大家原理。

   梳理知識,分享大家,互利你我!怕拍板磚,就不知道自己整理的對知識掌握的問題所在,找到問題纔有所進步,歡迎大家踊躍的拍磚...

本文出自 “阿酷呆” 博客,請務必保留此出處http://akudy.blog.51cto.com/2277883/1239032


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章