bat 批處理命令 檔案 類型 文法 格式 應用 詳解

來源:互聯網
上載者:User
bat 批處理命令 檔案 類型 文法 格式 應用 詳解

[
2005/08/23 00:12 | by bigfee
]

  咳。。。做人真累啊。半夜回到家還想寫點東西。不知道有多少人會看呢?不管了,別人不把他當成寶貝,咱自己留著當寶貝總是行的。

 
 大一的時候看了篇關於如何書寫bat檔案的文章。那時候看得很仔細,大概都看懂了。不過都2年了,基本上沒有碰過bat檔案,所以忘的都差不多了。今天
是離家前的倒數第二個晚上了,突然想重溫下bat檔案的文法,格式,所以網上找了些資料來,研究研究,把我看懂的東西盡量寫的白話一點,人人能看懂.希望
能和看這篇文章的人一起學習進步.

  大家知不知道預設共用這回事?這東西用不著的地方可就不是好東西了.所以就要刪掉.但這東西是每次系
統重起後都會重新建立的.所以每次都要重新開啟cmd重新刪掉一下.極為麻煩.但有了批次檔就不一樣了,先把命令輸入到批次檔中,然後加入到啟動
項中,每次啟動就會自動運行,免去了每次輸入命令的麻煩.至於怎麼寫這個批次檔嘛,到文章的結尾我會告訴大家的,但不知道在我寫完之前會不會睡著
呢?~

  如何建立批次檔?

    
不要聽了批次檔就感到很神氣,其實這東西很簡單的.你用過記事本沒有?用過? 好的.將記事本開啟,什麼都不用寫,然後選擇檔案,儲存.檔案類型選擇
所有檔案,檔案名稱則命名為 *.bat 這個*代表是檔案名稱,你可以隨便的起.儲存好之後,看看你儲存的地方,會出現一個白色視窗裡有個黃色齒輪的表徵圖.
這東西就是你建立的批次檔,雙擊他就可以運行,但他現在由於裡面沒有輸入任何命令,所以他運行了並不會做任何事情.當我們想往這個*.bat檔案中添
加東西時,只要右鍵選擇他,然後選擇編輯,就可以開啟記事本往內輸入命令了.

  批次檔中的命令是什嗎?

 
 批次檔中的命令暫時先可以理解為dos命令,等稍後深入理解了以後再進行解釋.批處理顧名思義就是一大堆東西堆在一起處理.換句話說就是往裡面寫一
條條dos命令,然後按順序挨個執行,效果跟你在cmd裡敲dos命令是一個效果.只不過用批處理寫好之後,要運行只要雙擊下就可以運行了.而不用再一遍
一遍的重複的往裡面打命令.這就是批次檔的好處.

  除了運行dos命令之外,他還可以支援選擇結構if,迴圈結構for,goto等,與c有點類似,但遠沒有c全面,並且編寫語言十分不規範.

  批處理文法:

先講個最基本的東西 @echo off

 
 echo的意思是迴旋,這裡的意思就是回顯,echo off意思就是關閉回顯.前面的@表示echo off
這一行也不會回顯你可以試著去掉@和整行去掉.@的另一個功能是在執行完批次檔時自動回復命令回顯。如果第一句用的是ECHO
OFF,那麼在執行完批次檔以後不會顯示命令提示字元。

舉個例子:如果我們先建立一個1.bat檔案,往裡面輸入:

dir 然後儲存在c:\下.然後我們運行cmd,進入c盤根目錄下,輸入1.bat,則顯示:

C:>dir
磁碟機 C 中的卷沒有標籤。
卷的序號是 0C5D-07FF

C: 的目錄

2004-08-25  00:45    <DIR>          WINDOWS
2004-08-25  00:51    <DIR>          Documents and Settings

...........

C:

如果將1.bat內容修改成

echo off

dir

然後再在cmd裡輸入1.bat,則會顯示

