Dos批處理檔案Bat的編寫

2021-08-30 07:13:56 字數 4121 閱讀 5148

[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命令的集合,通常叫作批處理檔案。批處理檔案的組成雖然比較簡單,但其用處非...