批處理是一種簡化的腳本語言,也稱作宏。它應用於DOS和Windows系統中,它是由DOS或者Windows系統內嵌的命令解釋器(通常是COMMAND. COM或者CMD.EXE)解釋運行。類似於Unix中的Shell腳本。批處理文件具有.bat或者.cmd的擴展名,其最簡單的例子,是逐行書寫在命令行中會用到的各種命令。更復雜的情況,需要使用if,for,goto等命令控制程序的運行過程,如同C,Basic等中高級語言一樣。如果需要實現更復雜的應用,利用外部程序是必要的,這包括系統本身提供的外部命令和第三方提供的工具或者軟件。批處理文件,或稱為批處理程序,是由一條條的DOS命令組成的普通文本文件,可以用記事本直接編輯或用DOS命令創建,也可以用DOS下的文本編輯器Edit.exe來編輯。在"命令提示"下鍵入批處理文件的名稱,或者雙擊該批處理文件,系統就會調用Cmd.exe運行該批處理程序。一般情況下,每條命令占據一行;當然也可以將多條命令用特定符號(如:&、&&、|、||等)分隔后寫入同一行中;還有的情況就是像if、for等較高級的命令則要占據幾行甚至幾十幾百行的空間。系統在解釋運行批處理程序時,首先掃描整個批處理程序,然后從第一行代碼開始向下逐句執行所有的命令,直至程序結尾或遇見exit命令或出錯意外退出。
1、批處理注釋:REM 和 ::
REM為注釋命令,一般用來給程序加上注解,該命令后的內容不被執行,但能回顯。
:: 也可以起到rem 的注釋作用, 而且更簡潔有效; 但有兩點需要注意:
第一, 任何以冒號:開頭的字符行, 在批處理中都被視作標號, 而直接忽略其后的所有內容。
有效標號:冒號后緊跟一個以字母或數字開頭的字符串,goto語句可以識別。
無效標號:冒號后緊跟一個非字母數字的一個特殊符號,goto無法識別的標號,可以起到注釋作用,所以 :: 常被用作注釋符號,其實 :+ 也可起注釋作用。
第二, 與rem 不同的是, ::后的字符行在執行時不會回顯, 無論是否用echo on打開命令行回顯狀態, 因為命令解釋器不認為他是一個有效的命令行, 就此點來看, rem 在某些場合下將比 :: 更為適用; 另外, rem 可以用於 config.sys 文件中。
行內注釋格式:%注釋內容%(不常用,慎用)
2、批處理關閉命令回顯:ECHO 和 @
@字符放在命令前將關閉該命令回顯,無論此時echo是否為打開狀態。入侵時常用來隱藏執行的命令。
echo命令的作用列舉如下:
(1)打開回顯或關閉回顯功能
格式:echo [{ on|off }]
如果想關閉"ECHO OFF"命令行自身的顯示,則需要在該命令行前加上"@"。
(2)顯示當前ECHO設置狀態
格式:echo
(3)輸出提示信息
格式:ECHO 信息內容
上述是ECHO命令常見的三種用法,也是大家熟悉和會用的,但作為DOS命令淘金者你還應該知道下面的技巧:
(4)關閉DOS命令提示符
在DOS提示符狀態下鍵入ECHO OFF,能夠關閉DOS提示符的顯示使屏幕只留下光標,直至鍵入ECHO ON,提示符才會重新出現。
(5)輸出空行,即相當於輸入一個回車
格式:ECHO.
值得注意的是命令行中的"."要緊跟在ECHO后面中間不能有空格,否則"."將被當作提示信息輸出到屏幕。另外"."可以用,:;"/[\\]+等任一符號替代。
命令ECHO.輸出的回車,經DOS管道轉向可以作為其它命令的輸入,比如echo.|time即相當於在TIME命令執行后給出一個回車。所以執行時系統會在顯示當前時間后,自動返回到DOS提示符狀態
(6)答復命令中的提問
格式:ECHO 答復語|命令文件名
上述格式可以用於簡化一些需要人機對話的命令(如:CHKDSK/F;FORMAT Drive:;del *.*)的操作,它是通過DOS管道命令把ECHO命令輸出的預置答復語作為人機對話命令的輸入。下面的例子就相當於在調用的命令出現人機對話時輸入"Y"回車:
C:>ECHO Y|CHKDSK/F
C:>ECHO Y|DEL A :*.*
(7)建立新文件或增加文件內容
格式:ECHO 文件內容>文件名
ECHO 文件內容>>文件名
例如:
C:>ECHO @ECHO OFF>AUTOEXEC.BAT建立自動批處理文件
C:>ECHO C:\\CPAV\\BOOTSAFE>>AUTOEXEC.BAT向自動批處理文件中追加內容
C:>TYPE AUTOEXEC.BAT顯示該自動批處理文件
@ECHO OFF
C:\\CPAV\\BOOTSAFE
(8)向打印機輸出打印內容或打印控制碼
格式:ECHO 打印機控制碼>RN
ECHO 打印內容>RN
下面的例子是向M-1724打印機輸入打印控制碼。<Alt>156是按住Alt鍵在小鍵盤鍵入156,類似情況依此類推:
C:>ECHO +156+42+116>RN(輸入下划線命令FS*t)
C:>ECHO [email=+155@]+155@>RN[/email](輸入初始化命令ESC@)
C:>ECHO.>RN(換行)
(9)使喇叭鳴響
C:>ECHO ^G
"^G"是在dos窗口中用Ctrl+G或Alt+007輸入,輸入多個^G可以產生多聲鳴響。使用方法是直接將其加入批處理文件中或做成批處理文件調用。
3.輸出重定向命令:>,>>
將輸出信息重定向到指定的設備或文件。系統默認輸出到顯示器。
echo aaaaa>a.txt 即可將本在顯示器上顯示的信息aaaaa輸出到文件a.txt中,屏幕上沒有任何顯示。如果文件a.txt本來已經存在,該命令將首先擦除a.txt中的所有信息,然后寫入信息aaaaa;若a.txt本來就不存在,該命令即可新建一個a.txt文件,並寫入信息aaaaa。
使用命令:echo hello >1.txt將建立文件1.txt,內容為"hello "(注意行尾有一空格)
使用命令:echo hello>1.txt將建立文件1.txt,內容為"hello"(注意行尾沒有空格)
">nul 2>nul"可以屏蔽一切屏幕的輸出,例如:dir >nul 2>nul這樣屏幕上什么都不會輸出,也就是沒有結果。
1>nul 表示將正確執行目錄樹的信息禁止輸出,2>nul 表示將執行過程中的錯誤信息禁止輸出。
echo aaaaa>>a.txt 類似於echo aaaaa>a.txt。區別在於:如果a.txt本已存在,>a.txt會擦除a.txt中的原有內容,而>>a.txt並不擦除原有內容,僅在a.txt文件的末尾添加信息aaaaa。a.txt不存在時,二者沒有差別。
4.輸入重定向命令:<
將輸入信息來源重定向為指定的設備或文件。系統默認從顯示器讀取輸入信息。
@echo off
echo abcdefg——這是文件a.txt中的信息>a.txt
echo 請任意輸入字符,以回車結束:
set /p ifo=
cls
echo 【 從屏幕獲得的輸入信息 】
echo %ifo%
set /p ifo=<a.txt
echo 【 從文件a.txt獲得的輸入信息 】
echo %ifo%
pause>nul
5.管道命令:|
將第一條命令的結果作為第二條命令的參數來使用,在unix中這種方式很常見。格式:第一條命令 | 第二條命令 [| 第三條命令...]。
例如:dir c:\\|find \"txt\"命令是:查找C:\\所有,並發現TXT字符串。
echo y|format a: /s /q /v:system:用過format的都知道,再格盤時要輸入y來確認是否格盤,這個命令前加上echo y並用|字符來將echo y的結果傳給format命令從而達到自動輸入y的目的。
6.邏輯組合命令:&,&&,||
組合命令就是可以把多個命令組合起來當一個命令來執行。這在批處理腳本里是允許的,而且用的非常廣泛。因為批處理認行不認命令數目。
&:它的作用是用來連接n個DOS命令,並把這些命令按順序執行,而不管是否有命令執行失敗;
&&:當&&前面的命令成功執行時,執行&&后面的命令,否則不執行,即碰到執行出錯的命令后將不執行后面的命令;
||:當||前面的命令失敗時,執行||后面的命令,否則不執行,即碰到執行正確的命令后將不執行后面的命令。
注意:組合命令和重定向命令一起使用必須注意優先級;管道命令的優先級高於重定向命令,重定向命令的優先級高於組合命令。對比:dir c:\\ & dir d:\\ > a.txt,dir c:\\ > a.txt & dir d:\\ >> a.txt 和dir c:\\ > a.txt dir d:\\ >> a.txt
7.轉義符:^
將特殊符號轉化為一般符號,即剝離特殊符號的特殊地位。特殊符號指:| & > <。比如,如果我們想輸出符號">",直接用命令 echo > 是不行的,必須修改為 echo ^> 。其余幾個特殊符號類似需要有同樣的處理。
為什么轉義字符放在行尾可以起到續行符的作用呢?原因很簡單,因為每行末尾還有一個看不見的符號,即回車符,轉義字符位於行尾時就讓回車符失效了,從而起到了續行的作用。
8.字符串界定符""
雙引號允許在字符串中包含空格,進入一個特殊目錄可以用如下方法
cd "program files"
cd progra~1
cd pro*
以上三種方法都可以進入program files這個目錄
9. , 逗號
逗號相當於空格,在某些情況下","可以用來當做空格使
比如:dir,c:\\
10. ; 分號
分號,當命令相同時,可以將不同目標用;來隔離,但執行效果不變,如執行過程中發生錯誤,則只返回錯誤報告,但程序仍會執行。
比如:dir c:\\;d:\\;e:\\;z:\\
以上命令相當於
dir c:\\
dir d:\\
dir e:\\
dir f:\\
如果其中z盤不存在,運行顯示:系統找不到指定的路徑。然后終止命令的執行。
例:dir c:\\;d:\\;e:\\1.txt
以上命令相當於
dir c:\\
dir d:\\
dir e:\\1.txt
其中文件e:\\1.txt不存在,但e盤存在,有錯誤提示,但命令仍會執行。如果目標路徑不存在,則終止執行;如果路徑存在,僅文件不存在,則繼續執行。
11. () 括號
小括號在批處理編程中有特殊的作用,左右括號必須成對使用,括號中可以包括多行命令,這些命令將被看成一個整體,視為一條命令行。
括號在for語句和if語句中常見,用來嵌套使用循環或條件語句。
注意:多條命令被視為一條命令行時,如果其中有變量,就涉及到變量延遲的問題。
12:批處理通配符:*,?
*號表示任意N個字符,而?號只表示任意一個字符
13:批處理幫助:help 或/?
如:dir /?>help.txt & for /?>> help.txt,將批處理幫助輸出到help.txt文件中。
14. 變量值引用符:%,!
批處理引用變量方法:直接用變量名操作變量,通過"%"或"!"來獲取變量的值。其中,只有在for語句里面重復對同一變量多次賦值時才需要使用"!",並且在使用"!"調用變量時,要首先"啟用延遲環境變量擴充",啟動命令為:SetLocal EnableDelayedExpansion。"啟用延遲環境變量擴充"后,所有的"!"都將被視為"取變量值"的特殊符號,即使用"^!"也不能輸出符號"!"。若要輸出"!",則需要"停用延遲環境變量擴充",命令為:SetLocal DisableDelayedExpansion。
引用變量用%var%,調用程序外部參數用%1至%9等等
%0%1%2%3%4%5%6%7%8%9%*為命令行傳遞給批處理的參數
%0 批處理文件本身,包括完整的路徑和擴展名
%1 第一個參數
%9 第九個參數
%* 從第一個參數開始的所有參數
參數%0具有特殊的功能,可以調用批處理自身,以達到批處理本身循環的目的,也可以復制文件自身等等。
批處理參數(%n)的替代功能可以擴充,具體如下:
~I - 刪除任何引號("),擴充 %I
%~fI - 將 %I 擴充到一個完全合格的路徑名
%~dI - 僅將 %I 擴充到一個驅動器號
%~pI - 僅將 %I 擴充到一個路徑
%~nI - 僅將 %I 擴充到一個文件名
%~xI - 僅將 %I 擴充到一個文件擴展名
%~sI - 擴充的路徑只含有短名
%~aI - 將 %I 擴充到文件的文件屬性
%~tI - 將 %I 擴充到文件的日期/時間
%~zI - 將 %I 擴充到文件的大小
%~$PATH:I - 查找列在路徑環境變量的目錄,並將 %I 擴充到找到的第一個完全合格的名稱。如果環境變量名未被定義,或者沒有找到文件,此組合鍵會擴充到空字符串可以組合修飾符來得到多重結果
%~dpI - 僅將 %I 擴充到一個驅動器號和路徑
%~nxI - 僅將 %I 擴充到一個文件名和擴展名
%~fsI - 僅將 %I 擴充到一個帶有短名的完整路徑名
%~dp$PATH:i - 查找列在路徑環境變量的目錄,並將 %I 擴充到找到的第一個驅動器號和路徑。
%~ftzaI - 將 %I 擴充到類似輸出線路的 DIR
不是所有的變量都能夠進行擴充的,有兩個條件:1.該字符串代表一個文件路徑;2.變量要用%x來表示,x可取a-z A-Z 0-9共62個字符中的任意一個。舉例說明:
@echo off
echo 正在運行的這個批處理:
echo 完全路徑:%0
echo 去掉引號:%~0
echo 所在分區:%~d0
echo 所處路徑:%~p0
echo 文件名:%~n0
echo 擴展名:%~x0
echo 文件屬性:%~a0
echo 修改時間:%~t0
echo 文件大小:%~z0
pause
其中的%0是批處理里面的參數,代表當前運行的批處理的完全路徑。類似的還有%1-%9,分別代表傳遞來的第1-9個參數。例子如下:
@echo off
set aa=C:\Windows\PPP\a.btx
call :deal aaa %aa% "c c" ddd eee
pause>nul
exit
:deal
echo %%0 = %0
echo %%1 = %1
echo %%2 = %2
echo %%3 = %3
echo %%4 = %4
echo %%5 = %5
其中,變量aa在之前是不可以擴充的,通過call命令並將aa作為參數傳遞給子函數:deal,將aa變量轉換成了變量%1,即符合%x格式,從而可以進行字符串擴充。至於%x中x取a-z A-Z的形式, for語句里面的變量就是用%x來表示的,因而可以直接進行擴充。