简单批处理命令简介
?http://baike.baidu.com/view/80110.htm
處理是一種簡化的腳本語言,也稱作宏。它應用于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的功能
但::和rem還是有區別的,當關閉回顯時,rem和::后的內容都不會顯示。
順序批處理
但是當打開回顯時,rem和rem
后的內容會顯示出來,然而::后的內容仍然不會顯示。
Rem Message
Sample:@Rem Here is the description.
pause 命令
暫停命令。運行 Pause 命令時,將顯示下面的消息:
Press any key to continue. . .(或:請按任意鍵繼續. . .)
Sample:
@echo off
:begin
copy G:*.* d:\back
echo 請插入另一張光盤...
pause
goto begin
在這個例子中,驅動器 G 中磁盤上的所有文件均復制到d:\back中。顯示的注釋提示您將另一張光盤
盤放入驅動器 G 時,pause 命令會使程序掛起,以便您更換光盤,然后按任意鍵繼續處理。
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
邏輯命令符
邏輯命令符包括:&、&&、||
&-它的作用是用來連接n個DOS命令,并把這些命令按順序執行,而不管是否有命令執行失敗;
&&-當&&前面的命令成功執行時,執行&&后面的命令,否則不執行;
||-當||前面的命令失敗時,執行||后面的命令,否則不執行。
=========================================
@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 為可執行文件顯示或設置一個搜索路徑。
copy 復制文件和目錄樹。
文件管理
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="可以取消變量,收回變量所占據的內存空間。
4.結果判斷
masm %1.asm
if errorlevel 1 pause & edit %1.asm
link %1.obj
先對源代碼進行匯編,如果失敗則暫停顯示錯誤信息,并在按任意鍵后自動進入編輯界面;否則用link程序連接生成的obj文件,這種用法是先判斷前一個命令執行后的返回碼(也叫錯誤碼,DOS程序在運行完后都有返回碼),如果和定義的錯誤碼符合(這里定義的錯誤碼為1),則執行相應的操作(這里相應的操作為pause & edit %1.asm部分)。
另外,和其他兩種用法一樣,這種用法也可以表示否定。用否定的形式仍表達上面三句的意思,代碼變為:
masm %1.asm
if not errorlevel 1 link %1.obj
pause & edit %1.asm
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=abcdefghijklmnopqrstuvwxyz0 12 3456789
echo 原字符串(第二行為各字符的序號):
echo %ifo%
echo 1234567890 123 45678901234567890123456
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了
(二)用戶變量
編寫批處理程序時,用戶根據需要自己定義的變量稱之為用戶變量。用戶變量類似于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
===============================================
此處,這個就是調用vbs的方法:vbscript:createobject("sapi.spvoice").speak("Merry Christmas and Happy New Year!")
speak 有人說如果tts安裝了中文引擎是可以講中文的。
其實不然我測試了一下只要打上拼音(一個字和一個字的拼音中間需要加空格)就可以說中文啦~
【 3.控制 】
在運行批處理的過程中,我們如何干預批處理呢?呵呵,直接點叉叉就可以結束它了!嗯,不錯,不過,太野蠻了~
--1.暫停批處理:直接按鍵盤上的Pause鍵嘍
--2.終止批處理:組合鍵Ctrl+C。不過,有時候它好像響應的不太積極啊…
(六)ASCII碼
前面的例子中,我們已經使用過一次ASCII碼了,也就是那個笑臉。ASCII碼是圖形化的符號,可以用來點綴我們的批處理的。
在cmd窗口中我們可以通過任意一個字符的ASCII碼來輸入該字符,比如Ctrl+G、Ctrl+N等,字母a-z對應ASCII碼的97-122。對于ASCII碼大于26的字符,可以通過這個方法來輸入:按住Alt鍵不松,通過小鍵盤輸入ASCII碼的十進制值,松開Alt鍵即可。
編輯本段批處理文件的應用
批處理文件是將一系列命令按一定的順序集合為一個可執行的文本文件,其擴展名為BAT。
1. REM
REM 是個注釋命令一般是用來給程序加上注解的,該命令后的內容在程序執行的時候將不會被顯示和執行。例:
REM 你現在看到的就是注解,這一句將不會被執行。在以后的例子中解釋的內容都REM 會放在REM后面。請大家注意。
2. ECHO
ECHO 是一個回顯命令主要參數有OFF和 ON,一般用ECHO message來顯示一個特定的消息 。例:
Echo off
Rem 以上代表關閉回顯即不顯示所執行的命令
Echo 這個就是消息。
Rem 以上代表顯示“這就是消息”這列字符
執行結果:
C:\>ECHO.BAT
這個就是消息。
3. GOTO
GOTO 即為跳轉的意思。在批處理中允許以“:XXX”來構建一個標號然后用GOTO :標號直接來執行標號后的命令。例
:LABEL
REM 上面就是名為LABEL的標號。
DIR C:\
DIR D:\
GOTO LABEL
REM 以上程序跳轉標號LABEL處繼續執行。
4.CALL
CALL 命令可以在批處理執行過程中調用另一個批處理,當另一個批處理執行完后再繼續執行原來的批處理。例:
批處理2.BAT內容如下:
ECHO 這就是2的內容
批處理1.BAT內容如下:
ECHO 這是1的內容
CALL 2.BAT
ECHO 1和2的內容全部顯示完成
執行結果如下:
C:\>1.BAT
這是1的內容
這就是2的內容
1和2的內容全部顯示完成
5.PAUSE
PAUSE 停止系統命令的執行并顯示下面的內容。例:
C:\> PAUSE
請按任意鍵繼續 . . .
6. IF
IF 條件判斷語句,語法格式如下:
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
說明:
[NOT] 將返回的結果取反值即“如果沒有”的意思。
ERRORLEVEL 是命令執行完成后返回的退出值
Number 退出值的數字取值范圍0~255。判斷時值的排列順序應該又大到小。返回的值大于或等于指定的值時條件成立。
string1==string2 string1和string2都為字符的數據,英文字符的大小寫將看做不同,這個條件中的等于號必須是2個(絕對相等),條件相等后即執行后面的 command
EXIST filename 為文件或目錄存在的意思。
IF ERRORLEVEL這條語句必須放在某一個命令后面。執行命令后由IF ERRORLEVEL來判斷命令的返回值。
?
?
===http://youkey.zhmy.com/archives/2008/146745.html
擴展名是bat(在nt/2000/xp/2003下也可以是cmd)的文件就是批處理文件。
==== 注 =======================================
.bat是dos下的批處理文件
.cmd是nt內核命令行環境的另一種批處理文件
從更廣義的角度來看,unix的shell腳本以及其它操作系統甚至應用程序中由外殼進行解釋執行的文本,都具有與批處理文件十分相似的作用,而且同樣是由專用解釋器以行為單位解釋執行,這種文本形式更通用的稱謂是腳本語言。所以從某個程度分析,batch, unix shell, awk, basic, perl 等腳本語言都是一樣的,只不過應用的范圍和解釋的平臺各有不同而已。甚至有些應用程序仍然沿用批處理這一稱呼,而其內容和擴展名與dos的批處理卻又完全不同。
===================================
首先批處理文件是一個文本文件,這個文件的每一行都是一條DOS命令(大部分時候就好象我們在DOS提示符下執行的命令行一樣),你可以使用DOS下的Edit或者Windows的記事本(notepad)等任何文本文件編輯工具創建和修改批處理文件。
==== 注 ===================
批處理文件中完全可以使用非dos命令,甚至可以使用不具有可執行特性的普通數據性文件,這緣于windows系統這個新型解釋平臺的涉入,使得批處理的應用越來越"邊緣化"。所以我們討論的批處理應該限定在dos環境或者命令行環境中,否則很多觀念和設定都需要做比較大的變動。
========================
其次,批處理文件是一種簡單的程序,可以通過條件語句(if)和流程控制語句(goto)來控制命令運行的流程,在批處理中也可以使用循環語句(for)來循環執行一條命令。當然,批處理文件的編程能力與C語言等編程語句比起來是十分有限的,也是十分不規范的。批處理的程序語句就是一條條的DOS命令(包括內部命令和外部命令),而批處理的能力主要取決于你所使用的命令。
==== 注 ==================
批處理文件(batch file)也可以稱之為批處理程序(batch program),這一點與編譯型語言有所不同,就c語言來說,擴展名為c或者cpp的文件可以稱之為c語言文件或者c語言源代碼,但只有編譯連接后的exe文件才可以稱之為c語言程序。因為批處理文件本身既具有文本的可讀性,又具有程序的可執行性,這些稱謂的界限是比較模糊的。
===========================
第三,每個編寫好的批處理文件都相當于一個DOS的外部命令,你可以把它所在的目錄放到你的DOS搜索路徑(path)中來使得它可以在任意位置運行。一個良好的習慣是在硬盤上建立一個bat或者batch目錄(例如C:BATCH),然后將所有你編寫的批處理文件放到該目錄中,這樣只要在path中設置上c:atch,你就可以在任意位置運行所有你編寫的批處理程序。
==== 注 =====
純以dos系統而言,可執行程序大約可以細分為五類,依照執行優先級由高到低排列分別是:DOSKEY宏命令(預先駐留內存),COMMAND.COM中的內部命令(根據內存的環境隨時進駐內存),以com為擴展名的可執行程序(由command.com 直接載入內存),以exe位擴展名的可執行程序(由command.com 重定位后載入內存),以bat位擴展名的批處理程序(由command.com 解釋分析,根據其內容按優先級順序調用第2,3,4,5種可執行程序,分析一行,執行一行,文件本身不載入內存)
============
第四,在DOS和Win9x/Me系統下,C:盤根目錄下的AUTOEXEC.BAT批處理文件是自動運行批處理文件,每次系統啟動時會自動運行該文件,你可以將系統每次啟動時都要運行的命令放入該文件中,例如設置搜索路徑,調入鼠標驅動和磁盤緩存,設置系統環境變量等。下面是一個運行于Windows 98下的autoexec.bat的示例:
@ECHO OFF
PATH C:WINDOWS;C:WINDOWSCOMMAND;C:UCDOS;C:DOSTools;
C:SYSTOOLS;C:WINTOOLS;C:BATCH
LH SMARTDRV.EXE /X
LH DOSKEY.COM /insert
LH CTMOUSE.EXE
SET TEMP=D:TEMP
SET TMP=D:TEMP
==== 注 =====
AUTOEXEC.BAT為DOS系統的自動運行批處理文件,由COMMAND.COM啟動時解釋執行;
而在Win9x環境中,不僅增加支持了 DOSSTART.BAT, WINSTART.BAT 等許多其它自動運行的批處理文件,對AUTOEXEC.BAT 也增加了 .DOS .W40 .BAK .OLD .PWS 等許多變體以適應復雜的環境和多變的需求。
==== willsort 編注 =============
以下關于命令的分類,有很多值得推敲的地方。常用命令中的@本不是命令,而dir、copy等也很常用的命令卻沒有列入, 而特殊命令中所有命令對我來說都是常用命令。建議將批處理所引用的命令分為內部命令、外部命令、第三方程序三類。而內部命令和外部命令中別有一類是專用于或常用于批處理中的命令可稱之為"批處理命令"。
以下摘錄MS-DOS 6.22 幫助文檔中關于"批處理命令"的文字,當然,其中有些概念和定義已經有些落后了。
批處理命令
批處理文件或批處理程序是一個包含若干MS-DOS命令的正文文件,擴展名為.BAT。當在命令提示符下敲入批處理程序的名稱時,MS-DOS成組執行此批處理程序中的命令。
任何在命令提示符下可使用的命令都可用在批處理程序中。此外,下面MS-DOS命令是專門在批處理程序中使用的。
==========
常用命令
echo、@、call、pause、rem(小技巧:用::代替rem)是批處理文件最常用的幾個命令,我們就從他們開始學起。
==== 注 ===========
首先, @ 不是一個命令, 而是DOS 批處理的一個特殊標記符, 僅用于屏蔽命令行回顯. 下面是DOS命令行或批處理中可能會見到的一些特殊標記符:
CR(0D) 命令行結束符
Escape(1B) ANSI轉義字符引導符
Space(20) 常用的參數界定符
Tab(09) ; = 不常用的參數界定符
+ COPY命令文件連接符
* ? 文件通配符
"" 字符串界定符
| 命令管道符
< > >> 文件重定向符
@ 命令行回顯屏蔽符
/ 參數開關引導符
: 批處理標簽引導符
% 批處理變量引導符
其次, :: 確實可以起到rem 的注釋作用, 而且更簡潔有效; 但有兩點需要注意:
第一, 除了 :: 之外, 任何以 :開頭的字符行, 在批處理中都被視作標號, 而直接忽略其后的所有內容, 只是為了與正常的標號相區別, 建議使用 goto 所無法識別的標號, 即在 :后緊跟一個非字母數字的一個特殊符號.
第二, 與rem 不同的是, ::后的字符行在執行時不會回顯, 無論是否用echo on打開命令行回顯狀態, 因為命令解釋器不認為他是一個有效的命令行, 就此點來看, rem 在某些場合下將比 :: 更為適用; 另外, rem 可以用于 config.sys 文件中.
=====================
echo 表示顯示此命令后的字符
echo off 表示在此語句后所有運行的命令都不顯示命令行本身
@與echo off相象,但它是加在每個命令行的最前面,表示運行時不顯示這一行的命令行(只能影響當前行)。
call 調用另一個批處理文件(如果不用call而直接調用別的批處理文件,那么執行完那個批處理文件后將無法返回當前文件并執行當前文件的后續命令)。
pause 運行此句會暫停批處理的執行并在屏幕上顯示Press any key to continue...的提示,等待用戶按任意鍵后繼續
rem 表示此命令后的字符為解釋行(注釋),不執行,只是給自己今后參考用的(相當于程序中的注釋)。
==== 注 =====
此處的描述較為混亂, 不如直接引用個命令的命令行幫助更為條理
-------------------------
ECHO
當程序運行時,顯示或隱藏批處理程序中的正文。也可用于允許或禁止命令的回顯。
在運行批處理程序時,MS-DOS一般在屏幕上顯示(回顯)批處理程序中的命令。
使用ECHO命令可關閉此功能。
語法
ECHO [ON|OFF]
若要用echo命令顯示一條命令,可用下述語法:
echo [message]
參數
ON|OFF
指定是否允許命令的回顯。若要顯示當前的ECHO的設置,可使用不帶參數的ECHO
命令。
message
指定讓MS-DOS在屏幕上顯示的正文。
-------------------
CALL
從一個批處理程序中調用另一個批處理程序,而不會引起第一個批處理的中止。
語法
CALL [drive:][path]filename [batch-parameters]
參數
[drive:][path]filename
指定要調用的批處理程序的名字及其存放處。文件名必須用.BAT作擴展名。
batch-parameters
指定批處理程序所需的命令行信息。
-------------------------------
PAUSE
暫停批處理程序的執行并顯示一條消息,提示用戶按任意鍵繼續執行。只能在批處
理程序中使用該命令。
語法
PAUSE
REM
在批處理文件或CONFIG.SYS中加入注解。也可用REM命令來屏蔽命令(在CONFIG.SYS
中也可以用分號 ; 代替REM命令,但在批處理文件中則不能替代)。
語法
REM [string]
參數
string
指定要屏蔽的命令或要包含的注解。
=======================
例1:用edit編輯a.bat文件,輸入下列內容后存盤為c:a.bat,執行該批處理文件后可實現:將根目錄中所有文件寫入 a.txt中,啟動UCDOS,進入WPS等功能。
批處理文件的內容為: 命令注釋:
@echo off 不顯示后續命令行及當前命令行
dir c:*.* >a.txt 將c盤文件列表寫入a.txt
call c:ucdosucdos.bat 調用ucdos
echo 你好 顯示"你好"
pause 暫停,等待按鍵繼續
rem 準備運行wps 注釋:準備運行wps
cd ucdos 進入ucdos目錄
wps 運行wps
批處理文件的參數
批處理文件還可以像C語言的函數一樣使用參數(相當于DOS命令的命令行參數),這需要用到一個參數表示符"%"。
%[1-9]表示參數,參數是指在運行批處理文件時在文件名后加的以空格(或者Tab)分隔的字符串。變量可以從%0到%9,%0表示批處理命令本身,其它參數字符串用%1到%9順序表示。
例2:C:根目錄下有一批處理文件名為f.bat,內容為:
@echo off
format %1
如果執行C:>f a:
那么在執行f.bat時,%1就表示a:,這樣format %1就相當于format a:,于是上面的命令運行時實際執行的是format a:
例3:C:根目錄下一批處理文件名為t.bat,內容為:
@echo off
type %1
type %2
那么運行C:>t a.txt b.txt
%1 : 表示a.txt
%2 : 表示b.txt
于是上面的命令將順序地顯示a.txt和b.txt文件的內容。
==== 注 ===============
參數在批處理中也作為變量處理, 所以同樣使用百分號作為引導符, 其后跟0-9中的一個數字構成參數引用符. 引用符和參數之間 (例如上文中的 %1 與 a: ) 的關系類似于變量指針與變量值的關系. 當我們要引用第十一個或更多個參數時, 就必須移動DOS 的參數起始指針. shift 命令正充當了這個移動指針的角色, 它將參數的起始指針移動到下一個參數, 類似C 語言中的指針操作. 圖示如下:
初始狀態, cmd 為命令名, 可以用 %0 引用
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | |
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9
經過1次shift后, cmd 將無法被引用
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | |
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9
經過2次shift后, arg1也被廢棄, %9指向為空, 沒有引用意義
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | |
%0 %1 %2 %3 %4 %5 %6 %7 %8
遺憾的是, win9x 和DOS下均不支持 shift 的逆操作. 只有在 nt 內核命令行環境下, shift 才支持 /n 參數, 可以以第一參數為基準返復移動起始指針.
=================
特殊命令
if goto choice for是批處理文件中比較高級的命令,如果這幾個你用得很熟練,你就是批處理文件的專家啦。
一、if 是條件語句,用來判斷是否符合規定的條件,從而決定執行不同的命令。 有三種格式:
1、if [not] "參數" == "字符串" 待執行的命令
參數如果等于(not表示不等,下同)指定的字符串,則條件成立,運行命令,否則運行下一句。
例:if "%1"=="a" format a:
====
if 的命令行幫助中關于此點的描述為:
IF [NOT] string1==string2 command
在此有以下幾點需要注意:
1. 包含字符串的雙引號不是語法所必須的, 而只是習慣上使用的一種"防空"字符
2. string1 未必是參數, 它也可以是環境變量, 循環變量以及其他字符串常量或變量
3. command 不是語法所必須的, string2 后跟一個空格就可以構成一個有效的命令行
=============================
2、if [not] exist [路徑]文件名 待執行的命令
如果有指定的文件,則條件成立,運行命令,否則運行下一句。
如: if exist c:config.sys type c:config.sys
表示如果存在c:config.sys文件,則顯示它的內容。
****** 注 ********
也可以使用以下的用法:
if exist command
device 是指DOS系統中已加載的設備, 在win98下通常有:
AUX, PRN, CON, NUL
COM1, COM2, COM3, COM4
LPT1, LPT2, LPT3, LPT4
XMSXXXX0, EMMXXXX0
A: B: C: ...,
CLOCK$, CONFIG$, DblBuff$, IFS$HLP$
具體的內容會因硬軟件環境的不同而略有差異, 使用這些設備名稱時, 需要保證以下三點:
1. 該設備確實存在(由軟件虛擬的設備除外)
2. 該設備驅動程序已加載(aux, prn等標準設備由系統缺省定義)
3. 該設備已準備好(主要是指a: b: ..., com1..., lpt1...等)
可通過命令 mem/d | find "device" /i 來檢閱你的系統中所加載的設備
另外, 在DOS系統中, 設備也被認為是一種特殊的文件, 而文件也可以稱作字符設備; 因為設備(device)與文件都是使用句柄(handle)來管理的, 句柄就是名字, 類似于文件名, 只不過句柄不是應用于磁盤管理, 而是應用于內存管理而已, 所謂設備加載也即指在內存中為其分配可引用的句柄.
==================================
3、if errorlevel <數字> 待執行的命令
很多DOS程序在運行結束后會返回一個數字值用來表示程序運行的結果(或者狀態),通過if errorlevel命令可以判斷程序的返回值,根據不同的返回值來決定執行不同的命令(返回值必須按照從大到小的順序排列)。如果返回值等于指定的數字,則條件成立,運行命令,否則運行下一句。
如if errorlevel 2 goto x2
==== 注 ===========
返回值從大到小的順序排列不是必須的, 而只是執行命令為 goto 時的習慣用法, 當使用 set 作為執行命令時, 通常會從小到大順序排列, 比如需將返回碼置入環境變量, 就需使用以下的順序形式:
if errorlevel 1 set el=1
if errorlevel 2 set el=2
if errorlevel 3 set el=3
if errorlevel 4 set el=4
if errorlevel 5 set el=5
...
當然, 也可以使用以下循環來替代, 原理是一致的:
for %%e in (1 2 3 4 5 6 7 8...) do if errorlevel %%e set el=%%e
更高效簡潔的用法, 可以參考我寫的另一篇關于獲取 errorlevel 的文章
出現此種現象的原因是, if errorlevel 比較返回碼的判斷條件并非等于, 而是大于等于. 由于 goto 的跳轉特性, 由小到大排序會導致在較小的返回碼處就跳出; 而由于 set命令的 "重復" 賦值特性, 由大到小排序會導致較小的返回碼 "覆蓋" 較大的返回碼.
另外, 雖然 if errorlevel=<數字> command 也是有效的命令行, 但也只是 command.com 解釋命令行時將 = 作為命令行切分符而忽略掉罷了
===========================
二、goto 批處理文件運行到這里將跳到goto所指定的標號(標號即label,標號用:后跟標準字符串來定義)處,goto語句一般與if配合使用,根據不同的條件來執行不同的命令組。
如:
goto end
:end
echo this is the end
標號用":字符串"來定義,標號所在行不被執行。
==== willsort 編注
label 常被譯為 "標簽" , 但是這并不具有廣泛的約定性.
goto 與 : 聯用可實現執行中途的跳轉, 再結合 if 可實現執行過程的條件分支, 多個 if 即可實現命令的分組, 類似 C 中 switch case 結構或者 Basic 中的 select case 結構, 大規模且結構化的命令分組即可實現高級語言中的函數功能. 以下是批處理和C/Basic在語法結構上的對照:
Batch C / Basic
goto&: goto&:
goto&:&if if{}&else{} / if&elseif&endif
goto&:&if... switch&case / select case
goto&:&if&set&envar... function() / function(),sub()
==================================
三、choice 使用此命令可以讓用戶輸入一個字符(用于選擇),從而根據用戶的選擇返回不同的errorlevel,然后于if errorlevel配合,根據用戶的選擇運行不同的命令。
注意:choice命令為DOS或者Windows系統提供的外部命令,不同版本的choice命令語法會稍有不同,請用choice /?查看用法。
choice的命令語法(該語法為Windows 2003中choice命令的語法,其它版本的choice的命令語法與此大同小異):
CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]
描述:
該工具允許用戶從選擇列表選擇一個項目并返回所選項目的索引。
參數列表:
/C choices 指定要創建的選項列表。默認列表是 "YN"。
/N 在提示符中隱藏選項列表。提示前面的消息得到顯示,
選項依舊處于啟用狀態。
/CS 允許選擇分大小寫的選項。在默認情況下,這個工具
是不分大小寫的。
/T timeout 做出默認選擇之前,暫停的秒數。可接受的值是從 0
到 9999。如果指定了 0,就不會有暫停,默認選項
會得到選擇。
/D choice 在 nnnn 秒之后指定默認選項。字符必須在用 /C 選
項指定的一組選擇中; 同時,必須用 /T 指定 nnnn。
/M text 指定提示之前要顯示的消息。如果沒有指定,工具只
顯示提示。
/? 顯示幫助消息。
注意:
ERRORLEVEL 環境變量被設置為從選擇集選擇的鍵索引。列出的第一個選
擇返回 1,第二個選擇返回 2,等等。如果用戶按的鍵不是有效的選擇,
該工具會發出警告響聲。如果該工具檢測到錯誤狀態,它會返回 255 的
ERRORLEVEL 值。如果用戶按 Ctrl+Break 或 Ctrl+C 鍵,該工具會返回 0
的 ERRORLEVEL 值。在一個批程序中使用 ERRORLEVEL 參數時,將參數降
序排列。
示例:
CHOICE /?
CHOICE /C YNC /M "確認請按 Y,否請按 N,或者取消請按 C。"
CHOICE /T 10 /C ync /CS /D y
CHOICE /C ab /M "選項 1 請選擇 a,選項 2 請選擇 b。"
CHOICE /C ab /N /M "選項 1 請選擇 a,選項 2 請選擇 b。"
==== willsort 編注 ===============================
我列出win98下choice的用法幫助, 已資區分
Waits for the user to choose one of a set of choices.
等待用戶選擇一組待選字符中的一個
CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text]
/C[:]choices Specifies allowable keys. Default is YN
指定允許的按鍵(待選字符), 默認為YN
/N Do not display choices and ? at end of prompt string.
不顯示提示字符串中的問號和待選字符
/S Treat choice keys as case sensitive.
處理待選字符時大小寫敏感
/T[:]c,nn Default choice to c after nn seconds
在 nn 秒后默認選擇 c
text Prompt string to display
要顯示的提示字符串
ERRORLEVEL is set to offset of key user presses in choices.
ERRORLEVEL 被設置為用戶鍵入的字符在待選字符中的偏移值
如果我運行命令:CHOICE /C YNC /M "確認請按 Y,否請按 N,或者取消請按 C。"
屏幕上會顯示:
確認請按 Y,否請按 N,或者取消請按 C。 [Y,N,C]?
例:test.bat的內容如下(注意,用if errorlevel判斷返回值時,要按返回值從高到低排列):
@echo off
choice /C dme /M "defrag,mem,end"
if errorlevel 3 goto end
if errorlevel 2 goto mem
if errorlevel 1 goto defrag
:defrag
c:dosdefrag
goto end
:mem
mem
goto end
:end
echo good bye
此批處理運行后,將顯示"defrag,mem,end[D,M,E]?" ,用戶可選擇d m e ,然后if語句根據用戶的選擇作出判斷,d表示執行標號為defrag的程序段,m表示執行標號為mem的程序段,e表示執行標號為end的程序段,每個程序段最后都以goto end將程序跳到end標號處,然后程序將顯示good bye,批處理運行結束。
四、for 循環命令,只要條件符合,它將多次執行同一命令。
語法:
對一組文件中的每一個文件執行某個特定命令。
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一個單一字母可替換的參數。
(set) 指定一個或一組文件。可以使用通配符。
command 指定對每個文件執行的命令。
command-parameters
為特定命令指定參數或命令行開關。
例如一個批處理文件中有一行:
for %%c in (*.bat *.txt) do type %%c
則該命令行會顯示當前目錄下所有以bat和txt為擴展名的文件的內容。
==== willsort 編注 =====================================================
需要指出的是, 當()中的字符串并非單個或多個文件名時, 它將單純被當作字符串替換, 這個特性再加上()中可以嵌入多個字符串的特性, 很明顯 for 可以被看作一種遍歷型循環.
當然, 在 nt/2000/xp/2003 系列的命令行環境中, for 被賦予了更多的特性, 使之可以分析命令輸出或者文件中的字符串, 也有很多開關被用于擴展了文件替換功能.
========================================================================
批處理示例
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是實參。
==== willsort 編注 =====================================================
DOS沒有 "允許傳遞9個批參數信息" 的限制, 參數的個數只會受到命令行長度和所調用命令處理能力的限制. 但是, 我們在批處理程序中, 在同一時刻只能同時引用10個參數, 因為 DOS只給出了 %0~%9這十個參數引用符.
========================================================================
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中止拷貝操作
預置錯誤阻止文件拷貝操作
拷貝過程中寫盤錯誤
都將顯示出來。
以下就是幾個常用命令的返回值及其代表的意義:
backup
0 備份成功
1 未找到備份文件
2 文件共享沖突阻止備份完成
3 用戶用ctrl-c中止備份
4 由于致命的錯誤使備份操作中止
diskcomp
0 盤比較相同
1 盤比較不同
2 用戶通過ctrl-c中止比較操作
3 由于致命的錯誤使比較操作中止
4 預置錯誤中止比較
diskcopy
0 盤拷貝操作成功
1 非致命盤讀/寫錯
2 用戶通過ctrl-c結束拷貝操作
3 因致命的處理錯誤使盤拷貝中止
4 預置錯誤阻止拷貝操作
format
0 格式化成功
3 用戶通過ctrl-c中止格式化處理
4 因致命的處理錯誤使格式化中止
5 在提示"proceed with format(y/n)?"下用戶鍵入n結束
xcopy
0 成功拷貝文件
1 未找到拷貝文件
2 用戶通過ctrl-c中止拷貝操作
4 預置錯誤阻止文件拷貝操作
5 拷貝過程中寫盤錯誤
chkdsk
0 未找到錯誤
255 找到一個或多個錯誤
choice
0 用戶按下ctrl+c/break
1 用戶按下第一個鍵
255 檢測到命令行中的錯誤條件
其它 用戶按下的有效字符在列表中的位置
defrag
0 碎片壓縮成功
1 出現內部錯誤
2 磁盤上沒有空簇。要運行DEFRAG,至少要有一個空簇
3 用戶用Ctrl+C退出了DEFRAG
4 出現一般性錯誤
5 DEFRAG在讀簇時遇到錯誤
6 DEFRAG在寫簇時遇到錯誤
7 分配空間有錯
8 內存錯
9 沒有足夠空間來壓縮磁盤碎片
deltree
0 成功地刪除一個目錄
diskcomp
0 兩盤相同
1 發現不同
2 按CTRL+C 終止了比較
3 出現嚴重錯誤
4 出現初始化錯誤
find
0 查找成功且至少找到了一個匹配的字符串
1 查找成功但沒找到匹配的字符串
2 查找中出現了錯誤
keyb
0 鍵盤定義文件裝入成功
1 使用了非法的鍵盤代碼,字符集或語法
2 鍵盤定義文件壞或未找到
4 鍵盤、監視器通訊時出錯
5 要求的字符集未準備好
move
0 成功地移動了指定的文件
1 發生了錯誤
msav /N
86 檢查到了病毒
replace
0 REPLACE成功地替換或加入了文件
1 MS-DOS版本和REPLACE不兼容
2 REPLACE找不到源文件
3 REPLACE找不到源路徑或目標路徑
5 不能存取要替換的文件
8 內存不夠無法執行REPLACE
11 命令行句法錯誤
restore
0 RESTORE成功地恢復了文件
1 RESTORE找不到要恢復的文件
3 用戶按CTRL+C終止恢復過程
4 RESTORE因錯誤而終止
scandisk
0 ScanDisk在它檢查的驅動器上未檢測到任何錯誤
1 由于命令行的語法不對,不能運行ScanDisk
2 由于內存用盡或發生內部錯誤,ScanDisk意外終止
3 用戶讓ScanDisk中途退出
4 進行盤面掃描時,用戶決定提前退出
254 ScanDisk找到磁盤故障并已全部校正
255 ScanDisk找到磁盤故障,但未能全部校正
setver
0 SETVER成功地完成了任務
1 用戶指定了一個無效的命令開關
2 用戶指定了一個非法的文件名
3 沒有足夠的系統內存來運行命令
4 用戶指定了一個非法的版本號格式
5 SETVER在版本表中未找到指定的項
6 SETVER未找到SETVER.EXE文件
7 用戶指定了一個非法的驅動器
8 用戶指定了太多的命令行參數
9 SETVER檢測到丟失了命令行參數
10 在讀SETVER.EXE文件時,SETVER檢測到發生錯誤
11 SETVER.EXE文件損壞
12 指定的SETVER.EXE文件不支持版本表
13 版本表中沒有足夠的空間存放新的項
14 在寫SETVER.EXE文件時SETVER檢測到發生錯誤
========================================================================
3、IF STRING1 == STRING2
建立TEST5.BAT,文件內容如下:
@echo off
IF "%1" == "A" FORMAT A:
執行:
C:>TEST5 A
屏幕上就出現是否將A:盤格式化的內容。
注意:為了防止參數為空的情況,一般會將字符串用雙引號(或者其它符號,注意不能使用保留符號)括起來。
如:if [%1]==[A] 或者 if %1*==A*
5、GOTO
建立TEST6.BAT,文件內容如下:
@ECHO OFF
IF EXIST C:AUTOEXEC.BAT GOTO _COPY
GOTO _DONE
:_COPY
COPY C:AUTOEXEC.BAT D:
:_DONE
注意:
(1) 標號前是ASCII字符的冒號":",冒號與標號之間不能有空格。
(2) 標號的命名規則與文件名的命名規則相同。
(3) DOS支持最長八位字符的標號,當無法區別兩個標號時,將跳轉至最近的一個標號。
==== willsort 編注 =====================================================
1)標號也稱作標簽(label)
2)標簽不能以大多數的非字母數字字符開始, 而文件名中則可以使用很多
3)當無法區別兩個標簽時, 將跳轉至位置最靠前的標簽
========================================================================
6、FOR
建立C:TEST7.BAT,文件內容如下:
@ECHO OFF
FOR %%C IN (*.BAT *.TXT *.SYS) DO TYPE %%C
運行:
C:>TEST7
執行以后,屏幕上會將C:盤根目錄下所有以BAT、TXT、SYS為擴展名的文件內容顯示出來(不包括隱藏文件)。
?
@echo off
set str=123456789
echo 第一個字符為:%str:~0,1%
echo 頭兩個字符為:%str:~0,2%
echo 頭5個字符為:%str:~0,5%
echo 去掉最后一個字符后的字符串為:%str:~0,-1%
echo 去掉最后3個字符后的字符串為:%str:~0,-3%
echo 第4個字符為:%str:~3,1%
echo 第4個及其之后的3個字符為:%str:~3,4%
echo 最后一個字符為:%str:~-1%
echo 最后一個字符為:%str:~-1,1%
echo 最后一個字符為:%str:~-1,2%
echo 倒數第4個字符為:%str:~-4,1%
echo 倒數第4個及其之后的字符為:%str:~-4%
echo 倒數第4個及其之后的1個字符為:%str:~-4,2%
echo 倒數第4個及其之后的2個字符為:%str:~-4,3%
pause
為了說明這個問題,我在這里把批處理取字符,做下進一步的解釋,希望對新手有所啟發
如下:
echo %var:~n,k%
我們在這里對每個參數做個說明:"%var",即我們要從中要截取字符的字符串." ~ "取字
符標志符(我是這么理解的),"n" 我們將其理解為指針,"k"我們將其理解為偏移地址.(注
:指針和偏移地址都是從零開始數的)
我們還是用namejm版主的例子做下說明:
@echo off
set str=123456789
rem 定義一個str字符串為123456789
echo 第一個字符為:%str:~0,1%
rem 指針為0,偏移地址為1,即從第0位開始,取1位
echo 頭兩個字符為:%str:~0,2%
rem 指針為0,偏移地址為2,即從第0位開始,取2位
echo 頭5個字符為:%str:~0,5%
rem?? 指針為0,偏移地址為5,即從第0位開始,取5位
echo 去掉最后一個字符后的字符串為:%str:~0,-1%
rem 當"k"為負值時,我們可以這樣理解:從指針開始處開始取其后面所有字符,然后減去
后面"abs(k)位"..所以這個句字我們可以做如下解釋:從第0位開始取其全部字符
為:123456789然后從后面減去abs(k)位,所以最后結果為:12345678
echo 去掉最后3個字符后的字符串為:%str:~0,-3%
rem?? 該句解釋同上↑
echo 最后一個字符為:%str:~-1%
rem?? 參數"n,"和"k"都可以為缺省,缺省"n,"時可以理解為:從abs(k)位開始取其全部
echo 倒數第4個及其之后的字符為:%str:~-4%
rem 解釋同上↑
echo 最后一個字符為:%str:~-1,1%
rem?? n為負值時,表示從后面開始截取字符,取k位(此時n應從1開始數)
echo 最后一個字符為:%str:~-1,2%
rem?? 解釋同上↑
echo 倒數第4個字符為:%str:~-4,1%
rem?? 解釋同上↑
echo 倒數第4個及其之后的1個字符為:%str:~-4,2%
rem?? 解釋同上↑
echo 倒數第4個及其之后的2個字符為:%str:~-4,3%
rem 解釋同上↑
pause
?
總結
- 上一篇: DOS 中for遍历文件内容
- 下一篇: 批处理 正则表达式(findstr) 整