C:>echo off       //因為運行了echo off,所以沒有顯示dir命令,直接顯示了結果
磁碟機 C 中的卷沒有標籤。
卷的序號是 0C5D-07FF

C: 的目錄

2004-08-25  00:45    <DIR>          WINDOWS
2004-08-25  00:51    <DIR>          Documents and Settings

.....

C:

如果將1.bat檔案修改成:

@echo off
dir

則顯示成:

C:>1.bat         //與前面不同,並沒有顯示echo off,原因是加了@,所以不顯示@後面的內容.又因為加

        //了echo off,所以後面的命令不顯示,直接顯示結果
磁碟機 C 中的卷沒有標籤。
卷的序號是 0C5D-07FF

C: 的目錄

2004-08-25  00:45    <DIR>          WINDOWS
2004-08-25  00:51    <DIR>          Documents and Settings

....

C:

通過以上的比較,相信你對echo off命令已經充分掌握了.現在已經1點了...寫得累啊!!!洗澡睡覺去了

----------------------

早晨6點就被拉起來了...我命苦啊,那麼繼續寫吧

----------------------

接下來講的是call命令

call
是打電話的call,而不是"喔靠"的靠:).call的意思為調用.假如有2個批次檔a.bat和b.bat.如果我想運行a.bat的當中運行
b.bat.如何運行呢?其實很簡單,只要在a.bat檔案中輸入call命令,則可以在a.bat啟動並執行當中,運行b.bat,等b.bat運行完之
後,繼續執行a.bat

call命令格式:

CALL [drive:][path]filename [batch-parameters]

  batch-parameters   指定批次程式所需的命令列資訊。

舉例如下,我們在c盤根目錄下建立a.bat檔案,內容為:

echo this is a.bat

call d:b.bat

echo done

然後在d盤根目錄下建立b.bat,內容為:

echo this is b.bat

儲存後,開啟cmd,進入c盤根目錄,然後輸入1.bat,顯示如下:

C:>a.bat

C:>echo this is a.bat
this is a.bat

C:>call d:b.bat

C:>echo this is b.bat
this is b.bat

C:>echo done
done

由例子很容易看出來,是先運行a.bat的內容,直到遇到call b.bat後,則調用b.bat,運行完b.bat後,再返回a.bat接著運行call b.bat後面的echo done語句,直至將a.bat的所有批處理命令運行完.

註:裡面有個[batch-parameters]裡面的所指的參數是什麼,知道的朋友能否告知,不勝感激.

PAUSE 命令



暫停批次程式的執行並顯示一條訊息,提示使用者按任意鍵繼續執行。只能在批次程式中使用該命令。

rem命令:

表示此命令後的字元為解釋行(注釋),不執行,只是給自己今後參考用的(相當於程式中的注釋).

同時你可以用兩個冒號來替代rem.如: ::等同於一個rem.但他們有個區別,就是用::作注釋的話他是不回顯的,即使你打echo on強制回顯也沒有同的.同時rem可以在config.sys中加註釋.

文法: rem[commnet]

批次檔參數:

有點編程基礎的人都知道函數有參數.批次檔也有參數.

我打個比方,希望能協助沒有語言基礎的人也能看的非常明白. 

我從例子裡開始吧.首先在c盤根目錄下建立一個批次檔 a.bat,裡面輸入內容

echo %1

然後開啟cmd,然後進入c盤根目錄.輸入:a "this is a canshu"

得到結果如下:

C:>a.bat "this is a test"

C:>echo "this is a test"
"this is a test"

 
 輸入的a "this is a canshu"中,a為建立的a.bat的檔案名稱a(後面的.bat可寫也可不寫),而a後面的 "this is
a canshu"這句話就是參數,寫在這的參數,在程式運行中就將參數自動放到批次程式中去.那麼放在什麼位置呢?就是放在 %1的地方.

  看了例子,讓我們看看整個關於參數的定義如何:

  批次檔還可以像C語言的函數一樣使用參數(相當於DOS命令的命令列參數),這需要用到一個參數表示符"%"。
  %[1-9]表示參數,參數是指在運行批次檔時在檔案名稱後加的以空格(或者Tab)分隔的字串。變數可以從%0到%9,%0表示批處理命令本身,其它參數字串用%1到%9順序表示。
