前記

   前面介紹過批處理程式中的資料型別、操作符號、內建環境變數和常用的命令語句,這些都是學習批處理的基本知識,需要學習批處理這些知識必須瞭解到位。

   學習某種語言的最終目的是能夠讀懂其他人編寫的程式程式碼,用於解決自己的在日常生活或工作中的一些問題,然而前面介紹的基礎知識就不能定能夠滿足這種目的了,所以下面來擴充套件一下其他常見的知識,總結一下之前介紹的知識,同時通過幾個常用的案例來分析一下如何編寫批處理指令碼。

DOS批處理的變數擴充套件

   變數是批處理中的基礎內容,常稱之為“系統環境變數”。之前介紹了兩種訪問變數的方式“%變數名%”和“!變數名!”,其中前者是對普通變數的引用,後者是對延遲環境變數下的變數的引用,延遲環境變數大多用在複合式語句中,例如“for”、“if”等語句中。

1.引數化變數擴充套件

   之前在介紹“call”命令的時候,介紹過引數的取值方式——使用“%number”,其中number必須是數值,而且值大於等於0小於等於9。下面來看之前的例子:

@echo off
set var=test
call :deal %var% demo
:deal
echo %%0=%0
echo %%1=%1
echo %%2=%2
pause

將上面的程式碼儲存批處理檔案並執行,可以看到結果為:

%0=:deal

%1=test

%2=demo

請按任意鍵繼續. . .

%0=”C: est.bat”

%1=

%2=

請按任意鍵繼續. . .

首先來看看為什麼為執行兩次,“call”命令的執行流程不同於“goto”語句,當執行完對應的標籤體後會再次回到當前“call”語句之後繼續執行之後的程式,所以會執行兩次。再來看看取值,“%%0”表示一個轉義用於列印輸出“%0”字樣,當直譯器執行到“call :deal %var% demo”語句時會跳轉到“:deal”標籤體並執行,可以通過“%0”等字樣取到“call”命令語句後的引數,所以會列印出“:deal test demo”資訊;然後再次進入“:deal”標籤體,但是你會看到這次並沒有取到引數值,為什麼?因為這裡是正常的批處理執行語句,並不是“call”語句的呼叫,但是可以看到“%0”取到的值為當前批處理指令碼程式的完全路徑名,這就是要提到的第二種引數化變數的擴充套件作用。

   在批處理指令碼中,預設情況下,可以使用“%0”來獲取當前執行的批處理指令碼程式本身,用於引用當前程式的完全路徑名,這是MS-DOS直譯器的擴充套件特點;而在特殊情況下,在取某些特殊命令語句的引數時,“%0”表示命令語句後的第一個引數值,而通常把這一個引數稱為批處理標籤本身,也就相當於把它視為批處理本身一樣,“%1”、“%2”…“%9”等視為對正式引數的引用,所以從這個角度來理解,真正的引數索引應該是“1-9”。

   在Windows系統中,我們可能看到將一個檔案拖放到一個應用程式上,則可以使用當前應用程式開啟當前檔案的情況,那麼在批處理中可不可以實現呢?答案是肯定的。來分析一下,該如何實現?如果要開啟一個檔案必須要指定該檔案的路徑地址才能開啟,接下來的為題就是如何在批處理中獲取拖放進來的檔案地址。來看下面的例子:

@echo off
set /p inPath=請輸入或拖放目錄和檔案...
echo 你輸入的路徑為:%inPath%
pause

這段程式碼中“inPath”變數用於獲取使用者輸入的資訊,可以輸入,同樣可以直接將目標目錄或檔案拖進當前直譯器命令列,則可以立即獲取當前檔案或目錄的地址。可以看成這是一種獲取方式,但是這種拖放方式必須要在開啟批處理執行直譯器的情況下才可以使用。下面來看另一種方式,通過引數獲取方式,先看例子:

@echo off
echo 當前執行程式:%0
echo 拖拽的檔案或目錄:%1
pause

將這段程式碼儲存為批處理檔案,然後將任意一個檔案或目錄拖放到當前批處理檔案上,看看效果。驚訝的是可以看到,“%1”這個變數引數輸入的資訊就是我們想要的目標檔案或目錄的完全路徑,而“%0”還是當前檔案完全路徑。上面介紹了“%0”表示的是當前執行程式本身完全路徑,而這裡的“%1”用於表示目標檔案或目錄的完全路徑地址,這是變數引數的需要注意的另一個特點,“%1”在某些特殊的情況下才能發揮這種引用效果。

   總結一下,在批處理指令碼中的“%0”表示當前批處理程式本身的完全路徑名,“%1”—“%9”表示對命令引數的引用,而這些引數應用最常見的就是“call”命令。需要注意的是“%1”在某些特殊情況下有另一種作用就是表示要執行的目標程式的完全路徑,而這種用法大多是在拖拽檔案的時候使用。

2.單字元變數擴充套件

   之前在“for”語句中提到了一種變數的擴充套件方式,非常類似上面提到的引數化變數擴充套件,然而在“for”語句中的變數名稱只能為單個字母,所以可以與引數化變數區分開來。上面提到了“%0”引數可以表示當前程式的完全路徑名,那麼如何取到當前程式的工作目錄呢?擷取字串,這是一個笨拙的方式,在批處理中提供了一種非常簡單的處理方式——通過變數擴充套件來獲取。

   下面來看看批處理中定義的變數擴充套件方式,如下表:

變數替換方式 說明
%~變數名 刪除變數所表示的值的兩端的引號
%~f變數名 在變數之前追加當前執行路徑(目錄路徑)
%~d變數名 將變數轉換為當前碟符
%~p變數名 將變數轉換為目錄路徑(不包含碟符)
%~n變數名 將變數轉換為檔名(當集合型別為字串時)
%~x變數名 將變數轉換為副檔名,只適合字串
%~s變數名 在變數之前追加當前執行短路徑(目錄短路徑)
%~a變數名 將變數轉換為檔案的屬性,只適合字串
%~t變數名 將變數轉換為檔案的修改日期,只適合字串
%~z變數名 將變數轉換為檔案的大小(KB),只適合字串
%~$PATH:變數名 將變數轉換為環境變數的目錄
%~dp變數名 將變數轉換為當前執行目錄路徑
%~nx變數名 將變數轉換為檔案全名稱(包括副檔名)
%~fs變數名 將變數轉換為完整的短路徑名稱
%~dp$PATH:變數名 將變數轉換為環境變數的目錄
%~ftza變數名 將變數轉換為包含屬性、修改日期、大小、全路徑的列表

來看下面的例子,在“%0”引數變數上進行擴充套件:

