[b]dos批處理檔案bat的編寫[/b]
最近由於工作的原因,總是需要些一些命令列下的批處理檔案,這些擴充套件名為".bat"的檔案,是從dos時代一路傳承下來的,所以我們總是喜歡叫他bat檔案。從上大學的時候,一直用bat做一些小的東西,從來沒有感受到過它的威力,最近用它做一些工作,發現這個東西還真的比較有意思。總結一下,希望對大家的工作能有所幫助。bat有傳統的模式,和command extensions兩種模式,擴充套件用法通常是指後者。
最常用的命令:call,echo,for,goto,if,pause,rem,shift
call 命令:呼叫另外的乙個批處理檔案。常用的方式就是:"call sample.bat",新擴充套件的乙個用法是 "call :label arguments",也就是說,你可以用call來呼叫bat檔案內部的一段指令碼,用exit來退出當前的call呼叫。如果配合goto語句的話,實際上是擴充套件的bat檔案支援了乙個ugly的函式。
這裡需要注意的是,batch指令碼的引數(%0 %1 ...)有了一些新的變化:
%* 表示這個批處理檔案的所有的引數(%1 %2 ....)
對於每乙個%n還有一些擴充套件:
%~1 刪除%1的兩端的雙引號
%~f1 擴充套件成%1的全部檔名
%~d1 獲取%1的碟符
%~p1 獲取%1的檔案路徑
%~n1 獲取%1的檔名稱
%~x1 獲取%1的副檔名
%~s1 獲取短檔名
%~a1 獲取檔案的屬性
%~t1 獲取檔案的時間
%~z1 獲取檔案的大小
%~$path:1 從指定的path環境變數中查詢%1並且擴充套件成全檔名
而且上面的還可以組合,例如:
%~dp1 把%1擴充套件成碟符和路徑
%~nx1 把%1擴充套件成檔名和副檔名
%~dp$path:1 從制定的path中搜尋%1,並且擴充套件成碟符和路徑的形式
%~ftza1 擴充套件成dir類似的輸出結果,檔名 時間 大小 屬性
echo
用來顯示一段文字,沒有什麼好說的。
goto
用來進行跳**
goto end
:end
也沒有什麼好說的。
for 命令:
這個裡面最複雜的乙個命令。
基本形式:
for %variable in (set) do command [command-parameters]
需要注意的是,這裡的variable一定是單個字元的。set可以是乙個或者多個檔案,也可以使用萬用字元:
for %f in (*.txt *.log) do type %f
表示查詢當前目錄下所有的.txt,.log,在螢幕上列印它的內容。
這裡需要注意的是,do後面可以加()來執行多行的語句;
for %%f in ( *.txt ) do (
echo process %%f...
type %%f
)對於擴充套件的for語句,有如下的幾種形式:
for /d %variable in (set) do command [command-parameters]
對目錄進行操作
for /r [[driver:]path] %varable in (set) do command [command-parameters]
對乙個路徑下的所有的目錄作指定的操作
for /l %variable in (start,step,end) do command [command-parameters]
產生乙個列表,例如(1,1,5) 則產生乙個(1 2 3 4 5)的列表
for /f ["options"] %variable in (file-set|"string"|'command') do command [command-parameters]
這個命令分三種情況,第乙個是乙個檔案的集合,這種情況下,所有的這些檔案都會被開啟,命令將處理檔案的內容。如果in的括號裡面是有雙引號的,則是處理這個字串。如果括號裡面的是單引號的話,則是處理執行命令以後的結果。如果指定了usebackq的話,則單引號表示的是字串,反向的單引號表示執行的命令,這個時候雙引號可以用來把包含空格的路徑括起來。
乙個乙個的解釋,首先是options,options有如下的選項:
eol=c 只能指定乙個字元,以此開始的為注釋行。
skip=n 跳過檔案的n行
delims=*** 指出分隔符的結合。預設的是空格和tab
tokens=x,y,m-n,* 指定獲取的token.
usebackq 使用反單引號(~鍵一起的那個)
例如:for /f "eol=; token=2,3* delims=, " %i in ( myfile.txt ) do @echo %i %j %k
解析myfile.txt,忽略分號開始的行,%i是第二個,%j是第三個,%k是剩下的所有。
這裡需要注意的是,上面%~進行擴充套件的那些東西,對於for迴圈中的檔案變數也是有效的。
for %z in (*.txt) do (
echo %~fz
)上面的命令就是用來顯示全路徑名的。
if命令:
if命令以供有三種形式:
if [not] errorlevel number command
if [not] string1 == string2 command
if [not] exists file command
非常簡單,沒有什麼好說的,擴充套件的命令如下:
if [/i] string1 compare-op string2 command
if cmdextversion number command
if defined variable command
比較操作符如下:
equ,neq,less,leq,gtr,geq,不多說了,很簡單。
/i標誌增加的時候,忽略大小寫。
cmdextversion有點像errorlevel,不同的是他和commend extensions的內部數字作比較。
defined用來判斷乙個環境變數是不是被定義。
可以用%errorlevel%,%cmdextversion%,%cmdcmdline%作變數用,前面兩個很好理解,最後乙個就是輸入的命令列。
注意if errorlevel命令,這個判斷的是上乙個命令的結果,所以一定按照errorlevel從大到小的順序進行判斷。
pause命令:
讓程式停下來等按鍵,沒有什麼好說的。
rem命令,注釋,僅此而已
shift命令:
shift /2
修改引數的位置,從第二個引數開始,把後面的乙個引數超前挪動一位。%3=>%2,%4=>%3,%0,%1不變。
choice命令:
提示使用者作出選擇的命令;支援如下的引數
/c xnc 給出x,n,c三個選擇
/n 隱藏提示資訊
/cs 支援大小寫
/t 10 10秒超時
/d 預設選擇
/m text 提示資訊
字串操作:
操作方法一,用for命令來進行操作。
操作方法二,%variable:~start,length%從變數中擷取字串。%variable:replace=candicate%來替換字串。
set操作:
設定變數,可選的引數是:
/a 用來進行數**算,支援與c語言一樣的操作符
/p 根據使用者的輸入來設定環境變數
表示式運算:
呼叫expr來運算。
還可以set /a進行
其他的注意事項:
在寫bat檔案的時候,一定要注意在開始和結束的時候setlocal enabledelayedexpansion/endlocal這樣你改變的環境不會影響到外面。
最容易出錯的地方:
錯誤的方法:
for ...... do (
set /a index+=1
use .... %index% ...
)這裡所有的%index%都是初始值,而不是你想要的。
下面的才是正確的:
for ...... do (
set /a index+=1
use ... !index!...
)
批處理檔案 bat 編寫
下面記錄一下.bat檔案編寫格式 echo off start echo 請輸入數字選擇下一步操作 echo 1 ip設定為會議室 echo 2 設定為dhcp自動獲取ip set p var if var 1 goto ip1 if var 2 goto ipdhcp ip1 clsnetsh i...
bat批處理檔案
你在1.bat檔案裡寫上 echo 1 g 最終效果是 1.bat echo 1 g 即,bat檔案裡的每一行都會出現在命令列裡!如果不想顯示在命令列裡 1,要麼bat檔案裡,每一行前面都加上 表示這個命令不顯示在命令列裡 2,要麼在bat檔案開頭,寫echo off 下面的命令 都不會出現在命令列...
DOS批處理檔案
dos下的可執行檔案有三種,分別是exe,com和bat。其中,exe和com檔案都是二進位制形式的,只有bat檔案是文字形式的,可以直接閱讀。因此,bat檔案和以上二進位制可執行檔案相比,內容要簡單的多。這些檔案內包含著dos命令的集合,通常叫作批處理檔案。批處理檔案的組成雖然比較簡單,但其用處非...