//我們上個程式的例子裡就有%1,他就是參數,而輸入中"this is a test"作為參數就直接放到%1的位置,於是程式就變成了 echo "this is a test".

  再舉幾個例子協助你理解:

C:根目錄下一批次檔名為b.bat,內容為:
@echo off
type %1     //type為dos中的輸出命令,可以用來輸出文字檔的內容,比如我們建立一個1.txt檔案

         //裡面輸入內容,儲存.進cmd,如果輸入1.txt則看不了1.txt檔案內容,但是如果我

         //想看怎麼辦呢?這時候可以用type命令,只要在cmd裡輸入type 1.txt就能顯示

         //1.txt檔案中的內容了 

type %2

那麼運行C:>b a.txt b.txt
%1 : 表示a.txt
%2 : 表示b.txt

於是上面的批處理命令就變成了

@echo off

type a.txt

type b.txt
於是上面的命令將順序地顯示a.txt和b.txt檔案的內容。

沒有編程基礎的人可能要問,幹什麼要弄個參數啊?在後面加個參數多麻煩啊?直接往裡面寫不就好了啊?!其實這樣想有對的方面也有錯的方面.還是舉個例子說明吧.

第一步還是在c盤根目錄下建立一個批次檔,我們取名仍為a.bat.往裡面的內容輸入為:

ping %1  //ping命令可以簡單理解為測試一台機器開著還是沒有開,如果開著的話,他就回給你回送回應.

然後進cmd,我們想測試下163的伺服器是不是開著,則輸入a www.163.com

 
 對於知道ping命令的人,可以打ping進行檢查,但如果想ping的人不知道ping命令怎麼用,那怎麼辦啊?這時候你就可以把命令預先輸入到批處
理檔案中,儲存好,然後讓不會用的人進cmd,運行你的批次檔,檔案名稱後面加上他要ping 的網站地址就行了.換句話說,他想ping 163就直
接加163的網址,想ping sina就直接加sina的網址.這樣只要輸入一個參數,而不用改程式本身,整個程式的通用性就大大提高了.

 
 這是對於一個簡單的ping命令,你或許覺得用參數不值得,還是直接改不就好了啊.但如果程式有很多條,你一下找不到在哪改怎麼辦啊?所以,不管你是菜
哥,菜弟,菜姐,菜妹,只要運行下,輸入參數,結果自己就會出來,不用再象你一樣,考慮怎麼編寫批次檔.人家只要知道是輸入什麼東西能讓批次程式運
行,而編寫的人則想的是如何讓不懂程式的人能運行程式.

  批處理參數就這麼簡單,不知道你理解了沒有?但如果你想深一步瞭解批處理參數,可以接著往下看,如果不想深入瞭解,知道現在這麼多也就夠了.

以下粉紅色內容為網上資料.

====================================

  因為參數只有1%-9%,但當我們要引用第十個或更多個參數時, 就必須移動DOS 的參數起始指標. shift 命令正充當了這個移動指標的角色, 它將參數的起始指標移動到下一個參數, 類似C 語言中的指標操作. 圖示如下:

初始狀態, cmd 為命令名, 可以用 %0 引用
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^     ^       ^     ^      ^      ^      ^      ^      ^      ^
&line;      
&line;        &line;      &line;        &line;      
&line;       &line;        &line;       &line;      
&line;
%0  %1    %2   %3   %4   %5   %6    %7   %8   %9

經過1次shift後, cmd 將無法被引用
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^     ^       ^     ^      ^      ^      ^      ^      ^      ^
&line;      
&line;        &line;      &line;        &line;      
&line;       &line;        &line;       &line;      
&line;
%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
^     ^       ^     ^      ^      ^      ^      ^      ^      ^
&line;      
&line;        &line;      &line;        &line;      
&line;       &line;        &line;       &line;      
&line;
%0  %1    %2   %3   %4   %5   %6    %7   %8   %9

