bat
1. 打印變量
? ?set a = 123
? ?echo %a%
2. if errorlevel?
測試前一程序的返回狀態(tài)。如果該程序的返回狀態(tài)大與或等于所說明的值就執(zhí)行所說明的DOS命令
if errorlevel 命令讓批處理文件測試一程序的返回狀態(tài)值,然后根據測試結果作相應的進一步處理,當
MS-DOS遇到一條 IF errorlevel 命令時,它就將前一條MS-DOS命令的返回狀態(tài)值與在IF命令中所說的值想比較,如果該程序的返回狀態(tài)大于或等于IF命令所說明的值MS-DOS就執(zhí)行 相應的命令,如果返回狀態(tài)值小于所說明的值,MS-DOS就從批處理文件中的下一條命令繼續(xù)執(zhí)行,如果用的是IF NOT ERRORLEVEL命令,就正好相反
3. call有幾種用法
?1) 第一種用法,也就是最常用的一種,調用另一個批處理,在被調用的批處理執(zhí)行完后在執(zhí)行call下面的命令。如:
@echo off
call a.bat
dir c:\
pause
2) 調用一個命令,如:call ping 127.1,這和直接ping 127.1看似是一樣的,但還是有區(qū)別的。主要用法就是call set,在后面講延遲環(huán)境變量的時候慢慢體會。
3) 第三種用法,調用一個應用程序,call notepad.exe。call可以這么用,但一般在調用應用程序的時候會使用start,很少用call。
4) 第四種用法,調用本批處理中的一個標簽。如:
@echo off
call :no1
start notepad.exe
exit
:no1
start calc
ping /n 2 127.1>nul
在這里會先打開計算器,然后打開記事本。在call標簽的時候要加上“:”。
這與goto有什么區(qū)別呢?在看一個例子:
@echo off
goto :no1
start notepad.exe
exit
:no1
start calc
ping /n 2 127.1>nul
這里只會打開計算器,并不打開記事本。
因為,goto :no1是轉到標簽:no1處運行,運行完就退出,而call是調用:no1,運行完繼續(xù)執(zhí)行call下面的命令
4. %cd%與%~dp0
%cd%代表的是執(zhí)行文件的當前目錄,強調bat是在哪里啟動的
%~dp0代表的是bat文件所在的文件目錄,強調bat的文件位置?
5. Bat 批處理之 for/f 詳解
含有/F的for
格式:
FOR /F ["options"] %%i IN (file) DO command
FOR /F ["options"] %%i IN ("string") DO command
FOR /F ["options"] %%i IN ('command') DO command
這個可能是最常用的,也是最強的命令,主要用來處理文件和一些命令的輸出結果。
file代表一個或多個文件
string 代表字符串
command代表命令
["options"] 可選
對于FOR /F %%i IN (file) DO command
file為文件名,按照官方的說法是,for會依次將file中的文件打開,并且在進行到下一個文件之前將每個文件讀取到內存,按照每一行分成一個一個的元素,忽略空白的行,看個例子。
假如文件a.txt中有如下內容:
第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
你想顯示a.txt中的內容,會用什么命令呢?當然是type,type a.txt
for也可以完成同樣的命令:
for /f %%i in (a.txt) do echo %%i
還是先從括號執(zhí)行,因為含有參數/f,所以for會先打開a.txt,然后讀出a.txt里面的所有內容,把它作為一個集合,并且以每一行作為一個元素,所以會產生這樣的集合,
{“第1行第1列 第1行第2列 第1行第3列”, //第一個元素
“第2行第1列 第2行第2列 第2行第3列”, //第二個元素
“第3行第1列 第3行第2列 第3行第3列”} ? //第三個元素
集合中只有3個元素,同樣用%%i依次代替每個元素,然后執(zhí)行do后面的命令。
具體過程:
用%%i代替“第1行第1列 第1行第2列 第1行第3列”,執(zhí)行do后面的echo %%i,顯示“第1行第1列 第1行第2列 第1行第3列”,
用%%i代替“第2行第1列 第2行第2列 第2行第3列”,執(zhí)行echo %%i,顯示“第2行第1列 第2行第2列 第2行第3列”,
依次,直到每個元素都代替完為止。
為了加強理解/f的作用,請執(zhí)行一下兩個命令,對比即可明白:
for /f %%i in (a.txt) do echo %%i //這個會顯示a.txt里面的內容,因為/f的作用,會讀出a.txt中的內容。
for %%i in (a.txt) do echo %%i //而這個只會顯示a.txt這個名字,并不會讀取其中的內容。
通過上面的學習,我們發(fā)現(xiàn)for /f會默認以每一行來作為一個元素,但是如果我們還想把每一行再分解更小的內容,該怎么辦呢?不用擔心,for命令還為我們提供了更詳細的參數,使我們將每一行分為更小的元素成為可能。
它們就是:delims和tokens
delims 用來告訴for每一行應該拿什么作為分隔符,默認的分隔符是空格和tab鍵
比如,還是上面的文件,我們執(zhí)行下面的命令:
for /f "delims= " %%i in (a.txt) do echo %%i
顯示的結果是:
第1行第1列
第2行第1列
第3行第1列
為什么是這樣的呢。因為這里有了delims這個參數,=后面有一個空格,意思是再將每個元素以空格分割,默認是只取分割之后的第一個元素。
執(zhí)行過程是:
將第一個元素“第1行第1列 第1行第2列 第1行第3列”分成三個元素:“第1行第1列” “第1行第2列” “第1行第3列”,它默認只取第一個,即“第1行第1列”,然后執(zhí)行do后面的命令,依次類推。
但是這樣還是有局限的,如果我們想要每一行的第二列元素,那又如何呢?
這時候,tokens跳出來說,我能做到。
它的作用就是當你通過delims將每一行分為更小的元素時,由它來控制要取哪一個或哪幾個。
還是上面的例子,執(zhí)行如下命令:
for /f "tokens=2 delims= " %%i in (a.txt) do echo %%i
執(zhí)行結果:
第1行第2列
第2行第2列
第3行第2列
如果要顯示第三列,那就換成tokens=3。
同時tokens支持通配符*,以及限定范圍。
如果要顯示第二列和第三列,則換成tokens=2,3或tokens=2-3,如果還有更多的則為:tokens=2-10之類的。
此時的命令為:
for /f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j
怎么多出一個%%j?
這是因為你的tokens后面要取每一行的兩列,用%%i來替換第二列,用%%j來替換第三列。
并且必須是按照英文字母順序排列的,%%j不能換成%%k,因為i后面是j
執(zhí)行結果為:
第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列
對以通配符*,就是把這一行全部或者這一行的剩余部分當作一個元素了。
比如:
for /f "tokens=* delims= " %%i in (a.txt) do echo %%i
執(zhí)行結果為:
第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
其實就跟for /f %%i in (a.txt) do echo %%i的執(zhí)行結果是一樣的。
再如:
for /f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j
執(zhí)行結果為:
第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列
用%%i代替第二列,用%%j代替剩余的所有
最后還有skip合eol,這倆個簡單,skip就是要忽略文件的前多少行,而eol用來指定當一行以什么符號開始時,就忽略它。
比如:
for /f "skip=2 tokens=*" %%i in (a.txt) do echo %%i
結果為:
第3行第1列 第3行第2列 第3行第3列
用skip來告訴for跳過前兩行。
如果不加tokens=*的話,執(zhí)行結果為:
第3行第1列
不知道怎么回事。
再如,當a.txt內容變成:
第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
執(zhí)行for /f "eol=. tokens=*" %%i in (a.txt) do echo %%i結果是:
第3行第1列 第3行第2列 第3行第3列
用eol來告訴for忽略以“.”開頭的行。
同樣也必須加tokens=*,否則只會顯示“第3行第1列”?
6. PUSHD命令
保存當前目錄以供 POPD 命令使用,然后改到指定的目錄。?
PUSHD [path | ..]?
path 指定要成為當前目錄的目錄。?
如果命令擴展被啟用,除了一般驅動器號和路徑,PUSHD?
命令還接受網絡路徑。如果指定了網絡路徑,PUSHD 將創(chuàng)建一個?
指向指定網絡資源的臨時驅動器號,然后再用剛定義的驅動器?
號更改當前的驅動器和目錄。可以從 Z: 往下分配臨時驅動器?
號,使用找到的第一個沒有用過的驅動器號。?
7. POPD命令?
更改到 PUSHD 命令存儲的目錄。?
如果命令擴展被啟用,從推目錄堆棧 POPD 驅動器時,POPD?
命令會刪除 PUSHD 創(chuàng)建的臨時驅動器號。
例如?
pushd c:就是記錄下c:盤當你轉去E:盤后用popd就可以轉回c盤
總結
                            
                        - 上一篇: XSS(跨站脚本攻击)攻击与防御
 - 下一篇: 简析web注入攻击