@echo off
echo 正在執行的這個批處理:
echo 完全路徑:%0
echo 去掉引號:%~0
echo 所在分割槽:%~d0
echo 所處路徑:%~p0
echo 檔名:%~n0
echo 副檔名:%~x0
echo 檔案屬性:%~a0
echo 修改時間:%~t0
echo 檔案大小:%~z0
pause

儲存為批處理檔案並執行既可以看到不同的效果。

   其實,變數的擴充套件不僅用於“%0”引數,還可以應用到所有的變數上,包括“for”迴圈語句中的臨時變數,但是大多數情況下用在“for”迴圈的臨時變數上。經過測試這種單字元變數擴充套件的方式只能用於臨時變數或引數變數的擴充套件上。

3.字串變數擴充套件

3.1.字串的拼接

   之前介紹過變數,在批處理中預設的變數都是字串變數。如何實現在字串變數值上追加字串呢?如何實現字串的拼接呢?下面就來講講這方面的例子,首先定義一個字串變數,我們知道需要使用“%變數名%”的方式引用變數,如何將另一個變數的值追加到當前變數中呢?來看下面的例子:

@echo off
set var1=偉大的中國!
set var2=我為你自豪!
echo 拼接字串:%var1%%var2%
set var3=%var1%%var2%
echo %var3%
pause

從例子可以得出,批處理中的字串拼接處理非常簡單,不需要任何操作符號進行連線。為什麼會這麼處理?因為批處理中的變數引用方式實質是字串的替換方案,之前也將過,當直譯器執行到“%xxx%”字樣的字串時,會查詢“xxx”所表示的變數值並替換當前語句中的所有的“%xxx%”字串為指定的值,所以不需要任何符號干預;在開啟延遲環境變數擴充套件功能的環境下,當直譯器執行到“!xxx!”字樣的字串時,會查詢“xxx”所表示的變數值並替換當前“!xxx!”字串,並不會替換其他地方,這也是延遲環境變數和普通變數的一個最大區別。

3.2.字串的替換

   字串替換是比較常用的操作,批處理中的字串替換需要依賴變數的擴充套件功能來實現,使用“:”進行字串的替換操作擴充套件。用法如下:

%str:substr=value%

其中“str”表示字串變數名稱,“substr”表示字串變數對應的值中的一個子字串,“value”表示要將子字串替換成的新的字串值。意義就是將原字串中的某一部分字元(串)替換為指定的內容。來看看下面的例子:

@echo off
set var=Hello World .
echo 原字串:%var%
echo 將World替換為Tom:%var:World=Tom%
set /p name=你輸入你的名字:
echo 將World替換為輸入的名字:%var:World=%%name%%
setlocal enabledelayedexpansion
echo 將World替換為輸入的名字:%var:World=!name!%
pause

儲存為批處理檔案並執行可以看到效果,需要提到的是要替換的值是變數,則需要開啟延遲環境變數擴充套件功能並使用“!xxx!”方式來引用該變數值,通過上面最後兩條“echo”命令可以看成區別。

3.3.字串的擷取

   字串擷取也是比較常用的操作,批處理中的字串擷取同樣需要依賴變數的擴充套件功能來實現,擴充套件用法與字串替換有點類似,不過這個地方的擴充套件是基於數值進行字串擷取的。用法如下:

%var:~m[,n]%

其中“var”表示變數名稱,“m”表示要擷取字串的開始位置索引數值,“n”表示要擷取的字元的數量;字串中的索引是從“0”開始的,也就是說字串的第一個字元的索引為0,第二個字元索引為1,依次類推。如果只指定“m”的值則表示從第“m+1”個字元開始擷取,直到字串的末尾;如果同時指定“n”的值則表示從第“m+1”個字元開始擷取“n”個字元。來看下面的例子:

@echo off
set var=abcdefgh
echo 原始字串:%var%
echo 字串索引:01234567
echo 從第3個字元開始擷取:%var:~2%
echo 擷取前5個字元:%var:~0,5%
echo 擷取3-6個字元:%var:~2,4%
echo 擷取6-12個字元:%var:~6,6%
echo 擷取15-20個字元:%var:~15,5%
pause

儲存為批處理檔案並執行的結果如下:

原始字串:abcdefgh

字串索引:01234567

從第3個字元開始擷取:cdefgh

擷取前5個字元:abcde

擷取3-6個字元:cdef

擷取6-12個字元:gh

擷取15-20個字元:

請按任意鍵繼續. . .

   從結果可以看出,上面描述的規則,“m”表示開始擷取字串的位置,“n”表示要擷取字串的長度;然而還可以看出,超過索引的擷取是不會導致錯誤,但是我們還是需要儘量避免超出索引的擷取操作。

   上面介紹的例子都是按照順序進行擷取,而批處理變數擷取不僅僅支援順序擷取,還支援倒序擷取。倒序擷取使用負數進行索引和位數的表示,表示從右邊開始算起,順序表示從左邊開始算起。來看下面的例子:

@echo off
set var=abcdefgh
echo 原始字串:%var%
echo 字串索引:01234567
echo 字串倒數索引:87654321
echo 倒數擷取3個字元:%var:~-3%
echo 從倒數第5個字元開始擷取3個字元:%var:~-5,3%
echo 從第2個字元開始擷取到倒數第5個字元位置:%var:~2,-5%
pause

將程式碼儲存為批處理檔案並執行的結果為:

原始字串:abcdefgh

字串索引:01234567

字串倒數索引:87654321

倒數擷取3個字元:fgh

從倒數第5個字元開始擷取3個字元:def

從第2個字元開始擷取到倒數第5個字元位置:c

請按任意鍵繼續. . .

   從結果可以得出看出,倒序擷取的索引是從“-1”開始的,也就是右邊的第一個字元位置為“-1”,第二個字元位置為“-2”,依次類推。

   來總結一下字串變數的擷取規律,用法為“%var:~m,[n]%”,其中“m”表示開始擷取字串的位置索引數值,當“m”值為正數時表示順序擷取,從左邊第一個字元(索引為“0”)開始算起,向右依次加一;當“m”值為負數時表示倒序擷取,從右邊第一個字元(索引為“-1”)開始算起,向左依次減一。“n”為正數時表示要擷取的字元個數,表示從“m”位置算起,向右擷取“n”個字元;當“n”為負數時表示從“m”位置算起,擷取到從右邊開始算起的“n”個字元的位置。使用以下的等式來說明:

① 在n無值的情況下,當m>=0時表示順序擷取,從左邊第一個字元開始算起(索引為0)擷取第“m+1”個字元(索引為m)後的所有字元;當m<0時表示倒序擷取,從右邊第一個字元算起(索引為-1)擷取第“m”個字元(索引為-m)後的所有字元。