遺憾的是, win9x 和DOS下均不支援 shift 的逆操作. 只有在 nt 核心命令列環境下, shift 才支援 /n 參數, 可以以第一參數為基準返複移動起始指標.
=================

if goto choice for進階文法

今天就寫到這吧,我收拾收拾東西準備滾蛋回學校了.可能if goto choice for進階文法要在瀋陽才能完成了,祝我好運吧.

======================

學校的"網吧"終於算重新開張了,抓緊時間把剩下的寫完

if命令

說得通俗點,if就相當於我們白話裡的如果.

舉個例子:如果a喜歡b,那麼a就要娶b. 這句話翻譯成電腦語言就成了

if a喜歡b a就要娶b.

當然拉,電腦不可能理解a喜歡b,a就要娶b這兩句話,這裡只是舉個例子讓你方便理解.

if語句一共有3種模式,如下:

IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
IF [NOT] ERRORLEVEL number command

 NOT               指定只有條件為 false 的情況下, Windows XP 才應該執行該命令。

 ERRORLEVEL number 如果最後啟動並執行程式返回一個等於或大於指定數位退出編碼,指定條件為 true。

 string1==string2  如果指定的文字字串匹配,指定條件為 true。

 EXIST filename    如果指定的檔案名稱存在,指定條件為 true。

 command           如果符合條件,指定要執行的命令。如果指定的條件為 FALSE,命令後可跟一個執行 ELSE關鍵字後的命令的 ELSE 命令。

我們先講解第一種:

IF [NOT] string1==string2 command

自然語句意思:如果string1==string2,那麼執行command

下面再舉個能實際應用的if語句.

自然語句:如果輸入的參數為3,那麼顯示"a=3"

電腦語句:

@echo off
if "%1"=="3" echo "a=3"

或者寫成

@echo off
if %1==3 echo "a=3"

注意:當要測試的時候,因在cmd底下,輸入1.bat 3.因為這裡用了是傳遞參數,具體看文章前部分"批次檔參數".

第二種:

IF [NOT] EXIST filename command

這條命令用語檢測檔案是否存在.如果存在,執行command.如果不存在,則什麼也不顯示.

如:我們想檢查e盤根目錄下是否有一個叫2.txt的檔案.如果存在,則顯示exist.如果不存在,則什麼也不顯示.

批處理命令如下:

@echo off
if exist e:2.txt echo "exist 2.txt"

第三種:

IF [NOT] ERRORLEVEL number command

這個我引用點資料,感覺別人寫得更詳細,引用部分為粉色字部分:

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
//此處為一個for迴圈,後面會繼續                        介紹到的,看不懂可以先跳過去

if errorlevel 比較返回碼的判斷條件並非等於, 而是大於等於. 由於 goto 的跳轉特性, 由小到大排序會導致在較小的返回碼處就跳出; 而由於 set命令的 "重複" 賦值特性, 由大到小排序會導致較小的返回碼 "覆蓋" 較大的返回碼.

另外, 雖然 if errorlevel=<數字> command 也是有效命令列, 但也只是 command.com 解釋命令列時將 = 作為命令列切分符而忽略掉罷了

choice命令

????

goto命令

for命令

for命令其實就是一個迴圈命令,如果我們想重複一個語句,就可以用for命令.通過for命令,可以控制迴圈的次數等.

文法:

FOR %variable IN (set) DO command [command-parameters]

  %variable  指定一個單一字母可替換的參數。
  (set)      指定一個或一組檔案。可以使用萬用字元。
  command    指定對每個檔案執行的命令。
  command-parameters
             為特定命令指定參數或命令列開關。

