關于批處理以及批處理常用指令的總結
【 一、什麼是批處理 】
批處理檔案圖示 批處理(Batch),也稱為批處理腳本。顧名思義,批處理就是對某對象進行批量的處理。批處理檔案的擴充名為 bat 。
目前比較常見 的批處理包含兩類:DOS批處理和PS批處理。PS批處理是基于強大的圖檔編輯軟體Photoshop的,用來批量處理圖檔的腳本;而DOS批處理則是基于DOS指令的,用來自動地批量地執行DOS指令以實作特定操作的腳本。這裡要講的就是DOS批處理。
批處理是一種簡化的腳本語言,它應用于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指令或出錯意外退出。
【 二、簡單批處理指令簡介 】
【 echo 指令 】
打開回顯或關閉請求回顯功能,或顯示消息。如果沒有任何參數,echo 指令将顯示目前回顯設定。
文法
echo [{on|off}] [message]
Sample:@echo off / echo hello world
在實際應用中我們會把這條指令和重定向符号(也稱為管道符号,一般用> >> ^)結合來實作輸入一
些指令到特定的檔案中。
【 rem 指令 】
注釋指令,類似于在C語言中的/*--------*/,它并不會被執行,隻是起一個注釋的作用,便于别人閱讀
和你自己日後修改。
Rem Message
Sample:@Rem Here is the description.
【 pause 指令 】
暫停指令。運作 Pause 指令時,将顯示下面的消息:
Press any key to continue. . .(或:請按任意鍵繼續. . .)
Sample:
@echo off
:begin
copy G:*.* d:/back
echo 請插入另一張CD光牒...
pause
goto begin
在這個例子中,驅動器 G 中磁盤上的所有檔案均複制到d:/back中。顯示的注釋提示您将另一張CD光牒
盤放入驅動器 G 時,pause 指令會使程式挂起,以便您更換CD光牒,然後按任意鍵繼續處理。
【 call 指令 】
從一個批處理程式調用另一個批處理程式,并且不終止父批處理程式。call 指令接受用作調用目标的
标簽。如果在腳本或批處理檔案外使用 Call,它将不會在指令行起作用。
文法
call [[Drive:][Path] FileName ] [:label [arguments]]
參數
[Drive:}[Path] FileName
指定要調用的批處理程式的位置和名稱。
【 start 指令 】
調用外部程式,所有的DOS指令和指令行程式都可以由start指令來調用。
如:start calc.exe 即可打開Windows的電腦。
常用參數:
MIN 開始時視窗最小化
SEPARATE 在分開的空間内開始 16 位 Windows 程式
HIGH 在 HIGH 優先級類别開始應用程式
REALTIME 在 REALTIME 優先級類别開始應用程式
WAIT 啟動應用程式并等候它結束
parameters 這些為傳送到指令/程式的參數
執行的應用程式是 32-位 GUI 應用程式時,CMD.EXE 不等應用程式終止就傳回指令提示。如果在指令
腳本内執行,該新行為則不會發生。
【 goto 指令 】
跳轉指令。程式指針跳轉到指定的标簽,從标簽後的第一條指令開始繼續執行批處理程式。
文法:goto label (label是參數,指定所要轉向的批處理程式中的行。)
Sample:
if {%1}=={} goto noparms
if {%2}=={} goto noparms(如果這裡的if、%1、%2你不明白的話,先跳過去,後面會有詳細的解釋
。)
@Rem check parameters if null show usage
:noparms
echo Usage: monitor.bat ServerIP PortNumber
goto end
标簽的名字可以随便起,但是最好是有意義的字母啦,字母前加個:用來表示這個字母是标簽,goto
指令就是根據這個:來尋找下一步跳到到那裡。最好有一些說明這樣你别人看起來才會了解你的意圖啊。
【 set 指令 】
顯示、設定或删除變量。
顯示變量:set 或 set s 前者顯示批處理目前已定義的所有變量及其值,後者顯示所有以s開頭的變量及值。
設定變量:set aa=abcd 此句指令便可向變量aa指派abcd。如果變量aa已被定義,則aa的值被修改為abcd;若aa尚未定義,則此句指令即可定義新的變量aa,同時為變量aa賦予初始值abcd。
删除變量:set aa= 此句指令即可删除變量aa。若變量aa已被定義,則删除變量aa;若aa尚未定義,則此句指令為實質意義。
需要說明的是,批進行中的變量是不區分類型的,不需要像C語言中的變量那樣還要區分int、float、char等。比如執行set aa=345後,變量aa的值既可以被視為數字345,也可以被視為字元串345。
set指令具有擴充功能,如用作互動輸入、字元串處理、數值計算等,屬于進階指令範疇。
【 三、批處理符号簡介 】
【 回顯屏蔽 @ 】
表示不顯示@後面的指令,在入侵過程中(例如使用批處理來格式化敵人的硬碟)自然不能讓對方看到你使用的指令啦。
@用法舉例:通過運作批處理檔案對比pause和@pause指令即可明了@的效果。
【 重定向1 >與>> 】
将輸出資訊重定向到指定的裝置或檔案。系統預設輸出到顯示器。
如:echo aaaaa>a.txt 即可将本在顯示器上顯示的資訊aaaaa輸出到檔案a.txt中,螢幕上沒有任何顯示。如果檔案a.txt本來已經存在,該指令将首先擦除a.txt中的所有資訊,然後寫入資訊aaaaa;若a.txt本來就不存在,該指令即可建立一個a.txt檔案,并寫入資訊aaaaa。
echo aaaaa>>a.txt 類似于echo aaaaa>a.txt。差別在于:如果a.txt本已存在,>a.txt會擦除a.txt中的原有内容,而>>a.txt并不擦除原有内容,僅在a.txt檔案的末尾添加資訊aaaaa。a.txt不存在時,二者沒有差别。
【 重定向2 < 】
将輸入資訊來源重定向為指定的裝置或檔案。系統預設從顯示器讀取輸入資訊。
重定向使用舉例:
=========================================
@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
=========================================
讀者觀察指令與輸出即可體會到重定向的功能和效果。
【 管道符号 | 】
将管道符号前面指令的輸出結果重定向輸出到管道符号後面的指令中去,作為後面指令的輸入。使用格式為:command_1|command_2
管道符号使用舉例:
=========================================
@echo off
echo aaaa>a.txt
del /p a.txt
pause
=========================================
@echo off
echo aaaa>a.txt
echo y|del /p a.txt
pause
=========================================
對比以上兩個批處理執行結果,讀者即可明白管道符的用法和效果。
需要說明的是,上面del指令添加開關/p隻是為了讓讀者明白管道符号的使用方法,實際删除檔案時不加/p開關即可實作無提示直接删除。
【 轉義符 ^ 】
将特殊符号轉化為一般符号,即剝離特殊符号的特殊地位。特殊符号指:| & > <
比如,如果我們想輸出符号“>”,直接用指令 echo > 是不行的,必須修改為 echo ^> 。其餘幾個特殊符号類似需要有同樣的處理。
轉義字元使用舉例:
=========================================
@echo off
echo aaaa>a.txt
echo 第一句echo執行完畢
echo aaaa^>a.txt
echo 第二句echo執行完畢
pause
=========================================
比較上面的兩句echo,第一句echo将資訊aaaa輸出到了檔案a.txt,而第二句echo則在直接螢幕上顯示除aaaa>a.txt
【 邏輯指令符 】
邏輯指令符包括:&、&&、||
&-無條件執行&符号後面的指令;
&&-當&&前面的指令成功執行時,執行&&後面的指令,否則不執行;
||-當||前面的指令失敗時,執行||後面的指令,否則不執行。
=========================================
@echo off
echo ^|^|
reg add HKCU /v try /f||echo **成功**
reg add HKCU1 /v try /f||echo **失敗**
echo ^&^&
reg delete HKCU /v try /f&&echo **成功**
reg delete HKCU /v try /f&&echo **失敗**
echo ^&
reg delete HKCU /v try /f&echo **成功**
reg delete HKCU /v try /f&echo **失敗**
pause
=========================================
執行reg add或reg delete後,系統會給出執行結果;我們通過echo指令也給出了“執行結果”。對比系統和我們自己給出的結果,既可以驗證邏輯指令的判斷機理。
【 四、常用DOS指令 】
【 檔案夾管理 】
cd 顯示目前目錄名或改變目前目錄。
md 建立目錄。
rd 删除一個目錄。
dir 顯示目錄中的檔案和子目錄清單。
tree 以圖形顯示驅動器或路徑的檔案夾結構。
path 為可執行檔案顯示或設定一個搜尋路徑。
xcopy 複制檔案和目錄樹。
【 檔案管理 】
type 顯示文本檔案的内容。
copy 将一份或多份檔案複制到另一個位置。
del 删除一個或數個檔案。
move 移動檔案并重命名檔案和目錄。(Windows XP Home Edition中沒有)
ren 重命名檔案。
replace 替換檔案。
attrib 顯示或更改檔案屬性。
find 搜尋字元串。
fc 比較兩個檔案或兩個檔案集并顯示它們之間的不同
【 網絡指令 】
ping 進行網絡連接配接測試、名稱解析
ftp 檔案傳輸
net 網絡指令集及使用者管理
telnet 遠端登陸
ipconfig顯示、修改TCP/IP設定
msg 給使用者發送消息
arp 顯示、修改區域網路的IP位址-實體位址映射清單
【 系統管理 】
at 安排在特定日期和時間運作指令和程式
shutdown立即或定時關機或重新開機
tskill 結束程序
taskkill結束程序(比tskill進階,但WinXPHome版中無該指令)
tasklist顯示程序清單(Windows XP Home Edition中沒有)
sc 系統服務設定與控制
reg 系統資料庫控制台工具
powercfg控制系統上的電源設定
對于以上列出的所有指令,在cmd中輸入指令+/?即可檢視該指令的幫助資訊。如find /?
【 五、語句結構 】
類似于C語言,批處理也有它的語句結構。批處理的語句結構主要有選擇結構(if語句)、循環結構(for語句)等。
【 if語句(選擇結構) 】
if語句實作條件判斷,包括字元串比較、存在判斷、定義判斷等。通過條件判斷,if語句即可以實作選擇功能。
1、字元串比較
if語句僅能夠對兩個字元(串)是否相同、先後順序進行判斷等。其指令格式為:
IF [not] string1 compare-op string2 command1 [else command2]
其中,比較操作符compare-op有以下幾類:
== - 等于
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
選擇開關/i則不區分字元串大小寫;選擇not項,則對判斷結果進行邏輯非。
字元串比較示例:
===============================================
@echo off
set str1=abcd1233
set str2=ABCD1234
if %str1%==%str2% (echo 字元串相同!) else (echo 字元串不相同!)
if /i %str1% LSS %str2% (echo str1^<str2) else (echo str1^>=str2)
echo.
set /p choice=是否顯示目前時間?(y/n)
if /i not %choice% EQU n echo 目前時間是:%date% %time%
pause>nul
===============================================
對于最後一個if判斷,當我們輸入n或N時的效果是一樣的,都不會顯示時間。如果我們取消開關/i,則輸入N時,依舊會顯示時間。
另外請注意一下幾個細節:1-echo str1^<str2和echo str1^>=str2;2-echo.。
2、存在判斷
存在判斷的功能是判斷檔案或檔案夾是否存在。其指令格式為:
IF [NOT] EXIST filename command1 [else command2]
===============================================
@echo off
if exist %0 echo 檔案%0是存在的!
if not exist %~df0 (
echo 檔案夾%~df0不存在!
) else echo 檔案夾%~df0存在!
pause>nul
===============================================
這裡注意幾個地方:
1-存在判斷既可以判斷檔案也可以判斷檔案夾;
2-%0即代表該批處理的全稱(包括驅動器盤符、路徑、檔案名和擴充類型);
3-%~df0是對%0的修正,隻保留了其驅動器盤符和路徑,詳情請參考for /?,屬進階批處理範疇;
4-注意if語句的多行書寫,多行書寫要求command1的左括号必須和if在同一行、else必須和command1的右括号同行、command2的左括号必須與else同行、command1和command2都可以有任意多行,即command可以是指令集。
3、定義判斷
定義判斷的功能是判斷變量是否存在,即是否已被定義。其指令格式為:
IF [not] DEFINED variable command1 [else command2]
存在判斷舉例:
===============================================
@echo off
set var=111
if defined var (echo var=%var%) else echo var尚未定義!
set var=
if defined var (echo var=%var%) else echo var尚未定義!
pause>nul
===============================================
對比可知,"set var="可以取消變量,收回變量所占據的記憶體空間。
【 for語句(循環結構) 】
for語句可以實作類似于C語言裡面的循環結構,當然for語句的功能要更強大一點,通過不同的開關可以實作更多的功能。for語句有多個開關,不同開關将會實作不同的功能。
1、無開關
無開關的for語句能夠對設定的範圍内進行循環,是最基本的for循環語句。其指令格式為:
FOR %%variable IN (set) DO command
其中,%%variable是批處理程式裡面的書寫格式,在DOS中書寫為%variable,即隻有一個百分号(%);set就是需要我們設定的循環範圍,類似于C語言裡面的循環變量;do後面的command就是循環所執行的指令,即循環體。
無開關for語句舉例:
===============================================
@echo off
for %%i in (a,"b c",d) do echo %%i
pause>nul
===============================================
2、開關/L
含開關/L的for語句,可以根據set裡面的設定進行循環,進而實作對循環次數的直接控制。其指令格式為:
FOR /L %%variable IN (start,step,end) DO command
其中,start為開始計數的初始值,step為每次遞增的值,end為結束值。當end小于start時,step需要設定為負數。
含開關/L的for語句舉例(建立5個檔案夾):
===============================================
@echo off
for /l %%i in (1,2,10) do md %%i
pause
===============================================
上例将建立5個檔案夾,檔案夾名稱依次為1、3、5、7、9。可以發現,%%i的結束值并非end的值10,而是不大于end的一個數。
3、開關/F
含開關/F的for語句具有最強大的功能,它能夠對字元串進行操作,也能夠對指令的傳回值進行操作,還可以通路硬碟上的ASCII碼檔案,比如txt文檔等。其指令格式為:
FOR /F ["options"] %%variable IN (set) DO command
其中,set為("string"、'command'、file-set)中的一個;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一個或多個的組合。各選項的意義參見for /f。一般情況下,使用較多的是skip、tokens、delims三個選項。
含開關/F的for語句舉例:
===============================================
@echo off
echo **No Options:
for /f %%a in ("1,2,10") do echo a=%%a
echo **Options tokens ^& delims:
for /f "tokens=1-3 delims=," %%a in ("1,2,10") do echo a=%%a b=%%b c=%%c
pause
===============================================
@echo off
echo 本檔案夾裡面的檔案有:
for /f "skip=5 tokens=3* delims= " %%a in ('dir') do (
if not "%%a"=="<DIR>" if not "%%b"=="位元組" if not "%%b"=="可用位元組" echo %%b
)
pause
===============================================
@echo off
echo 本檔案夾裡面的檔案有:
dir>c:/file.txt
for /f "skip=5 tokens=3* delims= " %%a in (c:/file.txt) do (
if not "%%a"=="<DIR>" if not "%%b"=="位元組" if not "%%b"=="可用位元組" echo %%b
)
del c:/file.txt
pause
===============================================
對于後面的兩個例子,其中options裡面的delims= 是可以删除的,因為隻要添加了/F開關系統就将delims的值預設為空格。
符号字元串中的最後一個字元星号,
那麼額外的變量将在最後一個符号解析之後
配置設定并接受行的保留文本。本例中也可以改為4,不過檔案名中有空格的檔案,隻能顯示空格以前部分
同時我們也看到了,for語句的do後面的command也是可以分行的,隻需要保證command的左括号和do在同一行就可以了。
4、開關/D或/R
含開關/D或/R的for語句是與目錄或檔案有關的指令,一般情況下很少使用。含開關/R的指令有時候被用于通過周遊檔案夾來查找某一個檔案或檔案夾,故而列舉此例。
含開關/R的for語句舉例(檔案夾周遊):
===============================================
@echo off
setlocal enabledelayedexpansion
FOR /R d: %%i IN (.) DO (
set dd=%%i
set "dd=!dd:~0,-1!"
echo !dd!
)
pause
exit
===============================================
上例即可以羅列出D盤下的所有檔案夾,其速度要比指令"tree d:"慢多了,不過其傳回結果的實用性則遠遠超過了tree指令。
一般情況下我們不推薦通過周遊檔案夾來查找檔案,特别是在查找某些程式(比如QQ.exe)的位置時。推薦通過reg指令查找系統資料庫來查找QQ的路徑,以保證查找效率。
上例中也出現了幾個新面孔,如setlocal、感歎号等。其中,感歎号其實就是變量百分号(%)的強化版。之是以要用!而不用%,是因為在for循環中,當一個變量被多次指派時,%dd%所擷取的僅僅是dd第一次被賦予的值;要想重新整理dd的值,就必須首先通過指令"setlocal enabledelayedexpansion"來開啟延遲變量開關,然後用!dd!來擷取dd的值。
for語句是批處理裡面功能最強大、使用最普遍卻又最難掌握的一套指令,這也是批處理菜鳥和批處理高手最明顯的一個分水嶺,一旦掌握了這套指令,那麼你就離批處理達人不遠了!
【 六、字元串處理 】
批處理有着具有非常強大的字元串處理能力,其功能絕不低于C語言裡面的字元串函數集。批進行中可實作的字元串處理功能有:截取字元串内容、替換字元串特定字段、合并字元串、擴充字元串等功能。下面對這些功能一一進行講解。
【 1、截取字元串 】
截取字元串可以說是字元串處理功能中最常用的一個子功能了,能夠實作截取字元串中的特定位置的一個或多個字元。舉例說明其基本功能:
=========================================
@echo off
set ifo=abcdefghijklmnopqrstuvwxyz0123456789
echo 原字元串(第二行為各字元的序号):
echo %ifo%
echo 123456789012345678901234567890123456
echo 截取前5個字元:
echo %ifo:~0,5%
echo 截取最後5個字元:
echo %ifo:~-5%
echo 截取第一個到倒數第6個字元:
echo %ifo:~0,-5%
echo 從第4個字元開始,截取5個字元:
echo %ifo:~3,5%
echo 從倒數第14個字元開始,截取5個字元:
echo %ifo:~-14,5%
pause
=========================================
當然,上面的例子隻是将字元串處理的基本功能展示出來了,還看不出字元串處理具體有什麼用處。下面這個例子是對時間進行處理。
=========================================
@echo off
echo 目前時間是:%time% 即 %time:~0,2%點%time:~3,2%分%time:~6,2%秒%time:~9,2%厘秒
pause
=========================================
【 2、替換字元串 】
替換字元串,即将某一字元串中的特定字元或字元串替換為給定的字元串。舉例說明其功能:
=========================================
@echo off
set aa=偉大的中國!我為你自豪!
echo 替換前:%aa%
echo 替換後:%aa:中國=中華人民共和國%
echo aa = %aa%
set "aa=%aa:中國=中華人民共和國%"
echo aa = %aa%
pause
=========================================
對于上面的例子有一點說明,對比兩個echo aa = %aa%可以發現,如果要修改變量aa的内容的話,就需要将修改結果“%aa:中國=中華人民共和國%”指派給變量aa。上面的字元串截取也有着同樣的特點。
【 3、字元串合并 】
其實,合并字元串就是将兩個字元串放在一起就可以了。舉例說明:
=========================================
@echo off
set aa=偉大的中國!
set bb=我為你自豪!
echo %aa%%bb%
echo aa=%aa%
echo bb=%bb%
set "aa=%aa%%bb%"
echo aa=%aa%
pause
=========================================
同樣,如果要改變變量aa的内容的話,就需要将合并結果“%aa%%bb%”指派給變量aa。
【 4、擴充字元串 】
“擴充”這個詞彙來自于微軟自己的翻譯,意思就是對表示檔案路徑的字元串進行特殊的處理,具體功能羅列如下:
=========================================
~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 /?幫助資訊。其中的I代表變量I,不過需要說明的是,不是所有的變量都能夠進行擴充的,有兩個條件: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語句,for語句裡面的變量就是用%x來表示的,因而可以直接進行擴充。
【 七、數值計算 】
批處理裡面的數值計算功能較弱,隻能夠進行整型計算,忽略浮點數的小數部分;同時數值計算的範圍也受限于系統位數,對于目前較為常見的32位機來說,數值計算能處理的數值範圍為0x80000000h~0x7FFFFFFFh,即-2147483648~+2147483647。
數值計算需要使用set指令,具體格式為“set /a expression”。其中,expression代表計算表達式,計算表達式跟C語言裡面的表達式基本上完全一緻。set支援的運算符也跟C語言裡面的一樣,隻是沒有了増一減一。set支援的運算符及優先級排序如下:
=========================================
() - 分組
! ~ - - 一進制運算符(邏輯非、按位非、取負)
* / % - 算數運算符(乘、除得商、除得餘數,即取餘)
+ - - 算數運算符(加、減)
<< >> - 邏輯移位(左移一位、右移一位)
& - 按位“與”
^ - 按位“異”
| - 按位“或”
= *= /= %= += -= - 指派
&= ^= |= <<= >>=
, - 表達式分隔符(set可一次處理多個表達式)
=========================================
我們知道,批進行中取變量的值是需要用%或者!的,而在set /a 中,直接用變量名稱即可取得變量的值。另外,set支援八進制(數字字首0)、十進制(數字無字首)和十六進制(數字字首0x),且支援不同進制之間的計算,如set /a a=123+0123+0x123,計算及顯示結果為十進制。
【 八、概念方法 】
本節學習有關批處理的一些比較瑣碎、但又比較有價值的一些知識,運用這些知識後,才有條件更好的實作的批處理的功能,并能使批處理擺脫黑白世界而顯得更加多姿多彩。廢話少說,開講啦~
【(一)環境變量 】
所謂“環境變量”,實際上就是C語言裡面的“變量”的意思。批處理的變量可以分為兩類,由系統定義的系統變量和由使用者根據需要自定義的使用者變量。
【 1、系統變量 】
批處理的一些變量是由作業系統事先定義好的,可以适用于任何批處理,我們稱這些特殊的變量為“系統變量”。系統變量有很多個,包括硬體類、作業系統類、檔案路徑類、系統時間類等。要檢視所有的系統變量,請新打開一個cmd視窗,輸入set回車即可。對幾個比較常用的變量解釋如下:
ComputerName 計算機名,即右鍵 我的電腦--屬性--計算機名 頁籤中的“完整的計算機名稱”
ComSpec cmd.exe完整路徑名
HomeDrive 系統分區盤符,一般都是C槽,故而HomeDrive=C:
Path 可執行檔案預設搜尋路徑。這個東東非常重要!待會兒單獨講解…
ProgramFiles 就是系統的Program Files的路徑啦,一般都是C:/Program Files,這就是安裝軟體時預設的安裝路徑了
Prompt 個性化設定cmd提示符的必備武器!不過,我沒怎麼用過~
SystemDrive 包含系統根目錄的分區,其實就是HomeDrive了
SystemRoot 系統根目錄路徑,一般都是C:/WINDOWS
Temp、Tmp 檔案、程式等可使用的臨時目錄,預設是C:/WINDOWS/Temp或Tmp。幾乎所有的程式在運作時都會在這個目錄裡面“臨時”寫入檔案。一般情況下,程式寫入的臨時檔案都應該被該程式删除,可惜的是,大部分的程式都很健忘,導緻這個檔案夾占據的空間越來越大,自然也就使我們的系統增肥喽。是以,我們要把它修改到其他分區,并且時時的清理裡面的臨時檔案。
UserName 目前使用者名,即所登陸的賬戶名
UserProfile 目前使用者的配置目錄,一般都是C:/Documents and Settings/%UserName%。預設情況下,我們的桌面就是這個目錄下面的“桌面”檔案夾;我的檔案就是這個目錄下面的“My Documents”檔案夾。是以啦,往桌面上或我的檔案裡面放東西就是放到這個檔案夾下面了,也就是放到C槽了,重裝系統時要覆寫C槽内容的,是以桌面上或我的檔案裡面的東西當然就會Gone with the Wind了~解決方法有兩個,一是保持良好的習慣,不把重要檔案放到這兩個地方;二是,修改預設設定,将這兩個檔案夾都移到其他分區。
WinDir 作業系統路徑,其實就是SystemRoot了
【 2、使用者變量 】
編寫批處理程式時,使用者根據需要自己定義的變量稱之為使用者變量。使用者變量類似于C語言裡面的變量,僅僅在定義該變量的程式中有效。
使用者變量由set指令定義,這是批進行中非常非常重要的一個操作,進而使set指令成為批處理裡面使用頻率最高的幾個指令之一。關于set指令的使用,參考set /?,本教程也會在後面對其進行講解。
【 3、變量引用 】
前面的幾節課裡面,我們已經看到了如何引用變量,即直接用變量名操作變量,通過"%"或"!"來擷取變量的值。其中,隻有在for語句裡面重複對同一變量多次指派時才需要使用"!",并且在使用"!"調用變量時,要首先“啟用延遲環境變量擴充”,啟動指令為:SetLocal EnableDelayedExpansion。另外需要說明的是,“啟用延遲環境變量擴充”後,所有的"!"都将被視為“取變量值”的特殊符号,即使用"^!"也不能輸出符号"!"。若要輸出"!",則需要“停用延遲環境變量擴充”,指令為:SetLocal DisableDelayedExpansion
【(二)參數 】
跟C語言類似,在調用函數或其他批處理時可能需要傳遞參數。批處理的參數傳遞分為直接和間接兩種傳遞參數的方法。
【 1、直接傳遞 】
直接傳遞參數,即在使用call指令時,不使用任何參數,在子函數或子批處理裡面直接對主函數(也稱父批處理)裡面的變量進行修改。這跟彙編語言裡面的參數傳遞方式類似。
直接傳遞參數舉例:
===============================================
@echo off
setlocal enabledelayedexpansion
set var=aCdehiM,?mnrstW y
echo %var%
call :deal
setlocal disabledelayedexpansion
set var=%var:?=!%
echo %var%
pause>nul
exit
:deal
set tm=!var!
set var=
for %%i in (6,3,11,11,16,15,1,4,11,5,12,13,9,0,12,7,15,14,5,10,2,16,18,8) do (
set var=!var!!tm:~%%i,1!
)
goto :eof
===============================================
可以發現,當我們把變量var作為參數賦予子函數:deal後,子函數對var的值進行了修改;當子函數傳回後,主函數裡面的var的值就已經是子函數裡面var被修改後的值了。
該例子中,使用了本節課前面講到的setlocal enabledelayedexpansion和setlocal disabledelayedexpansion,前者保證了var在for循環裡面能夠根據我們的意願進行處理,後者保證了能夠正确輸出符号"!"。另外例子中還使用了指令set,利用set對字元串進行了處理。還有一個地方使用了語句goto :eof,該語句相當于C語言裡面的return或彙編語言裡面的RET,即子程式傳回指令。需要說明的是,當子函數本身就在批處理檔案的末尾的話,我們是可以省略這句話的,比如将此例的goto :eof删除是不會産生任何影響的。
【 2、間接傳遞 】
間接傳遞參數,即在使用call指令時,在其後面添加參數,形如call {[:label][ChildBatch]} Parameter1 Parameter2 ... ParameterN。這跟C語言裡面傳遞參數的格式類似。不同于C語言,批進行中的子函數不需要定義形參,更不需要指定參數的個數。傳遞過來的參數,在子函數或子批處理裡面是以%1~%9的形式表示的,即%1~%9分别表示傳遞過來的第1~9個參數。
===============================================
@echo off
call :deal aaa bbb "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
===============================================
通過這個例子就可以清晰的看到%n參數表示法的用法。參數清單中包含空格的依舊要用雙引号(")引起來;另外,也可以看到,%0已經變成了子函數的标号了,而不是父批處理的檔案名全稱。
【 3、差別 】
這兩種參數傳遞方法本質上是沒有差別的,形式上,直接傳遞直接對原變量進行操作,丢失了原變量的值;間接傳遞則通過%n對原變量進行了簡單的備份,并且通用性更強,即不限定原變量的名稱。另外,使用%n還有一個非常大的好處,就是可以通過%~*i來加強處理變量的能力。關于%~*i,詳細内容參見for /?。
針對二者的差别,可以根據情況決定使用哪種傳遞方式:
--1、作為參數的變量名固定、且在子函數中不需要對其進行備份的情況下,使用直接傳遞法;
--2、若将子函數作為一個通用的程式子產品,以适應于對不同變量的處理,或者作為參數的變量不需要備份時,使用間接傳遞法。
具體使用哪種方法,還需根據實際情況或使用習慣進行選擇。
【(三)傳回值 】
有些指令在執行之後将會傳回一定的錯誤值(errorlevel),可以通過errorlevel的值判斷指令執行的狀況。這點類似于C語言裡面的exit(num),num就是錯誤代碼。
擷取傳回值errorlevel的方法就是,在執行指令後,立馬調用傳回值errorlevel,如echo %errorlevel%或者if %errorlevel%==1等指令。
errorlevel舉例:
===============================================
@echo off
reg add HKCU /v try /f>nul
reg delete HKCU /v try /f
if errorlevel 0 (echo 删除成功!) else (echo 删除失敗!)
reg delete HKCU /v try /f
if %errorlevel%==0 (echo 删除成功!) else (echo 删除失敗!)
pause>nul
===============================================
上面例子中,由于第一成功的删除了系統資料庫,導緻第二次因為找不到系統資料庫而宣告失敗。同時我們也看到了errorlevel的使用方法,即if errorlevel 0和if %errorlevel%==0是一樣的。也許你注意到了,裡面還有個笑臉呢~O(∩_∩)O哈哈~這就是ASCII碼啦,後面跟你講啊…
一般情況下,程式或指令成功執行時,傳回的errorlevel是0,錯誤時傳回1或更高的值。當然,有些指令是沒有傳回值的,這點需要注意。
嗯,有沒有想起前面有個類似的東西啊?對了,那就是||和&&了,這兩個符号就是根據errorlevel的值來進行邏輯判斷的~
【(四)使用者互動 】
批處理,黑框白字是它最著名的特征。雖然當初DOS為人們使用計算機做出了莫大的貢獻,但在Windows盛行的今天,人們已經疏遠并且懼怕那個黑色的視窗了。微軟為了讓先天有着批量處理“體力活”能力的DOS避免“冷酷”,便于接近,特意提供了幾個小指令,加強批處理的使用者互動功能。
【 1、視窗 】
首先我們要DIY它的視窗。使用指令:color、mode、msg。
--1、設定視窗背景色和字型顔色by color。詳細内容參見color /?。
--2、設定視窗大小by "MODE CON [COLS=c] [LINES=n]",cols即寬度,lines即高度。
--3、GUI互動視窗by msg。詳細内容參見msg /?。
視窗DIY舉例:
===============================================
@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
===============================================
【 2、聲音 】
呵呵,是不是注意到了批處理沒有聲音呐?閑話不說,直接做實驗吧 ^_^
===============================================
@echo off
echo 做好準備,響了啊!!
pause
cls
echo
echo 怎麼樣?呵呵,刺激吧~
pause
cls
mshta vbscript:createobject("sapi.spvoice").speak("Merry Christmas and Happy New Year!")(window.close)
pause
===============================================
speak好像不能講中文呐~
■●●●●
此處錯誤,如果tts安裝了中文引擎是可以講中文的。
此外,這個就是調用vbs的方法:vbscript:createobject("sapi.spvoice").speak("Merry Christmas and Happy New Year!")
●●●●■
【 3、控制 】
在運作批處理的過程中,我們如何幹預批處理呢?呵呵,直接點叉叉就可以結束它了!嗯,不錯,不過,太野蠻了~
--1、暫停批處理:直接按鍵盤上的Pause鍵喽
--2、終止批處理:組合鍵Ctrl+C。不過,有時候它好像響應的不太積極啊…
【(五)ASCII碼 】
前面的例子中,我們已經使用過一次ASCII碼了,也就是那個笑臉。ASCII碼是圖形化的符号,可以用來點綴我們的批處理的。
在cmd視窗中我們可以通過任意一個字元的ASCII碼來輸入該字元,比如Ctrl+G、Ctrl+N等,字母a-z對應ASCII碼的1-26。對于ASCII碼大于26的字元,可以通過這個方法來輸入:按住Alt鍵不松,通過小鍵盤輸入ASCII碼的十進制值,松開Alt鍵即可。
批處理常用指令及用法大全
閱讀下面文字需要一定的dos基礎概念,象:盤符、檔案、目錄(檔案夾)、子目錄、根目錄、目前目錄
每個指令的完整說明請加 /? 參數參考微軟的幫助文檔可以看到,在 /? 幫助裡,"指令擴充名"一詞會經常出現"指令擴
展名"是指相對于win98的dos版本而言,每個指令新增的功能
指令測試環境win2000proSP4win98的指令功能太少,就不作研究了
注:如果對某一指令還不是很熟悉,可以在指令行視窗下輸入:指令名/?的方式來獲得幫助。
例如:對dir指令的應用不熟悉,可以在指令行視窗下輸入:
dir /?
1 echo 和 @回顯控制指令
@ #關閉單行回顯
echo off #從下一行開始關閉回顯
@echo off #從本行開始關閉回顯。一般批處理第一行都是這個
echo on #從下一行開始打開回顯
echo #顯示目前是 echo off 狀态還是 echo on 狀态
echo. #輸出一個"回車換行",一般就是指空白行
echo hello world #輸出hello world
"關閉回顯"是指運作批處理檔案時,不顯示檔案裡的每條指令,隻顯示運作結果批處理開始和結束時,系統都會自動打開
回顯
2 errorlevel程式傳回碼
echo %errorlevel%每個指令運作結束,可以用這個指令行格式檢視傳回碼用于判斷剛才的指令是否執行成功預設值為0,
一般指令執行出錯會設 errorlevel 為1
3 dir顯示目錄中的檔案和子目錄清單
dir #顯示目前目錄中的檔案和子目錄
dir /a #顯示目前目錄中的檔案和子目錄,包括隐藏檔案和系統檔案
dir c: /a:d #顯示 C 盤目前目錄中的目錄
dir c:/ /a:-d #顯示 C 盤根目錄中的檔案dir d:/mp3 /b/p #逐屏顯示 d:/mp3 目錄裡的檔案,隻顯示檔案
名,不顯示時間和大小
dir *.exe /s顯示目前目錄和子目錄裡所有的.exe檔案其中 * 是通配符,代表所有的檔案名,還一個通配符 ? 代表一個
任意字母或漢字如 c*.* 代表以 c 開頭的所有檔案?.exe 代表所有檔案名是一個字母的.exe檔案如果指定的目錄或檔案
不存在,将傳回 errorlevel 為1;每個檔案夾的 dir 輸出都會有2個子目錄 . 和 ... 代表目前目錄.. 代表目前目錄的
上級目錄
dir . #顯示目前目錄中的檔案和子目錄
dir .. #顯示目前目錄的上級目錄中的檔案和子目錄
其它參數可參考 dir /?
4 cd更改目前目錄
cd mp3 #進入目前目錄中的mp3 目錄
cd .. #進入目前目錄中的上級目錄
cd/ #進入根目錄
cd #顯示目前目錄
cd /d d:/mp3 #可以同時更改盤符和目錄
cd "Documents and Settings"/All users檔案名帶空格,路徑前需要加上引号!!如果更改到的目錄不存在,則出錯返
回 errorlevel=1
5 md建立目錄
md abc #在目前目錄裡建立子目錄 abc
md d:/a/b/c #如果 d:/a 不存在,将會自動建立
6 rd删除目錄
rd abc #删除目前目錄裡的 abc 子目錄,要求為空目錄
rd /s/q d:/temp #删除 d:/temp 檔案夾及其子檔案夾和檔案,不需要按 Y 确認
7 del删除檔案
del d:/test.txt #删除指定檔案,不能是隐藏、系統、隻讀檔案
del *.*删除目前目錄裡的所有檔案,不包括隐藏、系統、隻讀檔案,要求按 Y 确認
del /q/a/f d:/temp/*.*删除 d:/temp 檔案夾裡面的所有檔案,包括隐藏、隻讀、系統檔案,不包括子目錄
del /q/a/f/s d:/temp/*.*删除 d:/temp 及子檔案夾裡面的所有檔案,包括隐藏、隻讀、系統檔案,不包括子目錄
8 ren檔案重命名
ren 1.txt 2.bak #把 1.txt 更名為 2.bak
ren *.txt *.ini #把目前目錄裡所有.txt檔案改成.ini檔案
ren d:/temp tmp #支援對檔案夾的重命名
9 cls清屏
10 type顯示檔案内容
type c:/boot.ini #顯示指定檔案的内容,程式檔案一般會顯示亂碼
type *.txt #顯示目前目錄裡所有.txt檔案的内容
11 copy拷貝檔案
copy c:/test.txt d:/複制 c:/test.txt 檔案到 d:/
copy c:/test.txt d:/test.bak複制 c:/test.txt 檔案到 d:/ ,并重命名為 test.bak
copy c:/*.*複制 c:/ 所有檔案到目前目錄,不包括隐藏檔案和系統檔案不指定目标路徑,則預設目标路徑為目前目錄
copy con test.txt從螢幕上等待輸入,按 Ctrl+Z 結束輸入,輸入内容存為test.txt檔案con代表螢幕,prn代表列印機
,nul代表空裝置
copy 1.txt + 2.txt 3.txt合并 1.txt 和 2.txt 的内容,儲存為 3.txt 檔案如果不指定 3.txt ,則儲存到 1.txt
copy test.txt +複制檔案到自己,實際上是修改了檔案日期
12 title設定cmd視窗的标題
title 新标題 #可以看到cmd視窗的标題欄變了
13 ver顯示系統版本
14 label 和 vol設定卷标
vol #顯示卷标
label #顯示卷标,同時提示輸入新卷标
label c:system #設定C槽的卷标為 system
15 pause暫停指令
運作該指令時,将顯示下面的消息:請按任意鍵繼續 . . .
一般用于看清楚螢幕上顯示的内容
16 rem 和 ::注釋指令
注釋行不執行操作
17 date 和 time日期和時間
date #顯示目前日期,并提示輸入新日期,按"回車"略過輸入
date/t #隻顯示目前日期,不提示輸入新日期
time #顯示目前時間,并提示輸入新時間,按"回車"略過輸入
time/t #隻顯示目前時間,不提示輸入新時間
18 goto 和 :跳轉指令
:label #行首為:表示該行是标簽行,标簽行不執行操作
goto label #跳轉到指定的标簽那一行
19 find (外部指令)查找指令
find "abc" c:/test.txt在 c:/test.txt 檔案裡查找含 abc 字元串的行如果找不到,将設 errorlevel 傳回碼為1
find /i "abc" c:/test.txt查找含 abc 的行,忽略大小寫
find /c "abc" c:/test.txt顯示含 abc 的行的行數
20 more (外部指令)逐屏顯示
more c:/test.txt #逐屏顯示 c:/test.txt 的檔案内容
21 tree顯示目錄結構
tree d:/ #顯示D盤的檔案目錄結構
22 &順序執行多條指令,而不管指令是否執行成功
c: & cd/ & dir /w相當于把下面3行指令寫到1行去了c:cd/dir /w
23 &&順序執行多條指令,當碰到執行出錯的指令後将不執行後面的指令
f: && cd/ && dir >c:/test.txt注意如果f盤不存在,那麼後面2條指令将不會執行
find "ok" c:/test.txt && echo 成功如果找到了"ok"字樣,就顯示"成功",找不到就不顯示
24 ||順序執行多條指令,當碰到執行正确的指令後将不執行後面的指令
find "ok" c:/test.txt || echo 不成功如果找不到"ok"字樣,就顯示"不成功",找到了就不顯示
25 |管道指令
前一個指令的執行結果輸出到後一個指令
dir *.* /s/a | find /c ".exe"管道指令表示先執行 dir 指令,對其輸出的結果執行後面的 find 指令該指令行結果:
輸出目前檔案夾及所有子檔案夾裡的.exe檔案的個數
type c:/test.txt|more這個和 more c:/test.txt 的效果是一樣的
26 > 和 >>輸出重定向指令
> 清除檔案中原有的内容後再寫入>> 追加内容到檔案末尾,而不會清除原有的内容主要将本來顯示在螢幕上的内容輸出
到指定檔案中指定檔案如果不存在,則自動生成該檔案
echo hello world>c:/test.txt生成c:/test.txt檔案,内容為hello world這個格式在批處理檔案裡用得很多,可以生成
.reg .bat .vbs 等臨時檔案
type c:/test.txt >prn螢幕上不顯示檔案内容,轉向輸出到列印機
echo hello world>con在螢幕上顯示hello world,實際上所有輸出都是預設 >con 的
copy c:/test.txt f: >nul拷貝檔案,并且不顯示"檔案複制成功"的提示資訊,但如果f盤不存在,還是會顯示出錯資訊
copy c:/test.txt f: >nul 2>nul不顯示"檔案複制成功"的提示資訊,并且f盤不存在的話,也不顯示錯誤提示資訊
echo ^^W ^> ^W>c:/test.txt生成的檔案内容為 ^W > W^ 和 > 是控制指令,要把它們輸出到檔案,必須在前面加個 ^
符号
27 <從檔案中獲得輸入資訊,而不是從螢幕上
一般用于 date time label 等需要等待輸入的指令
@echo offecho 2005-05-01>temp.txtdate <temp.txtdel temp.txt這樣就可以不等待輸入直接修改目前日期
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*指令行傳遞給批處理的參數
%0 批處理檔案本身%1 第一個參數%9 第九個參數%* 從第一個參數開始的所有參數
在C槽根目錄建立test.bat,内容如下:
@echo offecho %0echo %1echo %2echo %*
運作cmd,輸入 c:/test.bat "/a" /b /c /d可以看出每個參數的含意
修改test.bat内容如下
@echo offecho %1echo %~1echo %0echo %~f0echo %~d0echo %~p0echo %~n0echo %~x0echo %~s0echo %~a0echo %
~t0echo %~z0
再運作cmd,輸入 c:/test.bat "/a" /b /c /d可以參照 call/? 或 for/? 看出每個參數的含意注意這裡可以對檔案進行
日期比較和大小比較
echo load "%%1" "%%2">c:/test.txt生成的檔案内容為 load "%1" "%2"批處理檔案裡,用這個格式把指令行參數輸出到
檔案
31 set設定變量
引用變量可在變量名前後加 % ,即 %變量名%
set #顯示目前所有可用的變量,包括系統變量和自定義的變量
echo %SystemDrive% #顯示系統盤盤符。系統變量可以直接引用
set p #顯示所有以p開頭的變量,要是一個也沒有就設errorlevel=1
set p=aa1bb1aa2bb2 #設定變量p,并指派為 = 後面的字元串,即aa1bb1aa2bb2
echo %p% #顯示變量p代表的字元串,即aa1bb1aa2bb2
echo %p:~6% #顯示變量p中第6個字元以後的所有字元,即aa2bb2
echo %p:~6,3% #顯示第6個字元以後的3個字元,即aa2
echo %p:~0,3% #顯示前3個字元,即aa1
echo %p:~-2% #顯示最後面的2個字元,即b2
echo %p:~0,-2% #顯示除了最後2個字元以外的其它字元,即aa1bb1aa2b
echo %p:aa=c% #用c替換變量p中所有的aa,即顯示c1bb1c2bb2
echo %p:aa=% #将變量p中的所有aa字元串置換為空,即顯示1bb12bb2
echo %p:*bb=c% #第一個bb及其之前的所有字元被替換為c,即顯示c1aa2bb2
set p=%p:*bb=c% #設定變量p,指派為 %p:*bb=c% ,即c1aa2bb2
set /a p=39 #設定p為數值型變量,值為39
set /a p=39/10 #支援運算符,有小數時用去尾法,39/10=3.9,去尾得3,p=3set /a p=p/10 #用 /a
參數時,在 = 後面的變量可以不加%直接引用set /a p="1&0" #"與"運算,要加引号。其它支援的運算符參見
set/?
set p= #取消p變量
set /p p=請輸入螢幕上顯示"請輸入",并會将輸入的字元串指派給變量p注意這條可以用來取代 choice 指令
注意變量在 if 和 for 的複合語句裡是一次性全部替換的,如
@echo off
set p=aaa
if %p%==aaa (
echo %p%
set p=bbb
echo %p% )
結果将顯示aaaaaa因為在讀取 if 語句時已經将所有 %p% 替換為aaa這裡的"替換",在 /? 幫助裡就是指"擴充"、"環境
變量擴充"可以啟用"延緩環境變量擴充",用 ! 來引用變量,即 !變量名!
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set p=aaaif %p%==aaa (
echo %p%
set p=bbb
echo !p! )
ENDLOCAL
結果将顯示aaabbb
還有幾個動态變量,運作 set 看不到
%CD% #代表目前目錄的字元串
%DATE% #目前日期
%TIME% #目前時間
%RANDOM% #随機整數,介于0~32767
%ERRORLEVEL% #目前ERRORLEVEL 值
%CMDEXTVERSION% #目前指令處理器擴充名版本号
%CMDCMDLINE% #調用指令處理器的原始指令行可以用echo指令檢視每個變量值,如 echo %time%注意 %time%
精确到毫秒,在批處理需要延時處理時可以用到
32 start批進行中調用外部程式的指令,否則等外部程式完成後才繼續執行剩下的指令
start explorer d:/調用圖形界面打開D盤
@echo offcd /d %~dp0regedit /s 勁舞團.regstart patcher.exe
不加 start 指令的話,"勁舞團"運作時,後面會有個黑乎乎的cmd視窗
33 call批進行中調用另外一個批處理的指令,否則剩下的批處理指令将不會被執行有時有的應用程式用start調用出錯的
,也可以call調用
34 choice (外部指令)選擇指令讓使用者輸入一個字元,進而選擇運作不同的指令,傳回碼errorlevel為1234……win98裡
是choice.comwin2000pro裡沒有,可以從win98裡拷過來win2003裡是choice.exechoice /N /C y /T 5 /D y>nul延時5秒
下面是個 choice 語句的例子
@echo off
rem 以下在win2000pro運作通過,從win98裡拷的chioce.com檔案
choice /c:abc aaa,bbb,ccc
if errorlevel 3 goto ccc
if %errorlevel%==2 goto bbb
if errorlevel==1 goto aaa
rem 必須先判斷數值高的傳回碼rem 可以看到 errorlevel 值的判斷有3種寫法,有時某種寫法不好用,可以用另外的寫法
rem 直接運作
chioce相當于運作
choice /c:yn:aaa
echo aaa
goto end
:bbb
echo bbb
goto end
:ccc
echo ccc
goto end
:end
35 assoc 和 ftype檔案關聯assoc 設定'檔案擴充名'關聯,關聯到'檔案類型'ftype 設定'檔案類型'關聯,關聯到'執行程式和參數'當你輕按兩下一個.txt檔案時,windows并不是根據.txt直接判斷用 notepad.exe 打開而是先判斷.txt屬于 txtfile '檔案類型'再調用 txtfile 關聯的指令行 txtfile=%SystemRoot%/system32/NOTEPAD.EXE %1可以在"檔案夾選項"→"檔案類型"裡修改這2種關聯
assoc #顯示所有'檔案擴充名'關聯
assoc .txt #顯示.txt代表的'檔案類型',結果顯示 .txt=txtfile
assoc .doc #顯示.doc代表的'檔案類型',結果顯示 .doc=Word.Document.8
assoc .exe #顯示.exe代表的'檔案類型',結果顯示 .exe=exefile
ftype #顯示所有'檔案類型'關聯
ftype exefile #顯示exefile類型關聯的指令行,結果顯示 exefile="%1" %* assoc .txt=Word.Document.8設定.txt為word類型的文檔,可以看到.txt檔案的圖示都變了
assoc .txt=txtfile恢複.txt的正确關聯 ftype exefile="%1" %*恢複 exefile 的正确關聯
如果該關聯已經被破壞,可以運作 command.com ,再輸入這條指令
36 pushd 和 popd切換目前目錄
@echo off
c: & cd/ & md mp3 #在 C:/ 建立 mp3 檔案夾
md d:/mp4 #在 D:/ 建立 mp4 檔案夾
cd /d d:/mp4 #更改目前目錄為 d:/mp4
pushd c:/mp3 #儲存目前目錄,并切換目前目錄為 c:/mp3
popd #恢複目前目錄為剛才儲存的 d:/mp4一般用處不大,在目前目錄名不确定時,會有點幫助
32 subst (外部指令)映射磁盤。
subst z: //server/d #這樣輸入z:就可以通路//server/d了
subst z: /d #取消該映射
subst #顯示目前所有的映
38 xcopy (外部指令)檔案拷貝
xcopy d:/mp3 e:/mp3 /s/e/i/y複制 d:/mp3 檔案夾、所有子檔案夾和檔案到 e:/ ,覆寫已有檔案加 /i 表示如果 e:/ 沒有 mp3 檔案夾就自動建立一個,否則會有詢問
39 一些不常用的内部指令
>& 将一個句柄的輸出寫入到另一個句柄的輸入中
<& 從一個句柄讀取輸入并将其寫入到另一個句柄輸出中shift 指令行傳遞給批處理的參數不止9個時,用以切換參數color 設定cmd視窗的顯示顔色
pormpt 更改指令提示符号,預設都是 盤符:/路徑/> ,如 c:/>
40 format (外部指令)格式化硬碟
format c: /q/u/autotest/q表示快速格式化,/autotest表示自動格式化,不需要按 Y 确認/u表示每位元組用
F6 覆寫硬碟資料,使其不可用軟體恢複format c: /c格式化C槽,并檢測壞道
41 fdisk (外部指令)硬碟分區win2000不帶
該指令win98裡的fdisk不支援80G以上大硬碟,winme裡的支援fdisk/mbr重建硬碟分區表,一般用于清除引導區病毒、還
原精靈注意使用該指令不能從硬碟啟動,必須軟驅或光驅啟動後直接運作
42 ping (外部指令)
ping -l 65500 -t 192.168.1.200不停的向192.168.1.200計算機發送大小為65500byte的資料包
ping -n 10 127.0.0.1>nulping自己10次,可用于批處理延時10秒
43 SC (外部指令)服務控制指令
sc create aaa displayname= bbb start= auto binpath= "C:/WINDOWS/System32/alg.exe"建立服務,服務名稱aaa,顯示名稱bbb,啟動類型:自動可執行檔案的路徑"C:/WINDOWS/System32/alg.exe"
sc description aaa "ccc"更改aaa的描述為ccc
sc config aaa start= disabled binpath= "C:/WINDOWS/System32/svchost.exe -k netsvcs"更改aaa的啟動類型:已禁用更改aaa的可執行檔案的路徑"C:/WINDOWS/System32/svchost.exe -k netsvcs"
sc config aaa start= demand displayname= ddd更改aaa的啟動類型:手動更改aaa的顯示名稱ddd
sc start aaa啟動aaa服務
sc stop aaa停止aaa服務
sc delete aaa删除aaa服務
參考:批處理_百度百科 http://baike.baidu.com/view/80110.htm