天天看點

bat 批處理指令

先把指令輸入到批處理檔案中,然後加入到啟動項中,每次啟動就會自動運作,免去了每次輸入指令的麻煩.至于怎麼寫這個批處理檔案嘛,到文章的結尾我會告訴大家的,但不知道在我寫完之前會不會睡着呢?~

  如何建立批處理檔案?

    不要聽了批處理檔案就感到很神氣,其實這東西很簡單的.你用過記事本沒有?用過? 好的.将記事本打開,什麼都不用寫,然後選擇檔案,儲存.儲存類型選擇所有檔案,檔案名則命名為 *.bat 這個*代表是檔案名,你可以随便的起.儲存好之後,看看你儲存的地方,會出現一個白色視窗裡有個黃色齒輪的圖示.這東西就是你建立的批處理檔案,輕按兩下他就可以運作,但他現在由于裡面沒有輸入任何指令,是以他運作了并不會做任何事情.當我們想往這個*.bat檔案中添加東西時,隻要右鍵選擇他,然後選擇編輯,就可以打開記事本往内輸入指令了.

  批處理檔案中的指令是什麼?

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

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

  批處理文法:

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

  echo的意思是回旋,這裡的意思就是回顯,echo off意思就是關閉回顯.前面的@表示echo off 這一行也不會回顯你可以試着去掉@和整行去掉.@的另一個功能是在執行完批處理檔案時自動恢複指令回顯。如果第一句用的是ECHO OFF,那麼在執行完批處理檔案以後不會顯示指令提示符。

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

接下來講的是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語言的函數一樣使用參數(相當于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指令

說得通俗點,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$Content$nbsp;/delete

net share admin$Content$nbsp;/delete

net share c$Content$nbsp;/delete

net share d$Content$nbsp;/delete

net share e$Content$nbsp;/delete

……

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

net share d$Content$nbsp;/delete

net share e$Content$nbsp;/delete

net share f$Content$nbsp;/delete

net share g$Content$nbsp;/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

一鍵清理系統垃圾的bat檔案内容:

@echo off

echo 正在清理系統垃圾檔案,請稍等......

del /f /s /q %systemdrive%\*.tmp

del /f /s /q %systemdrive%\*._mp

del /f /s /q %systemdrive%\*.log

del /f /s /q %systemdrive%\*.gid

del /f /s /q %systemdrive%\*.chk

del /f /s /q %systemdrive%\*.old

del /f /s /q %systemdrive%\recycled\*.*

del /f /s /q %windir%\*.bak

del /f /s /q %windir%\prefetch\*.*

rd /s /q %windir%\temp & md %windir%\temp

del /f /q %userprofile%\cookies\*.*

del /f /q %userprofile%\recent\*.*

del /f /s /q "%userprofile%\Local Settings\Temporary Internet Files\*.*"

del /f /s /q "%userprofile%\Local Settings\Temp\*.*"

del /f /s /q "%userprofile%\recent\*.*"

echo 清理系統垃圾完成!

echo. & pause

為了您的安全,請隻打開來源可靠的網址

打開網站 取消

來自: http://hi.baidu.com/wanlicn/blog/item/a1fdb6371f0541360a55a9b9.html

繼續閱讀