bat程序是作用是什么?
簡單的說,批處理的作用就是自動的連續執行多條命令。
這里先講一個最簡單的應用:在啟動wps軟件時,每次都必須執行(“>”前面內容表示DOS提示符):
C:\>cd wps
C:\WPS>spdos
C:\WPS>py
C:\WPS>wbx
C:\WPS>wps
如果每次用WPS之前都這樣執行一遍,還是十分麻煩。不過用批處理,就可以實現將這些麻煩的操作簡單化,首先我們編寫一個runwps.bat批處理文件,內容如下:
@echo off
C:
cd\wps
spdos
py
wbx
wps
cd\
以后,我們每次進入wps,只需要運行runwps這個批處理文件即可。
BAT有什么常用命令?
1.ECHO
顯示信息,或將命令回顯打開或關上。
ECHO [ON | OFF]
ECHO [message]
要顯示當前回顯設置,鍵入不帶參數的 ECHO。
echo 命令的第一個用法,echo on和echo off
echo on表示打開回顯,echo off表示關閉回顯,何為回顯?打開回顯就是執行命令時會把命令顯示出來,關閉回顯反之.
echo 命令的第二個用法,echo message,這個很簡單,就是顯示后面的信息
echo 命令第三個用法,顯示當前回顯設置,就是顯示回顯打開或關閉
echo也可以輸出文件。下面再說。
以下的這段代碼可以讓你很好地理解echo的用法(包括如何用echo輸出空行)
echo 這是沒有關閉回顯
echo;
echo
echo off
echo 這是關閉了回顯
echo;
echo
pause
二.PAUSE
暫停批處理程序,并顯示以下消息:
請按任意鍵繼續. . .
這個命令沒有什么好說的,要暫停時直接pause就行了
三.CLS
清除屏幕。
CLS
這個命令也沒有什么好說的,清屏,自己試一次就知道了
四.REM
在批處理文件或 CONFIG.SYS 里加上注解或說明。
REM [comment]
這個命令同樣沒什么好說的,用法就是rem 注釋
PS:其實可以用"::"代替"REM",可以提高執行速度,不過REM的兼容性更好,我還是建議大家用rem注釋
五.SET
一.給變量賦值(撤銷)
例1:
@echo off
set str=My name is Xiao
echo %str%
rem 批處理中的變量一般需要用%來擴展,詳見特殊符號一節
pause>nul
例2:
@echo off
set str=ABCDEFGHIJKLMN
echo %str%
set str=
echo;%str%
rem 還記得加";"可以實現什么效果嗎?一個空行,為什么要這么做呢?想不出來的話去掉這個";"試試
pause>nul
上面的例子中,一個是給變量賦值,一個是撤銷變量的值
2.等待用戶輸入數據(開關/P)
例:
@echo off
set /p name=請輸入你的姓名:
set /p age=請輸入你的年齡(純數字):
echo 所以,%name%今 年%age%歲咯?
pause>nul
3.計算(開關/A)
例1:
@echo off
set /a num=(12*2)+(13*4)
echo (12x2)+(13x4)=%num%
pause>nul
例2:
@echo off
set /p num=請輸入一個數字(不要超過2147483647):
REM 批處理能處理的數字不能超過32位(二進制)
set /a num*=2
echo 這個數字的兩倍是%num%
pause>nul
附:Set /a num*=2與set /a num=num*2等價
() - 分組
! ~ - - 一元運算符
* / % - 算數運算符
+ - - 算數運算符
<< >> - 邏輯移位
- 按位“與”
^ - 按位“異”
| - 按位“或”
= *= /= %= += -= - 賦值
&= ^= |= <<= >>=
, - 表達式分隔符
set /a支持多行表達式并列,比如set /a num1=1+1,num2=1+2,num3=1+3
并且set /a不需要擴展變量,比如set /a num=%num2%+%num3%與set /a num=num2+num3等價
以上內容僅為基礎教程
4.顯示當前已定義變量
例:
@set
@pause>nul
是不是很簡單?其實它還有更高級的用法呢
@set a
@pause>nul
@set s
@pause>nul
你們發現什么了嗎??它的用法就是這些,不用多說了
六.IF
1.IF的第一種用法,比較字符串
例:
set /p PW=請輸入密碼:
if %PW%==bat (
echo YES!
) ELSE (
Rem [else] 為可選參數,表示否則,即如果變量PW等于bat則輸出YES!否則輸出NO!
echo NO!
)
pause>nul
通過set /p和if可以實現一個簡單的密碼判斷,當然這個密碼判斷可以很輕易地被破解,仔細動腦筋想一想,該怎么破解呢.
不過這個密碼判斷尚有不足之處,假如我們什么都不輸入直接回車,便會提示錯誤,那該怎么辦呢?很簡單,只要加上雙引號(其它的符號也行)就行了=>if "%PW%"=="bat"
2.IF的第二種用法,比較數字
例:
set /p num1=請第一個輸入數字:
set /p num2=請第二個輸入數字:
if not %num1% LSS %num2% (
rem lss表示小于
rem [not]為可選參數,表示非,即如果變量num1不小于變量num2就輸出第一個數字大,否則輸出第二個數字大
echo 第一個數字大
) ELSE (
echo 第二個數字大
)
pause>nul
這段代碼可以實現一個簡單的判斷,不過尚有不足之處-----如果這兩個數字相等呢,這就要請出我們的else if啦(當然你也可以用幾個if來判斷)
set /p num1=請第一個輸入數字:
set /p num2=請第二個輸入數字:
if "%num1%" gtr "%num2%" (
echo 第一個數字大
) ELSE if "%num1%" EQU "%num2%" (
echo 一樣大
) ELSE (
echo 第二個數字大
)
pause>nul
------比較運算符-----
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
3.IF的第三種用法,檢測文件(夾)是否存在
例:
@echo off
if exist C:\windows (
echo 你的C盤有windows文件(夾^)
) else (
echo 你的C盤沒有windows文件(夾^)
)
pause>nul
"^"為轉義符號,在特殊符號一節再作講解
4.IF的第四種用法,檢測變量是否被定義
例:
@echo off
set var=aiwozhonghua
if defined var (
echo 變量var已被定義,它的值為%var%
) else (
echo 變量var沒有被定義
)
pause>nul
去掉第一行的set看看執行結果有什么不同,你明白它的用法了嗎?
5.IF的第五種用法,判斷返回值(ERRORLEVEL)
要判斷返回值,首先要理解返回值是個什么概念,批處理中的返回值一般表示了上個命令的執行結果(成功/失敗/等)
每個命令執行完畢后返回值都會做相應的更改,一般返回值為0表示成功,1表示失敗,有一些第三方的返回值比較特殊(如Choice.exe,Tmos.exe,Cmos.exe),在這里就不講解了
例:
@echo off
echo;>>%systemroot%\test.txt
if errorlevel 0 ( echo 寫入成功! ) else echo 寫入失敗
pause>nul
這段代碼嘗試向%systemroot%\system32\寫入數據,如果權限不夠或殺毒軟件攔截就會寫入失敗,這時就會顯示"寫入失敗".不知道%systemroot%表示了什么?單獨鍵入set自己仔細看一下結果.
不過看到后面你會發現這段代碼還有更簡便的寫法
注:用 if errorlevel判斷返回值時要將返回值從大到小排列
例:
@echo off
choice /C:ABC /n "A/B/C"
if errorlevel 3 echo You choose the C
if errorlevel 2 echo You choose the B
if errorlevel 1 echo You choose the A
pause>nul
七.GOTO
將 cmd.exe 導向到批處理程序中帶標簽的行。
GOTO label
label 指定批處理程序中用作標簽的文字字符串。
標簽必須單獨一行,并且以冒號打頭。
如果命令擴展名被啟用,GOTO 會如下改變:
GOTO 命令接受目標標簽 :EOF,這個標簽將控制轉移到當前
批腳本文件的結尾。不定義就退出批腳本文件,這是一個容易的
辦法。有關能使該功能有用的 CALL 命令的擴展名描述,請鍵入
CALL /?。
label是什么?這可不是命令label,它指的是標簽,標簽是啥?見例子
例:
@echo off
set /p pw=請輸入密碼:
if "%pw%"=="bathome" goto yes
goto :eof
rem 未定義的:eof會退出腳本文件
:yes
echo 密碼正確!
pause>nul
這是一個更加完整的密碼判斷,仔細閱讀并執行這行代碼,你知道標簽是什么了嗎,沒錯,那個:yes就是標簽了!
標簽的格式
:標簽名
關掉回顯以后你有沒有發現什么?沒錯,標簽所在的那一行沒有被執行,這就是為什么::比rem更快的原因了,但是標簽不能被使用在一個語句的內部,主要就是被括號括起來的語句(是的,被括號括起來的語句被看作一個整體),因此::的兼容性沒有rem那么好
附:"::"其實就是不規范的標簽名...
八.FOR
1.FOR
對一組文件中的每一個文件執行某個特定命令。
FOR%variableIN (set) DO command [command-parameters]
%variable 指定一個單一字母可替換的參數。
(set) 指定一個或一組文件??梢允褂猛ㄅ浞?。
command 指定對每個文件執行的命令。
command-parameters
為特定命令指定參數或命令行開關。
例:
@echo off
for %%i in (*.txt) do echo %%i
pause>nul
這段代碼會顯示當前文件夾下所有的txt文件
@echo off
for %%i in (菜 芽 小 公 主) do echo %%i
pause>nul
這段代碼會顯示
菜
芽
小
公
主
注:%%i為for輸出專用變量格式,其中i可以是a/A/0-z/Z/9和一些符號什么的(如! # 不過不建議使用),在cmd中只能用一個%
2.FOR /L
FOR /L %variable IN (start,step,end) DO command [command-parameters]
該集表示以增量形式從開始到結束的一個數字序列。
因此,(1,1,5) 將產生序列 1 2 3 4 5,(5,-1,1) 將產生
序列 (5 4 3 2 1)。
例:
@echo off
for /L %%a in (1 2 1000) do echo %%a
pause>nul
這個用法很簡單,沒有什么要講解的,從這段代碼主要是看出了逗號可以省略.當然還有一些稀奇古怪的用法為了防止新手弄混在這里就不講解了
3.FOR /R
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
檢查以 [drive:]path 為根的目錄樹,指向每個目錄中的
FOR 語句。如果在 /R 后沒有指定目錄,則使用當前
目錄。如果集僅為一個單點(.)字符,則枚舉該目錄樹。
這個命令同樣有一些看起來很奇怪的用法,為了防止新手迷糊就只講解基礎的
例:
@echo off
for /r C:\Windows\system32 %%i in (*) do echo %%i
pause>nul
這段代碼枚舉了C:\Windows\system32下所有的文件,包括子文件夾里的
4.FOR /D
FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,則指定與目錄名匹配,而不與文件
名匹配。
這個命令的用法和上面差不多,只不過是枚舉目錄名,不詳解了
5.FOR /F
for /f是一個非(喪)常(心)復(病)雜(狂)的命令...
讓我們從它的第一個用法來講:
FOR /F ["options"] %variable IN (file-set) DO command [command-parame]
例:
@echo off
echo 1,1 2,1 3,1 4,1>>test.txt
echo A1,2 2,2 3,2 4,2>>test.txt
echo 1,3 2,3 3,3 4,3>>test.txt
echo A1,4 2,4 3,4 4,4>>test.txt
rem 以上代碼在當前文件夾下生成了一個test.txt,打開看看?
For /F %%i In (test.txt) Do Echo %%i
pause>nul
For /F "tokens=2" %%i In (test.txt) Do Echo %%i
pause>nul
For /F "tokens=3" %%i In (test.txt) Do Echo %%i
pause>nul
For /F "tokens=4" %%i In (test.txt) Do Echo %%i
pause>nul
我想執行完這個bat,再分析一下結果和代碼,聰明的你一定了解了tokens的用處
for /f 默認以空格為分隔符,將每一行分割為幾個元素,而tokens就表示取第幾個元素.但假如我們要取的不是一個元素呢?需要全部顯示出來怎么辦?
tokens=* 表示取所有元素,用%%i輸出
tokens=1,2,3,4或tokens=1-4 然后用%%i或%%i,%%j,%%k,%%l 輸出
其實我們還有其他的方法,比如請出delims參數
例:
@echo off
rem test.txt已經有了,就不生成了
for /f "delims=*" %%i in (test.txt) do echo %%i
pause>nul
delims是個啥玩意兒?其實這就是分割符的設定,默認以空格為分隔符,你可以將分隔符設置成其他的,你的文本就不會被分割了,delims同樣支持多個分隔符,格式delims=第一個分隔符,第二個分隔符,第三個分隔符
啊哈,還有一個skip和eol,skip表示忽略前幾行,比如skip=10表示忽略這個文本的前十行,我這個文本只有4行,如果你加上skip=10的話就什么都不會輸出了
eol表示忽略以某個符號開頭的行,比如eol=A,當某一行的開頭是A的時候,這一行就不會被處理,不過支持設置一個符號
for /f同也可以處理字符串
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
字符串需要用雙引號引起來,其余用法一樣,不過這里就要講到usebackq參數了,for /f是支持處理多個文件的,文件直接用空格隔開(某些符號也可以),假如文件名中含有空格怎么辦呢?那好像只能用雙引號引起來了,但是用雙引號引起來會被識別成字符串的,這時就要請出usebackq參數了,加上這個參數,帶引號的字符串也會被識別為文件~
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
用for /f來處理命令執行的結果,命令要用單引號引起來
例:
@echo off
for /f "skip=3" %%i in ('tasklist') do echo;%%i
pause>nul
這段代碼就處理了命令ipconfig的執行結果,單獨鍵入tasklist看會出現什么?
================================================
~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
===================================================
這些不多說了,自己用for /r命令輸出的時候把%%i改成%%~nxi之類的試一試就理解了
九.批處理示例
1. IF-EXIST
1)
首先用記事本在C:\建立一個test1.bat批處理文件,文件內容如下:
@echo off
IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT
IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist
然后運行它:
C:\>TEST1.BAT
如果C:\存在AUTOEXEC.BAT文件,那么它的內容就會被顯示出來,如果不存在,批處理就會提示你該文件不存在。
2)
接著再建立一個test2.bat文件,內容如下:
@ECHO OFF
IF EXIST \%1 TYPE \%1
IF NOT EXIST \%1 ECHO \%1 does not exist
執行:
C:\>TEST2 AUTOEXEC.BAT
該命令運行結果同上。
說明:
(1) IF EXIST 是用來測試文件是否存在的,格式為
IF EXIST [路徑+文件名] 命令
(2) test2.bat文件中的%1是參數,DOS允許傳遞9個批參數信息給批處理文件,分別為%1~%9(%0表示test2命令本身) ,這有點象編程中的實參和形參的關系,%1是形參,AUTOEXEC.BAT是實參。
(3) 更進一步的,建立一個名為TEST3.BAT的文件,內容如下:
@echo off
IF "%1" == "A" ECHO XIAO
IF "%2" == "B" ECHO TIAN
IF "%3" == "C" ECHO XIN
如果運行:
C:\>TEST3 A B C
屏幕上會顯示:
XIAO
TIAN
XIN
如果運行:
C:\>TEST3 A B
屏幕上會顯示
XIAO
TIAN
在這個命令執行過程中,DOS會將一個空字符串指定給參數%3。
2、IF-ERRORLEVEL
建立TEST4.BAT,內容如下:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:IF ERRORLEVEL 1 ECHO 文件拷貝失敗
IF ERRORLEVEL 0 ECHO 成功拷貝文件
然后執行文件:
C:\>TEST4
如果文件拷貝成功,屏幕就會顯示“成功拷貝文件”,否則就會顯示“文件拷貝失敗”。
IF ERRORLEVEL 是用來測試它的上一個DOS命令的返回值的,注意只是上一個命令的返回值,而且返回值必須依照從大到小次序順序判斷。因此下面的批處理文件是錯誤的:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:\
IF ERRORLEVEL 0 ECHO 成功拷貝文件
IF ERRORLEVEL 1 ECHO 未找到拷貝文件
IF ERRORLEVEL 2 ECHO 用戶通過ctrl-c中止拷貝操作
IF ERRORLEVEL 3 ECHO 預置錯誤阻止文件拷貝操作
IF ERRORLEVEL 4 ECHO 拷貝過程中寫盤錯誤
無論拷貝是否成功,后面的:
未找到拷貝文件
用戶通過ctrl-c中止拷貝操作
預置錯誤阻止文件拷貝操作
拷貝過程中寫盤錯誤
都將顯示出來。