② 在n存在並且m>=0的情況下表示順序擷取,當n>=0時表示從左邊第一個字元(索引為0)開始算起擷取第“m+1”個字元(索引為m)後“n”個字元;當n<0時表示從左邊第一個字元(索引為0)開始算起擷取第“m+1”個字元(索引為m)與從右邊第一個字元算起(索引為-1)算起第“n-1”個字元(索引為-n-1)之間的所有字元。

③ 在n存在並且m<0的情況下表示倒序擷取,當n>=0時表示從右邊第一個字元算起(索引為-1)的第“m”個字元(索引為-m)開始擷取“n”個字元;當n<0時表示擷取從右邊第一個字元(索引為-1)算起的第“m”個字元(索引為-m)開始與從右邊第一個字元算起(索引為-1)算起第“n-1”個字元(索引為-n-1)之間的所有字元。

   也就說當“m”為正整數表示順序擷取,為負整數表示倒序擷取,不論正負都表示擷取的開始位置;當“n”為正整數表示擷取字元的個數,為負整數則表示擷取的終止位置。

DOS批處理的符號總結

  • “@”符號

   關閉命令的回顯,用法“@命令列”。

  • “>”符號

   ①輸出重定向符號,用在命令語句後,將命令語句的響應資訊輸出到指定的空檔案中(非空則先清空),用法“命令列 > 檔案”。

   ②在“findstr /r”命令中表示匹配單詞的右邊界,需要配合轉義字元“”使用,用法“findstr /r “結束字元(串)>” 檔案”。

  • “>>”符號

   ①輸出重定向符號,用在命令語句後,將命令語句的響應資訊輸出到指定的檔案中(在原檔案尾部追加),用法“命令列 >> 檔案”。

   ②在“set /a”命令中表示邏輯右移位運算,將左邊運算元的二進位制碼向右移動右邊運算元個位數。即去除右邊低位,左邊高位補0(正數)或1(負數),用法“set /a num1>>num2”。

  • “<”符號

   ①輸入重定向符號,用在命令語句後,將指定檔案的內容作為命令語句的輸入資訊進行處理(一般為讀取檔案內容的一行資訊),用法“命令列 < 檔案”。

   ②在“findstr /r”命令中表示匹配單詞的左邊界,需要配合轉義字元“”使用,用法“findstr /r “<開始字元(串)” 檔案”。

  • “|”符號

   ①管道符號,用在多個命令語句之間,表示將前面命令語句的響應輸出內容作為後面命令語句的輸入內容進行處理,用法“命令列 | 命令列”,例如“help | more”。

   ②在“set /a”命令中表示按位或運算,對運算元的二進位制碼進行位比較,全為0則為0,否則為1,用法“set /a num1|num2”。

  • “^”符號

   ①轉義字元,用在特殊字元前面,用於取消該特殊字元的作用。支援的特殊字元有“&”、“|”、“>”、“<”、“!”、“””等,不包括“%”,用法“^特殊字元”。

   ②在“set /a”命令中表示按位異或運算,對運算元二進位制碼進行位比較,相同為0,相異為1,用法“set /a num1^num2”。

   ③在“findstr /r”命令的“[]”符號內字串前表示不匹配“[]”內指定的字符集,用法“findstr /r [^字元(串)] 檔案”。

   ④在“findstr”命令中表示一行的開始。

   ⑤在“echo”命令的輸出語句中作為續行符號,可以將“^”後的下一行的字串拼接在當前行後輸出。

  • “$”符號

   ①在“prompt”命令中,稱為選項轉義字元,可以將其後的字元轉義為特定的作用效果。

   ②在“findstr”命令中表示一行的結束。

  • “&”符號

   ①邏輯命令符,用在命令語句之間,表示多條命令語句進行連線視為一條語句執行,也就是說無條件的執行符號後的命令語句,用法“命令列 & 命令列”。

   ②在“set /a”命令中表示按位與運算,對運算元的二進位制碼進行位比較,全為1則為1,否則為0,用法“set /a num1&num2”。

  • “&&”符號

   邏輯命令符,用在命令語句之間,表示只有當符號前命令執行成功時,才執行符號後的命令語句,用法“命令列 && 命令列”,與“||”符號相逆。

  • “||”符號

   邏輯命令符,用在命令語句之間,表示只有當符號前命令執行失敗時,才執行符號後的命令語句,用法“命令列 || 命令列”,與“&&”符號相逆。

  • “>&”/“<&”符號

   輸入重定向符號的變種,主要用於控制程式碼操作上,其中“>&”表示將一個控制程式碼的輸出寫入到另一個控制程式碼的輸入中;“<&”表示從一個控制程式碼讀取輸入並將其寫入到另一個控制程式碼輸出中。這兩個符號比較特殊,基本不會用到。

  • “()”符號

   ①在“set /a”命令中表示算術括號優選運算。

   ②在“if”語句中表示語句塊。

   ③在“for”語句中表示集合列表範圍或語句塊。

   ④在組合的命令語句中,表示語句塊,可以改變操作符的執行順序。例如:dir c: && dir D: >a.txt 將之後輸出D盤的目錄結構;而(dir c: && dir D:)>a.txt可以將C盤和D盤的目錄結構都輸出。

  • “!”符號

   ①在“set /a”命令中表示邏輯非運算,非0為1,非非0值為0,用法“set /a !num”。

   ②在開啟延遲環境變數的模式下,用於引用延遲變數,即在“setlocal”命令後可以使用“!var!”來引用變數作為延遲環境變數處理,也就是說在“setlocal”命令後可以使用“!”來代替“%”,常用在“if”、“for”等複合語句中。

  • “~”符號

   ①在“set /a”命令中表示按位非運算,對運算元的二進位制碼進行位取反,1變為0,1變為0,用法“set /a ~num”。

   ②臨時變數或引數變數增強型擴充套件符號,常用作對一個表示目錄或檔案的變數進行擴充套件操作,例如取得檔名稱、檔案屬性等。大多數用在“for”語句中,對錶示檔案或目錄的臨時變數進行擴充套件引用,例如“%~i”表示去掉路徑引號。

   ③字串變數擴充套件符號,表示對字串進行擷取操作,用法“%var:~m,n%”。

  • “+”符號

   ①在“set /a”命令中表示算術加法運算,用法“set /a num1+num2”。

   ②在“copy”命令中用於連線需要操作的多個原始檔,然後將內容合併在寫入目標檔案。

  • “-”符號

   ①在“set /a”命令中表示一個負數或者算術減法運算,用法“set /a -mun”或“set /a num1-num2”。

   ②在命令中可以表示選項字首,替換“/”字首;用在選項的“/”後表示取該選項操作的反向意義。

   ③範圍識別符號,在“findstr /r”命令中的表示指定字元範圍內的任意字元,例如“[0-9]”表示數字。

  • “*”符號

   ①萬用字元,表示任意個任意字元。在很多檔案和目錄管理的命令中可以用於匹配任意檔案或目錄,例如:在“for /f”的“tokens”選項中表示所有字元。

   ②在“set /a”命令中表示算術乘法運算,用法“set /a num1*num2”。

   ③在“findstr /r”命令中表示將符號前一個字元(串)進行零次或多重匹配。

  • “/”符號

   ①在“set /a”命令中表示算術除法運算,求整除的商,用法“set /a num1/num2”。

   ②選項字首,在命令後選項前修飾為命令選項,有時可以使用“-”進行替換。

  • “%”符號

   ①在“set /a”命令中表示模運算,求整除後的餘數,用法“set /a num1%num2”。

   ②非延遲環境變數引用符號,在批處理中可以使用“%var%”的方式引用環境變數。

   ③在“for”語句中用於定義和引用臨時變數,使用“%字母”的方式定義臨時變數用於儲存當前元素值。

   ④在可以傳遞引數的命令處理模組,用於引用命令傳遞的引數,使用“%num”(0<=num<=9)方式引用引數值,其中“%0”表示當前處理模組或批處理檔案本身。

   ⑤單字元變數擴充套件引用符號,使用“%~單字元變數名”的方式來對該變數進行擴充套件引用,只能在“for”中的臨時變數或引數變數上進行擴充套件。

   ⑥“%”特殊符號的轉義字元,在批處理中使用“%%”表示實際的“%”,使用“%%%%”表示實際的“%%”。

  • “<<”符號

   在“set /a”命令中表示左移位運算,對運算元的二進位制碼進行左移位操作,去除左邊高位,右邊低位補0。

  • “=”符號

   ①賦值運算子,在“set”命令中表示變數賦值操作。

   ②在“set /a”命令中表示算術運算。在算術運算中可以與其他算術運算子結合使用,表示選進行其他運算,然後在進行賦值操作,結合符號有“*=”、“/=”、“%=”、“+=”、“-=”、“&=”、“^=”、“|=”、“<<=”、“>>=”。

   ③在“echo”命令後表示轉義字元或輸出空行,緊接“echo”命令。“echo=”用於輸出空行,“echo=off”用於輸出特殊內容。

  • “,”符號

   ①在“set /a”語句中為多個表示式的分隔符。例如“set /a 1+2,3-2”等。

   ②某些情況下可替換“ ”(空白符)作為命令引數的分隔符。例如“copy a.txt,b.txt”。

   ③在“echo”命令後表示轉義字元或輸出空行,緊接“echo”命令。“echo,”用於輸出空行,“echo,off”用於輸出特殊內容。

  • “.”符號

   ①批處理中使用“.”表示當前目錄,例如“cd.”;使用“..”表示上一層目錄(父級目錄),例如“cd..”。

   ②表示檔名的一部分,作為檔名稱和檔案擴充套件每次的分隔符。

   ③在“echo”命令後表示轉義字元或輸出空行,緊接“echo”命令。“echo.”用於輸出空行,“echo.off”用於輸出特殊內容。

  • “ ”符號

   空白符,表示命令和選項、引數,多個引數等之間的分隔符,某些情況下可以使用“,”替換

  • “?”符號

   ①萬用字元,表示單個任意字元。

   ②作為命令列語句的特殊選項,用法“命令 /?”,用於檢視當前命令說明資訊。

  • “”””符號

   ①當檔案完全路徑名中存在“ ”空白符是,可以使用“”””將路徑名引起來作為一個完整路徑名進行處理。

   ②在“for /f”命令中表示對擴充套件選項的引用,當在集合列表中使用“”””表示將當前元素作為字串進行處理。

   ③在“findstr”或“find”命令中引用的字串表示要搜尋的字串。

   ④強制作為字串進行處理,在某些特殊情況下可以使用。

  • ““”符號

   表示命令語句,在“for /f”中的選項集合中使用““”引起來的語句將會作為命令語句執行並將結果作為“for”語句迴圈的內容。

  • “;”符號

   ①某些命令引數之間的分隔符,如果該引數可以包含多個值,可以使用“;”進行多個值的分割。

   ②在“echo”命令後表示轉義字元或輸出空行,緊接“echo”命令。“echo;”用於輸出空行,“echo;off”用於輸出特殊內容。

  • “[”符號

   ①在“findstr /r”命令中表示字串範圍或類別的開始符號,例如“findstr /r “[0-9]” a.txt”。

   ②在“echo”命令後表示轉義字元或輸出空行,緊接“echo”命令。“echo[”用於輸出空行,“echo[off”用於輸出特殊內容。

  • “]”符號

   ①在“findstr /r”命令中表示字串範圍或類別的結束符號,例如“findstr /r “[0-9]” a.txt”。

   ②在“echo”命令後表示轉義字元或輸出空行,緊接“echo”命令。“echo]”用於輸出空行,“echo[off”用於輸出特殊內容。

  • “”符號

   ①表示根目錄,例如“cd”表示返回到當前根目錄。

   ②目錄和子目錄、目錄和檔案的路徑分隔符。

   ③在“findstr /r”命令中表示轉義字元,例如“<”和“>”等。

   ④在“echo”命令後表示轉義字元或輸出空行,緊接“echo”命令。“echo”用於輸出空行,“echooff”用於輸出特殊內容。

  • “:”符號

   ①標籤宣告符號,其後的字串將作為一個標籤進行處理,用法“: 標籤名”。可以使用“goto”或“call”命令跳轉到該標籤處。

   ②磁碟卷標符號,跟在“C”、“D”等卷標後表示碟符。

   ③在單字元變數或字串變數中表示變數的擴充套件(替換或擷取)操作,例如“%var:~m,n%”表示擷取字串,“%var:str=value%”表示字串替換操作。

   ④跟在某些命令的特殊選項後表示選項值資訊。例如“findstr /C:”abc” a.txt”等。

  • “::”符號

   使用“::”開頭的語句表示無效語句,相當於註釋語句。

  • “nul”符號

   表示一個空的字元(非空字串),常見用於“pause > nul”。

實用案例分析

1.強制刪除目錄或檔案

   可能會在某些情況下遇到這種情況“某一個資料夾被系統鎖定無法刪除”,嘗試了各種方法都無果,是否很悲觀。下面來看看如何使用批處理來解決這一問題。

   首先來看看需要用到的DOS命令,在DOS中刪除目錄需要使用“md”命令,其中提供“/s”選項用於刪除目錄樹結構,“/q”選項表示靜默刪除,但是使用“md”命令的限制是必須是空的目錄,也就是目錄中不能有檔案,所有刪除目錄之前一定要先刪除檔案,刪除檔案需要使用“del”命令,其中提供了“/f”選項用於強制刪除只讀檔案,“/a”選項表示刪除任意屬性的檔案,“/q”選項表示靜默刪除。強制刪除目錄的程式碼如下:

@echo off
echo ***************強制刪除目錄*****************
echo 使用方法:
echo 1.請輸入要刪除目錄的完整路徑地址。
echo 2.將要刪除的目錄拖放到執行中的批處理中。
echo 3.將要刪除的目錄拖放到程式圖示上。
echo 注意:支援檔案刪除,刪除後無法在回收站恢復。
echo ********************************************
echo=
set inPath=%1
if defined inPath (
  goto op1
) else (
  goto op2
)
:op1
if exist %inPath%
ul (
  rem 刪除目錄下所有檔案(網傳有del /f /a /q \?%1做法)
  del /f /a /q %1
  rem 刪除當前目錄(網傳有rd /s /q \?%1做法)
  rd /s /q %1
) else (
  rem 刪除目錄下所有檔案(網傳有del /f /a /q \?%1做法)
  del /f /a /q %1
)
goto end
:op2
set /p inPath=目錄完全路徑地址(輸入或拖放)並回車:
if exist %inPath%
ul (
  rem 刪除目錄下所有檔案
  del /f /a /q %inPath%
  rem 刪除當前目錄
  rd /s /q %inPath%
) else (
  rem 刪除目錄下所有檔案
  del /f /a /q %inPath%
)
goto end
:end
echo=
echo 刪除已完成!請重新整理看看是否刪除。
pause > nul

可以將上述程式碼拷貝下來並儲存為批處理檔案(例如:刪除目錄.bat)然後按照用法使用即可。如果你有興趣可以進行改寫或擴充套件。

2.鎖定目錄管理(無法引用的目錄)

   在網上看到一些例子,使用DOS命令來製作鎖定資料夾,其實這種鎖定資料夾是在資料夾的命名上做的文章。來看看如何實現,在DOS(CMD)命令列中進行操作:使用“md D: est..”命令在D盤新建一個“test.”的目錄,我們指定在Windows中目錄的命令不能以“.”開頭或結尾,所以使用“DOS”命令可以打破這個常規,可以嘗試一下在D盤中是無法使用Windows系統操作來操作該目錄的;然後使用“start D: est..”開啟目錄;同時可以使用“del D: est..”來刪除目錄。要想知道這種情況的原理則需要了解Windows實際的工作原理,筆者暫時瞭解較少,無法解釋。所以下面我把上面的內容進行整合一下,程式碼如下:

@echo off
echo *******************鎖定資料夾管理********************
echo=使用說明:
echo=1.新建目錄必須使用至少一個"."結尾才能鎖定進行管理,否則視為普通目錄。
echo=2.開啟目錄必須使用完全路徑名。
echo=3.刪除目錄必須首先刪除目錄中的所有檔案。通過開啟手動刪除。
echo *****************************************************
:start
echo=
set /p op=請選擇以上操作(1.新建/2.開啟/3.刪除):
if %op%==1 goto op1
if %op%==2 goto op2
if %op%==3 goto op3
:op1
set /p dName=請輸入新建目錄的名稱:
md %dName%.
if errorlevel 0 (
  echo=%dName%目錄新建完成!
) else (
  echo=%dName%目錄建立失敗!
)
goto end
:op2
set /p dName=請輸入要開啟的目錄(完整路徑):
start %dName%.
if errorlevel 0 (
  echo=%dName%目錄已開啟!
) else (
  echo=%dName%目錄開啟失敗!
)
goto end
:op3
set /p dName=請輸入要刪除的目錄:
rd %dName%.
goto end
:end
echo=
set /p choose=是否退出? (Y/N):
if /i %choose% equ y (
  exit
) else (
  goto start
)

可以將上面程式碼拷貝下來並儲存為批處理檔案然後執行試試看。需要注意的時,上面的命令操作都是有一定條件限制的,請參考使用說明。

3.清理系統垃圾資訊

   清理系統垃圾主要是指刪除Windows系統內部自動生成的垃圾檔案或目錄,對Windows系統有所瞭解的人應該知道垃圾檔案主要包括系統補丁的日誌檔案、系統自動生成的臨時檔案或目錄以及使用者使用過程中自動生成的臨時檔案、快取檔案等垃圾檔案(最多的還屬於IE的快取檔案),實際的清理就是刪除這些檔案,刪除檔案就要使用“del”或“rd”命令來實現。

   在刪除這些檔案之前一定要知道檔案的所在位置,系統的日誌和臨時檔案大多在“WINDOWS”目錄下,使用者生成的垃圾檔案大多都在“我的文件”等的指定資料夾中(可以自行查查哪些檔案屬於垃圾檔案)。下面來看程式碼:

@echo off
rem 使用系統環境變數來獲取各個指定的目錄地址,系統環境變數可以在系統屬性中檢視
echo 正在清理系統垃圾檔案,請稍後......
rem “%systemdrive%”為系統碟符環境變數,一般為“C:”
del /f /s /q %systemdrive%*.tmp
del /f /s /q %systemdrive%*.log
rem “recycled”目錄是回收站的目錄,如果不清空回收站,則可以註釋該語句
del /f /s /q %systemdrive%
ecycled*.*
rem “%windir%”為系統目錄環境變數,一般為“C:WINDOWS”
del /f /s /q %windir%*.bak
rem “prefetch”目錄為預讀檔案目錄
del /f /s /q %windir%prefetch*.*
rem “temp”表示臨時工作目錄
rd /s /q %windir%	emp & md %windir%	emp
rem “%userprofile%”為系統當前使用者目錄環境變數,一般為“C:Documents and Settings使用者名稱”
rem “cookies”目錄為瀏覽器“cookie”存放目錄
del /f /q %userprofile%cookies*.*
rem “Local Settings”目錄為瀏覽器快取目錄
del /f /s /q "%userprofile%Local SettingsTemporary Internet Files*.*"
del /f /s /q "%userprofile%Local SettingsTemp*.*"
echo 清理系統垃圾完成!
echo. & pause

將上面的程式碼拷貝下來並儲存為批處理(.bat)檔案,然後執行即可。如有需要,則可以自行新增其他需要清楚的目錄和檔案,使用的命令主要有“del”和“rd”;如果需要清除並移到“回收站”中,可以使用“move”命令來實現。

4.重新註冊系統元件

   系統元件是系統本身不可缺少的一部分,很多軟體缺少了這些元件都無法正常執行。在Windows系統中最基層的系統元件分為DLL和OCX兩種,其中DLL(全稱Dynamic Link Library,“動態連結庫”)檔案,它是很多系統軟體都依賴的一種對立程式;OCX(全稱Object Linking and Embedding (OLE) Control Extension,“嵌入式物件控制元件”)檔案是一種共享式的對立程式。首先了解了這兩種元件,那麼重新註冊則就是將這些DLL或OCX元件解除安裝後重新安裝一遍。那麼使用什麼命令來執行完成了?

   在Windows系統中提供了一個“regsvr32”外部程式來進行DLL和OCX檔案的註冊和解除安裝操作,雖然是一個外部程式,但是同樣提供了命令操作行,可以通過在執行視窗或命令列中輸入“regsvr32”命令來檢視“regsvr32”工具的使用方法,這裡不多說,具體選項應用都有說明。需要注意的是“regsvr32”命令只能用於操作“.dll”或“.ocx”檔案。下面我們來看重新註冊系統元件的程式碼(這裡使用“for”語句來實現):

@echo off
set dPath=%systemroot%system32
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo 輸入目錄,註冊其下的所有DLL或OCX元件
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
set /p dPath=請輸入你要註冊元件的目錄(預設為%dPath%):
for %%f in (%dPath%.dll) do (
  regsvr32 /s %%f
)
for %%f in (%dPath%.ocx) do (
  regsvr32 /s %%f
)

當系統出現不穩定的情況下,可以使用這種方式修復一下系統。

5.批量檔案重新命名操作

   批量檔案重新命名,這個問題在之前已經說過,但是沒有講過如何實現。下面我們就來看看這個案例。

   或許你在某些網站上下載一系列檔案時,這些檔案的名稱都包含了該網站預定義的部分名稱字首或字尾,是否感覺不雅觀,如何去掉這些字首或字尾呢?一個一個修改?太OUT了!使用批量修改軟體?我的第一想法就是別人可以做的批量修改軟體我為什麼不能。上面已經學習了批處理,那麼我們就使用批處理實現簡單的批量修改檔名稱。

   要修改檔名稱,必須要使用“ren”命令,具體操作就是使用“for”迴圈取到每一個檔名稱,然後在名稱上進行修改,最後使用新的字串名稱來替換原有的字串名稱即可。程式碼如下:

@echo off
echo #################################################
echo 使用說明:
echo 不指定工作路徑則為當前所在目錄。
echo 只需要指定需要替換的字串和替換成的字串即可。
echo #################################################
set dPath=%~dp0
set /p dPath=設定檔案所在目錄(預設為%dPath%):
:start
set /p oldStr=要替換的字串:
set /p newStr=要替換成的字串:
if not defined oldStr goto start
if not defined newStr goto start
setlocal enabledelayedexpansion
for /f "skip=4 tokens=3*" %%a in (`dir`) do (
  if not %%a==^<DIR^> (
    if not %%b==位元組 (
      if not %%b==可用位元組 (
        if not %%b==%~nx0 (
          set fileName=%%b
          set fileName=!fileName:%oldStr%=%newStr%!
          ren "%%b" "!fileName!"
        )
      )
    )
  )
)
set exitop=n
set /p exitop=是否退出?(Y/N)
if /i %exitop% equ y (
  exit
) else (
  goto start
)
pause

上面的批量檔案改名只是一個簡單的示例,更復雜的改名方案等待你去實現。

6.程式、埠資訊管理

   程式是Windows系統中的一個重要概念,一般對應一個正在執行的程式,在MS-DOS同樣提供了對程式實現管理的命令工具,常用的有“tasklist”命令和“taskkill”命令,其中“tasklist”命令用於檢視程式資訊,可以根據一個程式名稱或程式ID來檢視程式的相應資訊;“taskkill”命令可以用於終止程式,可以根據一個程式名稱或程式ID來終止程式或所在程式樹。

   埠是Windows系統中的另一個重要概念,具有遠端通訊功能的程式一般至少需要監聽一個埠來實現通訊,埠不可以重複使用,一般一個埠只對應一個程式,但是一個程式可以對應多個埠(具體的關於“網路埠“的詳細描述可以參考一些其他資料)。在MS-DOS系統中提供了“netstat”工具來檢視網路埠,同時還可以檢視埠對應的程式資訊。下面我們就來實現這個例子:

@echo off
title 埠/程式管理工具
setlocal enabledelayedexpansion
:menu
echo=
echo ╔-                                                     -╗
echo           本機開放的埠及使用該埠的程式管理工具
echo= ..........................................................
echo       1.TCP/UDP分類列表檢視
echo       2.本地埠查詢
echo       3.程式終止
echo                                               Q:退出
echo ╚-                                                     -╝
echo=
set op=q
set /p op=請選擇操作:
if %op%==1 goto seeType
if %op%==2 goto searchPort
if %op%==3 goto killProcess
if /i %op% equ q goto end
goto menu
:seeType
echo=
echo                        -=TCP協議=-
echo=
echo    本地地址       埠      程式ID    程式名稱
echo ─────────────────────────────
for /f "skip=4 tokens=2,5" %%a in (`netstat -ano -p tcp`) do (
  set resultStr=
  rem 拆分本地地址為IP和埠號
  for /f "delims=: tokens=1,2" %%i in ("%%a") do (
     call :builderInfo 15 %%i
     set resultStr1= !resultStr!
     call :builderInfo 6 %%j
     set resultStr2=!resultStr1! !resultStr!
  )
  call :builderInfo 6 %%b
  set resultStr3=!resultStr2! !resultStr!
  rem 通過程式ID獲取程式名稱
  for /f "skip=2 delims=, tokens=1" %%i in (`tasklist /fi "PID eq %%b" /fo csv`) do (
    set resultStr4=!resultStr3! %%~i
  )
  echo !resultStr4!
)
echo ==========================================================
echo=
echo                       -=UDP協議=-
echo=
echo    本地地址       埠      程式ID    程式名稱
echo ─────────────────────────────
for /f "skip=4 tokens=2,4" %%a in (`netstat -ano -p udp`) do (
  set resultStr=
  rem 拆分本地地址為IP和埠號
  for /f "delims=: tokens=1,2" %%i in ("%%a") do (
    call :builderInfo 15 %%i
    set resultStr1= !resultStr!
    call :builderInfo 6 %%j
    set resultStr2=!resultStr1! !resultStr!
  )
  call :builderInfo 6 %%b
  set resultStr3=!resultStr2! !resultStr!
  rem 通過程式ID獲取程式名稱
  for /f "skip=2 delims=, tokens=1" %%i in (`tasklist /fi "PID eq %%b" /fo csv`) do (
    set resultStr4=!resultStr3! %%~i
  )
  echo !resultStr4!
)
goto end
:searchPort
set /p prot=請輸入要查詢的埠號(輸入b返回主選單):
if not defined prot goto :searchPort
if /i %prot% equ b goto :menu
echo=
echo=    -=本地%prot%埠使用明細=-
echo=
echo   協議名稱   程式ID    程式名稱
echo ─────────────────
for /f "tokens=1,2,4,5" %%a in (`netstat -ano ^| findstr ":%prot%>"`) do (
  for /f %%i in (`echo %%b ^| findstr ":%prot%>"`) do (
    set resultStr=
    if /i %%a equ UDP (
      call :builderInfo 6 %%c
      set resultStr1= UDP !resultStr!
      rem 通過程式ID獲取程式名稱和對應元件
      for /f "skip=2 delims=, tokens=1" %%i in (`tasklist /fi "PID eq %%c" /fo csv`) do (
        set resultStr2=!resultStr1! %%~i
      )
    ) else (
      call :builderInfo 6 %%d
      set resultStr1= TCP !resultStr!
      rem 通過程式ID獲取程式名稱和對應元件
      for /f "skip=2 delims=, tokens=1" %%i in (`tasklist /fi "PID eq %%d" /fo csv`) do (
      set resultStr2=!resultStr1! %%~i
      )
    )
  echo !resultStr2!
  )
)
goto end
:killProcess
set /p proTag=請輸入程式ID或名稱(輸入b返回主選單):
if not defined proTag goto killProcess
if /i %proTag% equ b goto menu
for /f %%i in (`echo %proTag% ^| findstr ".exe .dll"`) do (
  set /a count=0
  for /f "skip=2 delims=, tokens=1,2,3" %%a in (`tasklist /fi "p_w_picpathname eq %%i" /fo csv`) do (
    set /a count+=1
  )
  set sure=N
  set /p sure=確定結束%proTag%指向的!count!個程式嗎?(Y/N)
  if /i !sure! equ y (
    taskkill /im %proTag% /f
  ) else (
    goto killProcess
  )
)
set /a num=%proTag%
if %num%==0 echo 請輸入正確程式ID或程式名稱,例如123或cmd.exe... &&     goto killProcess
for /f "skip=2 delims=, tokens=1,2,3" %%a in (`tasklist /fi "pid eq %num%" /fo csv`) do (
  set sure=N
  set /p sure=確定結束%num%指向程式嗎?(Y/N)
  if /i !sure! equ y (
    taskkill /pid %num% /f
  ) else (
    goto killProcess
  )
)
goto end
:end
echo=
set exitop=n
set /p exitop=是否退出?(Y/N)
if /i %exitop% equ y (
exit
) else (
goto menu
)
rem 構建輸出資訊,根據長度補全空格,是左邊對齊
:builderInfo
rem 字串最大長度
set maxLength=%1
rem 原始字串
set str=%2
rem 原始字串長度
set /a length=0
rem 計算字串長度,使用迴圈擷取單個字元是否等於空為依據
:getLength
set /a length+=1
if "%str%"=="" goto fillSpance
for /f %%i in ("%length%") do (
  if not "!str:~%%i,1!"=="" goto getLength
)
rem 使用空格補全字串,如果原始字串長度小於最大字串長度則在後面新增空格
:fillSpance
set temp=
if /i %length% lss %maxLength% (
  for /l %%i in (%length%,1,%maxLength%) do (
    set temp= !temp!
  )
)
set resultStr=%str%!temp!

可以將上面的例子儲存為批處理檔案執行即可,提供了網路埠的檢視工具、根據埠查詢程式的工具以及程式終止工具等,同時提供了一個關於字串長度獲取和空格填充的方法,當然你還可以自行進行擴充套件。

7.啟動或關閉服務

   服務也是Windows系統的一個重要概念,一般服務是其他程式執行的基礎環境,關於服務的具體資訊可以自行參考其他資料。在MS-DOS提供了一個強悍的工具“net”命令,用於對WIndows基礎資訊程式綜合管理,當然它也可以管理服務。“net”命令如何進行服務的啟動和關閉管理呢?來看下面的例子:

@echo off
title 服務管理工具
setlocal enabledelayedexpansion
:menu
echo=
echo ==================================================
echo=
echo                  -=服務管理工具=-
echo=
echo              1.啟動服務 2.關閉服務
echo                                        Q.退出
echo=
echo 使用說明:啟動或關閉服務需要輸入服務名稱,服務名稱
echo 可以通過“service.msc”管理皮膚對應屬性中檢視。
echo ==================================================
echo=
set /p op=請選擇操作:
if %op%==1 goto startService
if %op%==2 goto closeService
if /i %op% equ q exit
goto menu
:startService
echo=
set /p serviceName=請輸入你要啟動的服務名稱:
for /f "delims=" %%a in (`net start ^| find /i "%serviceName%"`) do (
  set /p choice1=%serviceName%服務正在執行...是否關閉?(Y/N^)
  if /i !choice1! equ y (
    net stop %serviceName%
  )
  goto end
)
net start %serviceName%
goto end
:closeService
echo=
set /p serviceName=請輸入你要關閉的服務名稱:
for /f "delims=" %%a in (`net start ^| find /i "%serviceName%"`) do (
  net stop %serviceName%
  goto end
)
set /p choice2=%serviceName%服務處於停止狀態...是否開啟?(Y/N^)
if /i %choice2% equ y (
  net start !serviceName!
)
goto end
:end
echo=
set exitop=n
set /p exitop=是否退出?(Y/N)
if /i %exitop% equ y (
  exit
) else (
  goto menu
)

上面的程式碼中,用到了“net start …”和“net stop …”命令,其中“net start”命令用於檢視所有已啟動的服務列表,“net start …”命令用於啟動指定服務名稱的服務,“net stop …”命令用於關閉指定服務名稱的服務。

8.演算法擴充套件:關於浮點數運算

   MS-DOS批處理指令碼支援的數值型別只能是整數型別,如果是小數則將作為字串進行處理,也就是說預設情況下批處理只支援整數運算,本案例就來介紹一下如何讓批處理支援小數運算,案例以小數加法為例進行講解。

   其實實現過程是一個演算法理論,由於批處理支援整數運算,所以需要將小數的整數部分和小數部分分開進行運算。這個地方的運算原理是:分別提取整數部分和小數部分;以原小數中較大的小數的位數為標準進行補0操作,整數部分在右邊低位補0,小數部分在左邊高位補0;然後去掉小數點,從右邊第一個開始依次向左推移並計算其和,大於9則想左邊相鄰位進1並保留結果個位值,計算完成後還原小數點位置即可。例如:要計算 4567.5+5.6789,則處理後的數字為45675000+00056789,然後按位做加法操作,這個方法只是模擬實現,當然會存在一定的限制。程式碼如下:

@echo off
:main
cls
echo.
echo 要計算某幾個數字的和,請直接敲回車
echo (注:由於過於複雜和時間問題,原碼並非本人編寫來自網路)
echo 退出請輸入 e
echo.
set num1=0.0
set times=0
set expression=
:input_loop
set num2=
set sum_=
set /a times+=1
set /p num2= 請輸入第 %times% 個數:
if /i "%num2%"=="e" exit
if "%num2%"=="" goto result
if "%num2:~0,1%"=="." set num2=0%num2%
call :input_check "%num2%" num2
set expression=%expression%+%num2%
setlocal enabledelayedexpansion
for /f "tokens=1-4 delims=." %%i in ("%num1%.%num2%") do (
  set int1=%%i
  set int2=%%k
  set dec1=%%j
  set dec2=%%l
  call :get_length int1 %%i
  call :get_length int2 %%k
  call :get_length dec1 %%j
  call :get_length dec2 %%l
  call :add_zero
  call :sum
  goto input_loop
)
:input_check
rem =========== 檢測輸入是否正確 ===========
echo %1|findstr ".">nul||set %~2=%~1.0
for /f "tokens=1* delims=." %%i in (%1) do (
  echo %%i%%j|findstr "^[0-9]*$">nul || (set /a times-=1&goto input_loop)
)
goto :eof
:get_length
rem =========== 計算各部分數字的長度 ===========
set count=0
:intercept
set /a count+=1
for /f %%i in ("%2") do (
  set var=%%i
  if not "!var:~%count%,1!"=="" goto intercept
  set %1_length=!count!
)
goto :eof
:add_zero
rem =========== 分別在整數部分和小數部分新增0字串 ===========
:: 在數位不夠的整數部分添0補齊
set /a int_length_diff=%int1_length%-%int2_length%
set int_length_diff=%int_length_diff:-=%
call :creat_zero int_zero %int_length_diff%
if %int1_length% gtr %int2_length% (
  set int2=%int_zero%%int2%
  set int_length_max=%int1_length%
) else (
  set int1=%int_zero%%int1%
  set int_length_max=%int2_length%
)
:: 在數位不夠的小數部分添0補齊
set /a dec_length_diff=%dec1_length%-%dec2_length%
set dec_length_diff=%dec_length_diff:-=%
call :creat_zero dec_zero %dec_length_diff%
if %dec1_length% gtr %dec2_length% (
  set dec2=%dec2%%dec_zero%
  set dec_length_max=%dec1_length%
) else (
  set dec1=%dec1%%dec_zero%
  set dec_length_max=%dec2_length%
)
goto :eof
:creat_zero
rem =========== 根據數字字串長度的差異,生成相應長度的0字串 ===========
set zero=
for /l %%i in (1,1,%2) do set zero=!zero!0
set %1=%zero%
goto :eof
:sum
rem =========== 按位計算新數的和 ===========
:: 提取整數部分和小數部分來組成新數
set num1_new=%int1%%dec1%
set num2_new=%int2%%dec2%
set /a length_total=%int_length_max%+%dec_length_max%
set switch=0
set sum_tmp=
for /l %%i in (1,1,%length_total%) do (
  set /a sum_tmp=!num1_new:~-%%i,1!+!num2_new:~-%%i,1!+!switch!
  if !sum_tmp! gtr 9 (
    set /a sum_tmp=!sum_tmp!-10
    set switch=1
  ) else (
    set switch=0
  )
  set sum_=!sum_tmp!!sum_!
)
:: 插入小數點
set sum_=!sum_:~0,-%dec_length_max%!.!sum_:~-%dec_length_max%!
:: 判斷在最高位時是否進位
if %switch% equ 1 (
  set num1=1%sum_%
) else (
  set num1=%sum_%
)
goto :eof
:result
if "%expression%"=="" set /a times-=1&goto input_loop
echo.
echo %expression:~1%=%num1%
echo.
pause
goto main

由於時間問題上述程式碼來自附件中的一個例項,可以自行研究,這裡僅供參考。

9.應用擴充套件:簡單的特效

   曾經在網路上看到一個帖子,樓主寫了一個批處理,可以生成一個“I LOVE YOU”圖示檔案,感覺很是NB。但是這需要藉助Windows的第三方指令碼工具進行製作。具體的這裡不研究,這個批處理附件中也有,可以參考一下程式碼。這裡介紹一個傳送給指定電腦一個特殊的文字資訊,程式碼如下:

@echo off
set a=10
set b=0
:tex
set /a a+=3
set /a b+=1
mode con cols=%a% lines=%b%
if %a% lss 60 goto :tex
echo O(∩_∩)O 聖誕快樂 O(∩_∩)O
set a=15,a6,2e,d0,34,8b,4f,9d,5e
for %%i in (%a%) do (
  ping -n 2 127.1>nul
  color %%i
)
for %%i in (%a%,%a%) do (
  ping -n 1 127.1>nul
  color %%i
)
>>ms.txt echo */. . . * .
>>ms.txt echo .* . [] * __
>>ms.txt echo */ . ./~~~~~~~~~~~~`. ^|
>>ms.txt echo *,/,..,,...........,.
>>ms.txt echo ^|^| ..▎# ▎田 田 ▎ ^| ▎
>>ms.txt echo ^|^| ^&^&;▎ ▎ ▎`^|`▎ o
>>ms.txt echo ^|^| ##■■■■■■■■■■〓
msg %username% /w /time:3600 <ms.txt
del ms.txt
pause

關於上面的程式碼,其中“ping -n num 127.1 > nul”這一句表示的是使用“ping”命令來實現延遲操作,這種方式使用的比較廣泛。其實上面這個短小的例子的資訊都是通過特殊字元進行拼湊的,如果你有藝術細胞,同樣可以作出這樣的效果。

後記

   廢話、閒話也說了這麼多,到這裡我對批處理基本東西的整理也就到此結束了,知道了這些資訊在去讀別人寫的批處理指令碼應該也不是一件特別費力的事兒了。通過這些介紹,唯一的感受就是批處理程式也一樣的強大,其實很多其他的程式語言都提供了對批處理支援介面,可以自行查一下你當前所會的語言的對應介面,呼叫試試即可。

   關於批處理的學習對應我來說應該是一個過渡性學習,以後不一定會用到,但是很多常用的還是應該記住,現在很多大型的伺服器都提供有批處理指令碼支援,所以讀的懂它還是有一定必要的。別的不多說了,廢話就到處結束。

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

附加內容

另附批處理編輯工具推薦和例項程式碼,地址:批處理編輯工具和例項程式碼