在批次檔中使用 FOR 命令時,指定變數請使用 %%variable
而不要用 %variable。變數名稱是區分大小寫,所以 %i 不同於 %I.

  不知道你你看懂了沒有,其實還是很容易理解的,還是舉個例子吧.我想用type列印所有c盤根目錄下的bat檔案和txt檔案.dos底下命令就是 type *.bat *.txt.先將該檔案儲存在c盤根目錄下,名稱為a.bat

用for命令如下:

for %%t in (*.bat *.txt) do type %%t

%%t其實就是代表的一個參數,他的內容在in() 裡面括弧裡的內容.也就是說這句話裡的%%t就變成了*.bat *.txt了.do就是做的意思,執行type命令,而type後面是%%t,而%%t又是*.bat *.txt.所以原來這句命令的意思就變成了:

type *.bat *.txt

執行時進cmd,然後到c盤根目錄下輸入a.bat就可以列印出c盤根目錄下所有副檔名為.bat和.txt的檔案內容了.

這裡要注意:in後面有個空格.

在xp底下,for命令副檔名被起用因此for的功能變得更加強大.下面講一個真正的迴圈.

FOR /L %variable IN (start,step,end) DO command [command-parameters]

    該集表示以增量形式從開始到結束的一個數字序列。
    因此,(1,1,5) 將產生序列 1 2 3 4 5,(5,-1,1) 將產生
    序列 (5 4 3 2 1)

裡面第一個1在start的位置,意思是起始位置,第2個1在step位置,英文意思是跨步,在這裡面的意思是每次增量為1.後面的5在end的位置,意思是結束時的大小.

這句話的意思就是從1(start)開始增加,每次增加1(step),一直到變到5(end)為止.

這個有什麼用呢?其實我感覺這個東西的用處還是很大的.舉個最簡單的例子,我們想重複回顯"i am the best"這句話,重複顯示10遍.那麼for命令如下:

for /L %%e in (1,1,10) do echo "i am the best"

這時,cmd就會重複輸入"i am the best"10遍.

===============================================

看完整篇文章了嗎?咳...我寫的不容易啊....

現在不知道你對bat有了什麼樣的理解,我現在的感覺就是bat就是dos命令的組合,你把dos命令全寫進bat命令,只要運行下bat就會挨個執行dos命令,這無疑提供了不少的方便。

下面我再舉些執行個體.

刪除預設共用:

對於預設共用不知道你瞭解多少,反正留著是個隱患,現在唯一的辦法好象只能做個bat檔案進行刪除.命令如下:

net share ipc$ /delete
net share admin$ /delete
net share c$ /delete
net share d$ /delete
net share e$ /delete

……

裡面的c d e為你的盤符。如果你只有一個分區,那麼寫到net share c$ /delete為止就可以了。如果你有n個分區,那麼就挨個寫下去。

net share d$ /delete
net share e$ /delete

net share f$ /delete

net share g$ /delete……

登陸到區域網路的機器捷徑(對方機器有密碼且為2000或以上系統)

net use \192.168.0.1
[密碼] /user:[使用者名稱]
explorer \192.168.0.1

bat檔案備份註冊表

set regfile=%date%   //設定變數,下面出現%regfile%的都自動替換“當天date”

if exist "%regfile%" goto end   //如果發現當天date命名的目錄,跳到檔案尾。
md temp       //建temp目錄

call 1.bat      //調用1.bat
del  1.bat          
ren 2.bat 1.bat
ren 3.bat 2.bat
ren 4.bat 3.bat
echo move  "%regfile%"  temp >4.bat  //寫 移動“當天date命名的目錄”到temp的bat檔案  。

md "%regfile%"   //建當天date命名的目錄
cd "%regfile%"  //進入

reg export hkcu hkcu.reg   //匯出註冊表
reg export hklm hklm.reg  
                              //HKEY_CURRENT_USER  縮寫hkcu 。存放目前使用者個人資料
                              //HKEY_LOCAL_MACHINE  縮寫hklm 。系統的核心資料
cd..
deltree /y  temp >nul        ////返回上級目錄  ,刪temp檔案夾
:end

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.