預(yù)定義的變量
下面是些已經(jīng)被底層定義好可以直接使用的變量:不會出現(xiàn)在 SET 顯示的變量列表中
%CD% - 擴展到當(dāng)前目錄字符串。
%DATE% - 用跟 DATE 命令同樣的格式擴展到當(dāng)前日期。
%TIME% - 用跟 TIME 命令同樣的格式擴展到當(dāng)前時間。
%RANDOM% - 擴展到 0 和 32767 之間的任意十進制數(shù)字。
%ERRORLEVEL% - 擴展到當(dāng)前 ERRORLEVEL 數(shù)值。
%CMDEXTVERSION% - 擴展到當(dāng)前命令處理器擴展名版本號。
%CMDCMDLINE% - 擴展到調(diào)用命令處理器的原始命令行。
%0 bat的完整路徑名如"C:\Windows\system32\xxx.bat"
%1 bat參數(shù)1依次類推%2參數(shù)2...
%path% - 當(dāng)前的環(huán)境變量。以分號隔開的路徑列表,路徑可包含空格,可以以'\'結(jié)尾, 可以以雙引號包圍之。
參數(shù)%0具有特殊的功能,可以調(diào)用批處理自身,以達到批處理本身循環(huán)的目的,也可以復(fù)制文件自身等等。
例:最簡單的復(fù)制文件自身的方法
copy %0 d:\wind.bat
擴展變量
@ 與%i相關(guān)的變量(bat參數(shù)或者for循環(huán)的%i)
假設(shè)文件為C:\Documents and Settings\jinsun\桌面\ParseSinglePkgs.bat
%0 C:\Documents and Settings\jinsun\桌面\ParseSinglePkgs.bat
%~dp0 C:\Documents and Settings\jinsun\桌面\
%cd% C:\Documents and Settings\jinsun\桌面
%~nx0 ParseSinglePkgs.bat
%~n0 ParseSinglePkgs
%~x0 .bat
@ 與%VAR%相關(guān)的變量
%VAR:str1=str2% 會將VAR中的str1替換為str2(str2如果為空則可以達到刪除的效果,str1前可以加*,變量%ABC:*B=%是C)
%VAR:~0,-2% 會提取VAR 變量的所有字符,除了最后兩個
%VAR:~2% 會提取VAR 變量的除前兩個的所有字符
%VAR:~-2% 會提取VAR 變量的最后兩個
%VAR:~2,5% 提取從第2個字符開始的5個字符
========================================================
在bat文件中,多個命令寫在一行或括號內(nèi),如果使用行內(nèi)或括號內(nèi)定義或修改的變量,需要啟用延遲變量擴充,用嘆號引用變量。
bat文件中用 setlocal enabledelayedexpansion 啟用延遲變量擴充,命令提示符窗口啟用延遲變量擴充,用 cmd /v:on
ren命令中的文件名最好加引號,防止文件名包含空格等特殊字符造成的錯誤。
cd /d %~dp0
批處理文件中的一條語句
意思是 更改當(dāng)前目錄為批處理本身的目錄
比如你有個批處理a.bat在D:\qq文件夾下
a.bat內(nèi)容為
cd /d %~dp0
在這里
cd /d 表示直接轉(zhuǎn)換到后面的路徑,否則如果切換盤符,就需要再輸入盤符才能切換路徑
cd /d %~dp0的意思就是cd /d d:\qq
%0代表批處理本身 d:\qq\a.bat
~dp是變量擴充
d既是擴充到分區(qū)號 d:
p就是擴充到路徑 \qq
dp就是擴充到分區(qū)號路徑 d:\qq
%0代指批處理文件自身
%~d0 是指批處理所在的盤符
%~dp0 是盤符加路徑
cd %~dp0 就是進入批處理所在目錄了
%cd%
%cd%代表當(dāng)前執(zhí)行批處理文件的路徑(當(dāng)前路徑)
echo %cd%
%CD% 當(dāng)前文件目錄,不顯示文件名,切通過其找到其他文件
%0 當(dāng)前文件本身,包含完整路徑名和文件名
如 "C:\Windows\system32\xxx.bat",是一個路徑字符串,有引號
*.* 代表所有文件
>和>>它們的作用都是改變各種提示信息的輸出方向,把提示信息輸出到指定的地方去——各種提示信息默認是輸出到屏幕上去的。
單個的>表示以覆蓋方式重定向提示信息,也就是說如果目的地原來有內(nèi)容,將把原來的內(nèi)容清除掉,用新內(nèi)容填充;
>>表示以追加的方式重定向提示信息,也就是說,如果目的地原來有內(nèi)容,原有的內(nèi)容將保持不變,在原有內(nèi)容之后追加新內(nèi)容。
例如:假設(shè)d:\test.txt中的內(nèi)容是:I Love batch。那么,在cmd窗口中,分別使用如下兩條語句:echo me,too>d:\test.txt和echo me,too>>d:\test.txt,將會發(fā)現(xiàn),使用第一條語句之后,test.txt中只有一行內(nèi)容:me,too,而使用第二條語句之后,test.txt中將有兩行內(nèi)容,分別是I Love batch和me,too。
例如:tree /?>help.txt,這條命令語句就把 tree 命令的幫助信息重定向到了help.txt文件中,
help>nul 就把 help 命令的提示信息重定向到了空設(shè)備中去(nul表示空設(shè)備)。
| 命令管道符
格式:第一條命令 | 第二條命令 [| 第三條命令...]
將第一條命令的結(jié)果作為第二條命令的參數(shù)來使用,記得在unix中這種方式很常見。
例如:
dir c:\|find "txt"
以上命令是:查找C:\所有,并發(fā)現(xiàn)TXT字符串。
md
如果要創(chuàng)建的文件夾帶有空格或&,需要用引號把文件夾名括起來,例如:md "test abc"、md "abc&xyz"。
如果不使用引號,又會帶來什么后果呢?
1、如果文件夾名帶空格,那么,md test abc 語句會在當(dāng)前目錄下創(chuàng)建test和abc這兩個文件夾;利用這個特點,如果要創(chuàng)建abc def xyz這三個文件夾,直接使用 md abc def xyz 就行了,而無需連寫三條md語句。
當(dāng)然,md abc;def;xyz或者md abc,def,xyz 這樣的寫法也是可以的。
2、如果文件夾名中含有&,那么,md abc&xyz 會創(chuàng)建abc這個文件夾,并提示說:'xyz'不是內(nèi)部或外部命令,也不是可運行的程序或批處理文件,這是因為,&是復(fù)合語句的連接符號,它把前后兩部分視為兩條子語句了。
忠告:如果文件夾名含有特殊符號,請不要忘記使用雙引號!
md創(chuàng)建中級目錄。也就是說,md a\b\c這樣的命令,可以在當(dāng)前目錄下建立文件夾a,然后,在a下建立文件夾b,b之下再建立文件夾c
echo on/off
on 和 off 都是echo 的關(guān)鍵字,所謂關(guān)鍵字就是系統(tǒng)規(guī)定、有特殊用途的字符。
echo on 是打開回顯,echo off 是關(guān)閉回顯。
系統(tǒng)默認是echo on,所以每次為了關(guān)閉回顯,都會在代碼的行首加上echo off,加以關(guān)閉。
不關(guān)閉回顯,連執(zhí)行的命令符都會顯示出來,所以一般會關(guān)閉。
前面加上@又是為什么?
echo off只能關(guān)閉 echo off后面的代碼的回顯,但不能關(guān)閉自身的回顯。所以需要加上@關(guān)閉自身。
echo.
echo 后加一點表示換行,真奇葩的設(shè)計。
findstr默認是區(qū)分大小寫的(跟find命令一樣)
findstr /vm "^teststring" *.txt
findstr /v /m "teststring" *.txt
/i 不區(qū)分大小寫 (/ignore)
/V 只打印不包含匹配的行。
/M 如果文件含有匹配項,只打印其文件名。
啟動一個程序
call與start區(qū)別
start upload.bat
不會等upload.bat執(zhí)行完再執(zhí)行下一條, 如此可實現(xiàn)同時執(zhí)行多條命令.
call upload.bat
call 命令 是要等調(diào)用的程序結(jié)束以后才運行下面的命令.
特殊符號
&:第一條命令 & 第二條命令 [& 第三條命令...]
用這種方法可以同時執(zhí)行多條命令,而不管命令是否執(zhí)行成功。
&&:第一條命令 && 第二條命令 [&& 第三條命令...]
當(dāng)碰到執(zhí)行出錯的命令后將不執(zhí)行后面的命令,如果一直沒有出錯則一直執(zhí)行完所有命令。
||:第一條命令 || 第二條命令 [|| 第三條命令...]
當(dāng)碰到執(zhí)行正確的命令后將不執(zhí)行后面的命令,如果沒有出現(xiàn)正確的命令則一直執(zhí)行完所有命令;
========================================================
- @echo off
- for /? > for.txt
- set /? > set.txt
- shift /? >shift.txt
- exit
@echo off for /? > for.txt set /? > set.txt shift /? >shift.txt exit
執(zhí)行后在當(dāng)前路徑下就生成for.txt、set.txt和shift.txt三個文件,里面分別記錄了for命令、set命令和shift命令的幫助信息。
1.Echo 命令
打開回顯或關(guān)閉請求回顯功能,或顯示消息。
如果沒有任何參數(shù),echo 命令將顯示當(dāng)前回顯設(shè)置。
語法
echo [{on|off}] [message]
Sample:
@echo off / echo hello world
在實際應(yīng)用中我們會把這條命令和重定向符號(也稱為管道符號,一般用> >> ^)結(jié)合來實現(xiàn)輸入一些命令到特定格式的文件中.這將在以后的例子中體現(xiàn)出來。
2.@ 命令
表示不顯示@后面的命令
在入侵過程中(例如使用批處理來格式化敵人的硬盤)自然不能讓對方看到你使用的命令啦。
Sample:@echo off
@echo Now initializing the program,please wait a minite...
@format X: /q/u/autoset (format 這個命令是不可以使用/y這個參數(shù)的,可喜的是微軟留了個autoset這個參數(shù)給我們,效果和/y是一樣的。)
3.Goto 命令
指定跳轉(zhuǎn)到標(biāo)簽,找到標(biāo)簽后,程序?qū)⑻幚韽南乱恍虚_始的命令。
語法:goto label (label是參數(shù),指定所要轉(zhuǎn)向的批處理程序中的行。)
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
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
標(biāo)簽的名字可以隨便起,但是最好是有意義的字母啦,字母前加個:用來表示這個字母是標(biāo)簽,goto命令就是根據(jù)這個:來尋找下一步跳到到那里。最好有一些說明這樣你別人看起來才會理解你的意圖啊。
4.Rem 命令
注釋命令,在C語言中相當(dāng)與/*--------*/,它并不會被執(zhí)行,只是起一個注釋的作用,便于別人閱讀和你自己日后修改。
Rem Message
Sample:
@Rem Here is the description.
注釋可以使用Rem,也可以使用雙冒號即::
5.Pause 命令
運行 Pause 命令時,將顯示下面的消息:
Press any key to continue . . .
- @echo off
- :begin
- copy a:*.* d:\back
- echo Please put a new disk into driver A
- pause
- goto begin
@echo off :begin copy a:*.* d:\back echo Please put a new disk into driver A pause goto begin
在這個例子中,驅(qū)動器 A 中磁盤上的所有文件均復(fù)制到d:\back中。顯示的注釋提示您將另一張磁盤放入驅(qū)動器 A 時,pause 命令會使程序掛起,以便您更換磁盤,然后按任意鍵繼續(xù)處理。
6.Call 命令
call命令用來從一個批處理腳本中調(diào)用另一個批處理腳本
如果在腳本或批處理文件外使用 Call,它將不會在命令行起作用。
語法
call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
參數(shù)
[Drive:}[Path] FileName
指定要調(diào)用的批處理程序的位置和名稱。filename 參數(shù)必須具有 .bat 或 .cmd 擴展名。
- call mvn clean
call mvn clean
7.start 命令
調(diào)用外部程序,所有的DOS命令和命令行程序都可以由start命令來調(diào)用。
入侵常用參數(shù):
MIN 開始時窗口最小化
SEPARATE 在分開的空間內(nèi)開始 16 位 Windows 程序
HIGH 在 HIGH 優(yōu)先級類別開始應(yīng)用程序
REALTIME 在 REALTIME 優(yōu)先級類別開始應(yīng)用程序
WAIT 啟動應(yīng)用程序并等候它結(jié)束
parameters 這些為傳送到命令/程序的參數(shù)
執(zhí)行的應(yīng)用程序是 32-位 GUI 應(yīng)用程序時,CMD.EXE 不等應(yīng)用程序終止就返回命令提示。如果在命令腳本內(nèi)執(zhí)行,該新行為則不會發(fā)生。
8.choice 命令
choice 此命令可以讓用戶輸入一個字符,從而運行不同的命令。使用時應(yīng)該加/c:參數(shù),c:后應(yīng)寫提示可輸入的字符,之間無空格。它的返回碼為1234……
如: choice /c:dme defrag,mem,end
將顯示
defrag,mem,end[D,M,E]?
- @echo off
- choice /c:dme defrag,mem,end
- if errorlevel 3 goto defrag (應(yīng)先判斷數(shù)值最高的錯誤碼)
- if errorlevel 2 goto mem
- if errotlevel 1 goto end
- :defrag
- c:\dos\defrag
- goto end
- :mem
- mem
- goto end
- :end
- echo good bye
@echo off choice /c:dme defrag,mem,end if errorlevel 3 goto defrag (應(yīng)先判斷數(shù)值最高的錯誤碼) if errorlevel 2 goto mem if errotlevel 1 goto end :defrag c:\dos\defrag goto end :mem mem goto end :end echo good bye
此文件運行后,將顯示 defrag,mem,end[D,M,E]? 用戶可選擇d m e ,然后if語句將作出判斷,d表示執(zhí)行標(biāo)號為defrag的程序段,m表示執(zhí)行標(biāo)號為mem的程序段,e表示執(zhí)行標(biāo)號為end的程序段,每個程序段最后都以goto end將程序跳到end標(biāo)號處,然后程序?qū)@示good bye,文件結(jié)束。
9.If 命令
if 表示將判斷是否符合規(guī)定的條件,從而決定執(zhí)行不同的命令。 有三種格式:
1、if "參數(shù)" == "字符串" 待執(zhí)行的命令
檢測字符串
(注意,用if檢測字符串是否相等的時候,后面用的不是“=”,而是“==”)
參數(shù)如果等于指定的字符串,則條件成立,運行命令,否則運行下一句。(注意是兩個等號)
如if "%1"=="a" format a:
if {%1}=={} goto noparms
if {%2}=={} goto noparms
檢測數(shù)值:(注意,批處理中大于符號不能用:“>”,而用"gtr",其它的也類似)
比較運算符一覽:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
- @echo off
- set /a num1=20
- set /a num2=15
- if %num1% gtr %num2% echo %num1%大于%num2%
- if %num1% EQU %num2% echo %num1%等于%num2%
- if %num1% LSS %num2% echo %num1%小于%num2%
- pause>nul
@echo off set /a num1=20 set /a num2=15 if %num1% gtr %num2% echo %num1%大于%num2% if %num1% EQU %num2% echo %num1%等于%num2% if %num1% LSS %num2% echo %num1%小于%num2% pause>nul
2、if exist 文件名 待執(zhí)行的命令
如果有指定的文件,則條件成立,運行命令,否則運行下一句。
如if exist config.sys edit config.sys
3、if errorlevel / if not errorlevel 數(shù)字 待執(zhí)行的命令
如果返回碼等于指定的數(shù)字,則條件成立,運行命令,否則運行下一句。
說明:環(huán)境變量errorlevel的初始值為0,當(dāng)一些命令執(zhí)行不成功,就會返回一個數(shù)值,如:1 ,2 等
如if errorlevel 2 goto x2
DOS程序運行時都會返回一個數(shù)字給DOS,稱為錯誤碼errorlevel或稱返回碼,常見的返回碼為0、1。
IF [NOT] ERRORLEVEL number do command
IF [NOT] string1==string2 do command
IF [NOT] EXIST filename do command
10.for 命令
for 命令是一個比較復(fù)雜的命令,主要用于參數(shù)在指定的范圍內(nèi)循環(huán)執(zhí)行命令。
在批處理文件中使用 FOR 命令時,指定變量請使用 %%variable
在批處理文件中使用 FOR 命令時,指定變量請使用 %%variable而不要用 %variable。變量名稱是區(qū)分大小寫的,所以 %i 不同于 %I
for /f %%i in (a.txt) do echo %%i
//這個會顯示a.txt里面的內(nèi)容,因為/f的作用,會讀出a.txt中的內(nèi)容。
for %%i in (a.txt) do echo %%i
//而這個只會顯示a.txt這個名字,并不會讀取其中的內(nèi)容。
for %%a in (c:\*.*) do echo %%a
::顯示C盤根目錄下所有非隱藏、非系統(tǒng)屬性文件
::只顯示文件,不顯示文件夾
一、/d
(只搜索目錄,不搜索文件)
格式:FOR /D %variable IN (set) DO command [command-parameters]
for /d %%i in (c:/*) do echo %%i --顯示c盤根目錄下的所有目錄
for /d %%i in (???) do echo %%i --顯示當(dāng)前目錄下名字只有1-3個字母的目錄(注意是目錄)
二、/R
(只搜索文件,不搜索目錄)
(搜索指定路徑及所有子目錄中與set相符合的所有文件)
格式:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
for /r c:/ %%i in (boot.ini) do echo %%i
--枚舉了c盤所有目錄,找到含有boot.ini的路徑并顯示
for /r d:/backup %%i in (1) do echo %%i
--枚舉d/backup目錄,現(xiàn)在當(dāng)前路徑和當(dāng)前路徑下所有文件夾,不過后面帶了個1
d:\backup\1
for /r c:/ %%i in (boot.ini) do if exist %%i echo %%i
--很好的搜索命令,列舉boot.ini存在的目錄
三、/L
(以增量形式從開始到結(jié)束的一個數(shù)字序列??梢允褂秘摰?Step)
格式:FOR /L %variable IN (start,step,end) DO command [command-parameters]
該集表示以增量形式從開始到結(jié)束的一個數(shù)字序列??梢允褂秘摰?Step
示例:
for /l %%i in (1,1,5) do @echo %%i --輸出1 2 3 4 5
for /l %%i in (1,2,10) do @echo %%i --輸出1,3,5,7,9
for /l %%i in (100,-20,1) do @echo %%i --輸出100,80,60,40,20
for /l %%i in (1,1,5) do start cmd --打開5個CMD窗口
for /l %%i in (1,1,5) do md %%i --建立從1~5共5個文件夾
for /l %%i in (1,1,5) do rd /q %%i --刪除從1~5共5個文件夾
========================================================
setlocal 與 變量延遲
例1:
@echo off
set a=4
set a=5 & echo %a%
pause
結(jié)果:4
解說:為什么是4而不是5呢?在echo之前明明已經(jīng)把變量a的值改成5了?
(set a=5
echo %a%
::這種情況a直接是5
)
讓我們先了解一下批處理運行命令的機制:
批處理讀取命令時是按行讀取的(另外例如for命令等,其后用一對圓括號閉合的所有語句也當(dāng)作一行),在處理之前要完成必要的預(yù)處理工作,這其中就包括對該行命令中的變量賦值。我們現(xiàn)在分析一下例1,批處理
在運行到這句“set a=5 & echo %a%”之前,先把這一句整句讀取并做了預(yù)處理——對變量a賦了值,那么%a%當(dāng)然就是4了?。]有為什么,批處理就是這樣做的。)
而為了能夠感知環(huán)境變量的動態(tài)變化,批處理設(shè)計了變量延遲。簡單來說,在讀取了一條完整的語句之后,不立即對該行的變量賦值,而會在某個單條語句執(zhí)行之前再進行賦值,也就是說“延遲”了對變量的賦值。
那么如何開啟變量延遲呢?變量延遲又需要注意什么呢?舉個例子說明一下:
例2:
@echo off
setlocal enabledelayedexpansion
set a=4
set a=5 & echo !a!
pause
結(jié)果:5
解說:啟動了變量延遲,得到了正確答案。變量延遲的啟動語句是“setlocal enabledelayedexpansion”,并且變量要用一對嘆號“!!”括起來(注意要用英文的嘆號),否則就沒有變量延遲的效果。
分析一下例2,首先“setlocal enabledelayedexpansion”開啟變量延遲,然后“set a=4”先給變量a賦值為4,“set a=5 & echo !a!”這句是給變量a賦值為5并輸出(由于啟動了變量延遲,所以批處理能夠感知到動態(tài)變化,即不是先給該行變量賦值,而是在運行過程中給變量賦值,因此此時a的值就是5了)。
再舉一個例子鞏固一下。
例3:
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,5) do (
set a=%%i
echo !a!
)
pause
結(jié)果:
1
2
3
4
5
(若不加延遲變量,則會輸出幾個!a!字符)
解說:本例開啟了變量延遲并用“!!”將變量擴起來,因此得到我們預(yù)期的結(jié)果。如果不用變量延遲會出現(xiàn)什
么結(jié)果呢?結(jié)果是這樣的:
ECHO 處于關(guān)閉狀態(tài)。
ECHO 處于關(guān)閉狀態(tài)。
ECHO 處于關(guān)閉狀態(tài)。
ECHO 處于關(guān)閉狀態(tài)。
ECHO 處于關(guān)閉狀態(tài)。
即沒有感知到for語句中的動態(tài)變化。
========================================================
【續(xù)】[一日一教學(xué)]批處理系列帖子索引 http://www./thread-13798-1-1.html
|
。。