前面整理了MS-DOS經常使用命令,爲何先整理DOS命令,由於DOS命令是批處理的基礎,只有打好基礎才能進入下一步的學習。閒話少撤,下面步入正題。編程
批處理(Batch)是一種實現批量處理操做的腳本文件,一般說的批處理有兩類:DOS批處理和PS批處理,其中DOS批處理就只咱們接下來將到的,PS批處理是基於PhotoShop圖片編輯軟件的一種批處理圖片處理的腳本。咱們這裏講到的是DOS批處理,與PS批處理沒有半毛錢的關係。bash
在Windows系統中,批處理能夠稱爲一種基於DOS操做系統的簡單腳本語言,實質它是有一系列(一個或多個)DOS命令組成的一個文件;主要用於實現自動批量的執行DOS命令而設計的。在Windows中一般將腳本稱爲宏,宏就是一系列命令組織在一塊兒做爲一個單獨的命令來完成某一項任務。經過查看命令行工具的可執行程序,能夠知道,批處理的腳本文件能夠是「.bat」、「.exe」、「.com」、「.cmd」做爲擴展名的文件,大多數狀況下咱們遇到的批處理是一個「.bat」文件。編程語言
批處理是一種解釋型腳本語言,它是有MS-DOS或Windows系統內嵌的命令解釋器(一般爲command.com或cmd.exe)解釋執行的,它並不進行復雜的編譯過程,因此一般文本編輯器編輯保存爲「.bat」文件後就能夠直接運行。正由於它很從編寫到執行的過程很簡單,因此最適合沒有任何環境下的裸機下使用;確定都在想如今編程語言這麼流行,遠遠要比單純的DOS批處理靈活、規範的多,但爲何還有了解DOS批處理呢?由於現下大多數的編程語言都須要嚴格的編譯,而後才能執行,也就是說它們須要一個特定的編譯環境,而DOS批處理必需要,只有你是Windows系統應該都支持的。試想一下,在一個沒有任何環境的Windows機器前,須要批量修改多個文件的名稱,你的第一反映,一個一個改,固然不是不能夠,可是你不以爲煩嗎!當你瞭解批處理後就可使用一個腳本輕鬆的搞定(首先設個懸念...至於如何實現,下面會慢慢講到)。編輯器
學習什麼,雖然都是慢慢體會其特色,可是我仍是先將批處理的特色列出來,做爲參照標準。上面介紹批處理實質就是一個或多個DOS命令組成的一個文件,因此在編寫批處理腳本時,它的特色與MS-DOS命令特定基本一致。ide
批處理由MS-DOS命令行組成,用於實現文件、目錄、文本文件內容等的批量處理操做。工具
批處理中的命令、命令選項以及參數是不區分大小寫的,可是某些特殊狀況下參數(主要指字符串常量)是區分大小寫的。學習
批處理中的代碼行使用換行符(包括Enter鍵等)進行分割或結束;一句代碼的命令、選項以及參數等符號之間使用空白符(包括Tab鍵、Space鍵等)或其餘特殊符號(包括「,」、「=」或「;」等)進行分割。測試
批處理的解析執行是按照從代碼開始到結束的順序執行的,也就是「自上而下」的順序,哪條代碼先出現就先解析執行,而後繼續向後執行。編碼
批處理值執行過程當中,當遇到錯誤代碼行時會捕獲錯誤信息並進行向下執行,直到越多終止符爲止。也就是說當遇到錯誤是不會回滾錯位代碼行以前的操做,同時會進行執行錯誤代碼行以後的代碼。spa
任何編程語言所支持的類型無非就三種:數字、字符和邏輯值。數字能夠衍生爲整數以及浮點數、字符能夠衍生爲字符串。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」能夠直接使用,而在某些特定的狀況下,字符串須要作一個特殊的處理,最多見的特殊處理方式就是使用英文狀態下的「""」或「''」將字符串引發來;例如當在處理一個帶有空白符的目錄時可能會使用到,當在進行字符串比較的時候也可能使用到。
關於批處理的特殊符號的整理,我感受有些糾結,由於特殊符號與批處理語句聯繫的很是緊密,單獨的來講符號,估計你也不知道怎麼用,因此這個地方將集合批處理語句來解釋各個特殊符號的使用方式。
批處理中的特殊符號用於支持批處理程序的解析執行,這些符號屬於批處理中保留的字符(串),具備特定的表示意思,在批處理中常見的特殊符號見下表。
做用類型 | 符號 | 說明 |
回顯屏蔽 | @ | 用於關閉命令顯示。默認狀況下MS-DOS解釋器會解析並輸出使用的命令行命令,使用「@命令」能夠關閉該命令的顯示 |
輸出重定向 | > | 將輸出信息重定向到指定的設備或文件,系統默認輸出到顯示器。「>」在會覆蓋原有內容,「>>」在在原有內容上進行追加 |
>> | ||
輸入重定向 | < | 將輸入信息來源重定向爲指定的設備或文件,以換行符終止。系統默認從顯示器讀取輸入信息 |
管道重定向 | | | 將管道符號前面命令的輸出結果重定向輸出到管道符號後面的命令中去,做爲後面命令的輸入。語法爲:命令1|命令2 |
轉義字符 | ^ |
將特殊符號轉化爲通常符號,即剝離特殊符號的特殊地位。主要用在:|、&、>、<符號上 |
$ | 將特殊的字符轉換爲一個特定的值,主要用在「prompt」命令模式中 | |
邏輯命令符 | & |
無條件執行符號後面的命令 |
&& | 當符號前面的命令成功執行時,執行符號後面的命令,不然不執行 | |
|| | 當符號前面的命令失敗時,執行符號後面的命令,不然不執行 | |
通配符 | * | 表示任意個字符,能夠表示一個字符,也能夠表示多個字符,一般用於表示全部內容,經常使用在文件或內容查找中 |
? | 表示任意一個字符串,經常使用在文件或內容查找中 | |
引用符 | % | 普通環境下對變量的引用,格式爲「%xxx%」;特殊狀況下還能夠對參數進行引用,格式爲「%number」,其中number爲0~9中的任一個整數 |
! | 特殊環境下對變量的引用,格式爲「!xxx!」,一般用在啓用延遲變量擴展功能後的環境,默認是不啓用的 |
在批處理中「@」符號通常用在命令去,用於屏蔽MS-DOS解析器對該命令的回顯輸出功能。默認狀況下MS-DOS在執行批處理腳本是會將一行行命令顯示輸出到MS-DOS解釋器的控制檯,而後再執行。這個問題怎麼理解?能夠這樣看,在命令行中輸入DOS命令而後鍵入回車鍵,便可以執行輸入的命令語句,因爲MS-DOS解釋器換行符的限定,因此咱們不能在MS-DOS解釋器中輸入多行命令語句,只能單行單行的輸入執行,而後再輸入執行……爲了解決這個弱點,能夠將多條命令放在一塊兒解釋執行,因而批處理腳本就誕生了。
那麼咱們來看看批處理腳本是如何解釋執行的,首先咱們知道批處理是順序解釋執行的,也就是從腳本的開始第一行命令開始進行執行,一直到腳本的結尾最後一行命令。實質上MS-DOS解釋器會讀取每一行命令,而後執行,就至關於上面講到的命令行命令的執行同樣,首先輸入命令而後按回車鍵執行,只不過這裏是從批處理文件中讀取一行內容而後輸入到MS-DOS解釋器,緊接着自動鍵入回車鍵進行執行,而後在讀取下一行內容……,因此也就出現了在MS-DOS解釋器中顯示行內容的過程。所以批處理中提供了「@」符號來屏蔽回顯輸出的過程。用法比較簡單:
@命令
「@」只是一個用於修飾命令的符號,因此命令的用法並不會受到「@」符號的影響,意思就是說命令該怎麼仍是怎麼用。須要注意的是「@」符號只對使用「@」符號的命令起到回顯屏蔽的操做,不對其後的命令語句起做用。下面咱們可使用文本新建一個bat文件測試一下(新建記事本,修改擴展名爲bat肯定便可),寫入:
set var=abc pause
保存後,雙擊執行;而後在修改成:
@set var=abc pause
保存後,雙擊執行,能夠經過對比發現「@」符號的具體做用。
「>」和「>>」稱爲輸出重定向符號,通俗一點的理解就是能夠將內容輸出到指定的設備或文件。一般這兩個符號與命令一塊兒使用,用於將命令的響應信息即執行命令的結果輸出到指定的文件中,對於MS-DOS命令行來講,執行任何一個命令都會有對應的輸出信息,默認狀況下,這個輸出的內容會顯示在MS-DOS解釋器的控制檯中,固然這種狀況是不便於查看的,所以批處理中提供了「>」和「>>」重定向符號來將內容輸出到指定的地方。用法比較簡單:
命令 ... > 文件地址
命令 ... >> 文件地址
與「@」符號同樣,「>」和「>>」符號不會影響命令自己的用法,只不過右邊必需要指定保存輸出內容的文件地址,能夠是文件的相對路徑,也能夠是文件的絕對路徑,默認爲相對路徑,同時執行快磁盤分區輸出。
爲何會提供兩種輸出重定向的符號?理所固然,兩種重定向符號的做用一定不一樣,其中「>」符號用於將輸出內容寫入到一個空的文件中,也就是說文件的內容爲空,當文件內容不爲空時會首先擦除文件內容,而後在寫入輸出內容;「>>」符號用於將輸入內容追加到指定的文件中,文件內容能夠是空,也能夠是非空的;二者的共同點就是在文件不存在時會自動新建文件。簡單的理解就是「>」爲寫入新內容,而「>>」爲追加內容,怎麼將都是空話,只有親自體驗到了才能體會到。例如在新建的bat文件中輸入如下代碼:
@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」。
「<」稱爲輸入重定向符號,通俗的理解就是能夠從指定的文件中讀取一行內容到當前位置。一般與命令結合使用,用於從文件中讀取一行內容做爲命令的參數使用,而對於MS-DOS中任何一個具備輸入參數的命令來講,默認是從MS-DOS解釋器中接收輸入信息的,固然這樣就不夠靈活,不能維護代碼的完整性,因此就出現了「<」符號。用法相對比較簡單:
命令 ... < 文件地
一樣,命令的用法與原始用法基本一致,只不過「< 文件地址」部分能夠做爲命令的某些選項或參數的替代品。可是一般狀況下咱們值使用文件保存對應的參數信息,不保存命令的選項信息。特別注意的文件地址所指定的文件必須存在,能夠是相對路徑或絕對路徑。例如首先在C盤中新建一個a.txt文本文件並隨便編寫內容,在新建的bat文件中輸入如下代碼:
@set /p var= < C:\a.txt @echo %var% @pause
保存後執行能夠看到輸入的輸出了a.txt文件中的第一行內容。這個地方須要注意的是,「<」符號只能讀取文件的第一行內容,這裏說的行主要是經過換行符(Enter鍵)進行分割。與該符號一塊兒使用的最多的命令就是「set」命令。
「|」稱爲管道符,做用就是將符號前的輸出內容做爲符號後的輸入內容,以前咱們遇到過「type ... |more」的寫法,其做用就是將「type ...」命令行的輸出內容做爲「more」命令的輸入內容,「type ...」用於查看文件內容,「more」用於分頁顯示,因此就實現類文件內容的分頁顯示功能。「|」管道符的用法相對嚴格一點:
命令1 ... | 命令2 ...
「|」符號通常須要兩個命令參數,符號前的命令做爲輸出內容的命令,通常必需要有內容輸入,符號後的命令做爲接收輸入內容的命令;即將命令1的輸出內容做爲命令2的輸入參數。下面咱們經過例子來理解。
@type C:\a.txt | more @pause
上面的例子能夠將C盤中a.txt的文件內容進行分屏顯示。再看下面的例子:
@echo bbbbbbb > C:\b.txt @echo y|del /p C:\b.txt @pause
其中「del /p」用於刪除文件並在刪除以前提示確認,當輸入「y」則刪除,輸入其餘則不刪除。上面的代碼是說將「y」做爲「del /p」的輸入內容進行處理。
能夠當作「|」符號和「<」符號均可以實現輸入內容的重定向操做,不過「|」是從命令行控制檯的上一個命令輸入信息中獲取內容,而「<」是從一個特定的文件中獲取內容的第一行信息。
「^」是批處理中通用的轉義字符,能夠將特殊符號轉化爲通常符號進行處理。當咱們要輸出「>」文本字符時,該如何處理?直接使用會將「>」符號做爲重定向符號進行處理,這時就須要使用轉義字符。轉義字符的使用比較簡單:
^特殊字符
這裏所說的特殊字符通常指「|」、「&」、「<」、「>」這四個符號。例如:
@echo aaaaa ^> C:\a.txt @pause
保存並執行,咱們能夠看到在控制檯輸出了「aaaaa > C:\a.txt」的文本內容,並無將「>」做爲重定向符號處理。
「$」轉義符號是「prompt」命令中的轉義字符,一般後面接一個特定的字母表示一個結果。可使用「prompt/?」或「help prompt」命令來查看使用說明。在這裏就很少講了。
批處理中提供了三種邏輯命令符:「&」、「&&」和「||」。三個邏輯命令符的做爲分別爲:
「&」符號——無條件執行符號後的命令語句。也就是符號後的語句必定會執行,這個符號大多用於命令的鏈接執行,即默認狀況下MS-DOS只能解析一行的命令執行(以換行符爲分隔符),一般狀況下一條命令做爲一行語句;可使用「&」符號將多條命令鏈接起來執行達到一行書寫多條命令的效果。
「&&」符號——只有當符號前面的命令執行成功時纔會執行符號後面的命令語句,不然符號後的命令語句不會執行。
「||」符號——只有當符號前面的命令執行失敗時纔會執行符號後面的命令語句,不然符號後的命令語句不會執行。
三個運算符都必須兩條命令語句參與,基本上都是由符號前的語句來決定符號後的語句是否執行。用法類是「|」管道符號,能夠自行嘗試練習。
通配符是一種特殊的符號,可用於模糊搜索,當咱們不肯定文件名稱時可使用通配符來代替符合標準的文件名。批處理中提供兩種通配符「*」和「?」。在當我面不肯定內容的時候可使用通配符代替一個或多個或全部字符,其中「*」用於表示一個或多個任意字符串,而「?」用於表示一個任意字符。例如:
move *.txt temp\all.txt mvoe a?.txt temp\a.txt
其中第一個命令行用於將當前目錄中的全部的「.txt」文件移動到temp目錄下並將內容合併後輸出到all.txt文件;第二個命令行用於將當前目錄中全部以a開頭的兩個字符做爲文件名的文件移動到temp目錄下並將內容合併後輸出到a.txt文件中。
這裏所說的引用符,主要是指在批處理中對環境變量以及參數信息的應用。也就是說使用這種符號標識的字符會被解析爲一種變量,從而引用變量對應的值,固然這裏說是引用,不是很確切,實質是一種特殊字符的替換方式。
「%」是比較靈活的引用符號,常見的基本有三種用法:使用「%xxx%」引用普通的非延遲環境變量擴展環境下的環境變量;使用「%number」引用特殊命令中的參數值,使用0-9表示參數的索引,即number的值是0-9之間的整數;做爲字符「%」的轉義字符,例如「%%」表示一個「%」字符,「%%%%」表示兩個「%」字符。三種用法的標準格式爲:
%變量名%
%參數索引
%%...
默認狀況下,MS-DOS解釋器在執行到「%xxx%」字符串的時候會將兩個「%」之間的字符表達式「xxx」解析爲變量名,而後在環境變量中查找該變量名對應的值來替換「%xxx%」字符串,從而達到引用變量的效果。同理,當執行到「%number」的表達式時,會自動查找對應索引的參數值來替換「%number」字符串,默認狀況下%0用於表示當前執行的批處理文件的絕對路徑。
「!」符號是對變量引用符號「%」的一個擴展,這個符號只有在開啓了延遲環境變量擴展功能後才能使用,也就是出如今「setlocal」和「endlocal」之間。在延遲環境變量擴展環境中與「%」引用變量的方式同樣,使用「!xxx!」的方式來引用環境變量,用法以下:
!變量名!
在延遲環境變量環境下,當MS-DOS解釋器執行到「!xxx!」字符串的時候會將兩個「!」之間的字符表達式「xxx」解析爲變量名,而後在環境變量中查找該變量名對應的值來替換「!xxx!」字符串,從而達到引用變量的效果;固然,它沒有參數引用和字符轉義的功能。至於爲何會有這個符號的擴展,將在之後講到。
上面已經講到批處理支持數值類型的表示,一樣支持數值類型的運算處理,固然批處理比較弱智,只支持整數類型的數值的算術運算,不只支持基本的數學算術運算,還支持高級的算術運算。批處理支持的全部的算術運算符號以下表:
類型 | 符號 | 名稱描述 |
說明 |
分組 | () | 括號 | 括號內優選運算 |
一元操做符 | ! | 邏輯非 | 非0爲1,非其它值爲0 |
~ | 按位非 | 對二進制碼進行位取反,1變爲0,1變爲0 | |
- | 負號 | 表示負數 | |
算術(二元)操做符 | * |
乘 | 乘法運算 |
/ | 除 | 除法運算,求整除的商 | |
% | 模 | 模運算,求整除後的餘數 | |
+ | 加 | 加法運算 | |
- | 減 | 減法運算 | |
邏輯(二元)操做符 | << |
左移位 | 對二進制碼進行左移位操做,去除左邊高位,右邊低位補0 |
>> | 右移位 | 對二進制碼進行右移位操做,去除右邊低位,左邊高位補0(正數)或1(負數) | |
& |
按位與 | 對二進制碼進行位比較,全爲1則爲1,不然爲0 | |
^ | 按位異或 | 對二進制碼進行位比較,相同爲0,相異爲1 | |
| | 按位或 | 對二進制碼進行位比較,全爲0則爲0,不然爲1 | |
賦值(二元)操做符 | = | 賦值 | 將右邊的值賦值給左邊的標識符 |
*= | 乘法賦值 | 左邊標識符表示的值乘以右邊的值後賦值給左邊的標識符 | |
/= | 除法賦值 | 左邊標識符表示的值除以右邊的值後賦值給左邊的標識符 | |
%= | 模賦值 | 左邊標識符表示的值模上右邊的值後賦值給左邊的標識符 | |
+= | 加法賦值 | 左邊標識符表示的值加上右邊的值後賦值給左邊的標識符 | |
-= | 減法賦值 | 左邊標識符表示的值減去右邊的值後賦值給左邊的標識符 | |
&= |
按位與賦值 | 左邊標識符表示的值位與右邊的值後複製給左邊的標識符 | |
^= | 按位異或賦值 | 左邊標識符表示的值位異或右邊的值後賦值給左邊的標識符 | |
|= | 按位或賦值 | 左邊標識符表示的值位或右邊的值後賦值給左邊的標識符 | |
<<= | 左移位賦值 | 左邊標識符表示的值左移位右邊的值後賦值給左邊的標識符 | |
>>= | 右移位賦值 | 左邊標識符表示的值右移位右邊的值後賦值給左邊的標識符 | |
其餘 | , | 分隔符 | SET命令支持多個表達式的運算處理 |
上面所列出來的就是批處理中所支持的算術操做符,只有在算術操做環境下才能被視爲算術操做符,不然視爲字符進行處理。在混合運算中,符號參與運算的順序爲:分組>一元運算>算術運算>邏輯運算>賦值運算>其餘;其中元素分組元素內的符號運算順序基本爲乘除模優選,加減其次。這裏值得注意的是「&」、「^」、「|」、「>>」、「<<」,這些符號在字符中有着特殊的意思,因此必須使用轉義字符(「^」)進行轉義纔可使用。具體怎麼使用,後面會提到。
感受這一篇介紹的主要是批處理的符號,就佔用了這麼多文字,可見批處理的確是有存在的意義的,因此瞭解批處理也是有所必要的,下一篇將介紹批處理命令語句的使用,若是將命令語句放到這一篇一塊兒講就太多了,不宜查看,因此於心不忍而又不得已,但願你們原理。
梳理知識,分享你們,互利你我!怕拍板磚,就不知道本身整理的對知識掌握的問題所在,找到問題纔有所進步,歡迎你們踊躍的拍磚...