windows批處理學習---01

來源:互聯網
上載者:User

標籤:解釋   修改檔案   cal   需要   識別   界定   查看   啟動   未能   

一、 標記符號:

 1 CR(0D) 命令列結束符 2 Escape(1B) ANSI逸出字元引導符 3 Space(20) 常用的參數界定符 4 Tab(09) ; = 不常用的參數界定符 5 + COPY命令檔案串連符 6 * ? 檔案萬用字元 7 "" 字串界定符 8 | 命令管道符 9 < > >> 檔案重新導向符10 @ 命令列回顯屏蔽符11 / 參數開關引導符12 : 批處理標籤引導符13 % 批處理變數引導符 

  ::確實可以起到rem 的注釋作用, 而且更簡潔有效; 但有兩點需要注意:

  (1)除了 :: 之外, 任何以:開頭的字元行, 在批處理中都被視作標號, 而直接忽略其後的所有內容, 只是為了與正常的標號相區別, 建議使用 goto 所無法識別的標號, 即在:後緊跟一個非字母數位一個特殊符號。

  (2)與rem不同的是, ::後的字元行在執行時不會回顯, 無論是否用echo on開啟命令列回顯狀態, 因為命令直譯器不認為他是一個有效命令列, 就此點來看, rem 在某些場合下將比:: 更為適用。另外,rem 可以用於 config.sys 檔案中。

 

二、參數

批次檔還可以像C語言的函數一樣使用參數(相當於DOS命令的命令列參數),這需要用到一個參數表示符%

%[1-9]表示參數,參數是指在運行批次檔時在檔案名稱後加的以空格(或者Tab)分隔的字串。變數可以從%0%9%0表示批處理命令本身,其它參數字串用%1%9順序表示。

例2:C:根目錄下有一批次檔名為f.bat,內容為:

  @echo off  format %1

如果執行C:\>f a:,那麼在執行f.bat時,%1就表示a:,這樣format %1就相當於format a:,於是上面的命令運行時實際執行的是format a:

例3:C:根目錄下一批次檔名為t.bat,內容為:

  @echo off  type %1  type %2

那麼運行C:\>t a.txt b.txt

%1 : 表示a.txt

%2 : 表示b.txt

 

三、控制語句

ifgotochoicefor是批處理控制語句命令。

IF語句

if 是條件陳述式,用來判斷是否符合規定的條件,從而決定執行不同的命令。 有三種格式:

IF [NOT] ERRORLEVEL number commandIF [NOT] string1==string2 commandIF [NOT] EXIST filename command
  • if [not] "參數" == "字串" 待執行的命令

參數如果等於(not表示不等,下同)指定的字串,則條件成立,運行命令,否則運行下一句。

例:if "%1"=="a" format a:

if 的命令列協助中關於此點的描述為: IF [NOT] string1==string2 command

在此有以下幾點需要注意:

  1. 包含字串的雙引號不是文法所必須的, 而只是習慣上使用的一種"防空"字元
  2. string1 未必是參數, 它也可以是環境變數, 迴圈變數以及其他字串常量或變數
  3. command 不是文法所必須的, string2 後跟一個空格就可以構成一個有效命令列
  • if [not] exist [路徑\]檔案名稱 待執行的命令

如果有指定的檔案,則條件成立,運行命令,否則運行下一句。

如: if exist c:\config.sys type c:\config.sys

表示如果存在c:\config.sys檔案,則顯示它的內容。

也可以使用以下的用法:

if exist command

 在DOS系統中, 裝置也被認為是一種特殊的檔案, 而檔案也可以稱作字元裝置; 因為裝置(device)與檔案都是使用控制代碼(handle)來管理的, 控制代碼就是名字, 類似於檔案名稱, 只不過控制代碼不是應用於磁碟管理, 而是應用於記憶體管理而已, 所謂裝置載入也即指在記憶體中為其分配可引用的控制代碼.
  • if errorlevel <數字> 待執行的命令

很多DOS程式在運行結束後會返回一個數字值用來表示程式啟動並執行結果(或者狀態),通過if errorlevel命令可以判斷程式的傳回值,根據不同的傳回值來決定執行不同的命令(傳回值必須按照從大到小的順序排列)。如果傳回值等於指定的數字,則條件成立,運行命令,否則運行下一句。

如:if errorlevel 2 goto x2

傳回值從大到小的順序排列不是必須的, 而只是執行命令為 goto 時的習慣用法, 當使用 set 作為執行命令時, 通常會從小到大順序排列, 比如需將返回碼置入環境變數, 就需使用以下的順序形式:

if errorlevel 1 set el=1if errorlevel 2 set el=2if errorlevel 3 set el=3if errorlevel 4 set el=4if errorlevel 5 set el=5...

當然, 也可以使用以下迴圈來替代, 原理是一致的: for %%e in (1 2 3 4 5 6 7 8...) do if errorlevel %%e set el=%%e

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

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

GOTO語句

goto 批次檔運行到這裡將跳到goto所指定的標號(標號即label,標號用:後跟標準字串來定義)處,goto語句一般與if配合使用,根據不同的條件來執行不同的命令組。

如:

goto end:endecho this is the end

標號用 :字串 來定義,標號所在行不被執行。

label 常被譯為 "標籤" , 但是這並不具有廣泛的約定性。

goto 與 : 聯用可實現執行中途的跳轉, 再結合 if 可實現執行過程的條件分支, 多個 if 即可實現命令的分組, 類似 C 中 switch case 結構或者 Basic 中的 select case 結構, 大規模且結構化的命令分組即可實現進階語言中的函數功能。

choice語句

choice 使用此命令可以讓使用者輸入一個字元(用於選擇),從而根據使用者的選擇返回不同的errorlevel,然後於if errorlevel配合,根據使用者的選擇運行不同的命令。

注意:choice命令為DOS或者Windows系統提供的外部命令,不同版本的choice命令文法會稍有不同,請用choice /?查看用法。

choice的命令文法(該文法為Windows 2003中choice命令的文法,其它版本的choice的命令文法與此大同小異):

CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]描述:該工具允許使用者從挑選清單選擇一個項目並返回所選項目的索引。參數列表:/C choices 指定要建立的選項列表。預設列表是 "YN"。/N 在提示符中隱藏選項列表。提示前面的訊息得到顯示,選項依舊處於啟用狀態。/CS 允許選擇分大小寫選項。在預設情況下,這個工具是不分大小寫。/T timeout 做出預設選擇之前,暫停秒數。可接受的值是從 0到 9999。如果指定了 0,就不會有暫停,預設選項會得到選擇。/D choice 在 nnnn 秒之後指定預設選項。字元必須在用 /C 選項指定的一組選擇中; 同時,必須用 /T 指定 nnnn。/M text 指定提示之前要顯示的訊息。如果沒有指定,工具只顯示提示。/? 顯示協助訊息。注意:ERRORLEVEL 環境變數被設定為從選擇集選擇的鍵索引。列出的第一個選擇返回 1,第二個選擇返回 2,等等。如果使用者按的鍵不是有效選擇,該工具會發出警告響聲。如果該工具檢測到錯誤狀態,它會返回 255 的ERRORLEVEL 值。如果使用者按 Ctrl+Break 或 Ctrl+C 鍵,該工具會返回 0的 ERRORLEVEL 值。在一個批程式中使用 ERRORLEVEL 參數時,將參數降序排列。樣本:CHOICE /?CHOICE /C YNC /M "確認請按 Y,否請按 N,或者取消請按 C。"CHOICE /T 10 /C ync /CS /D yCHOICE /C ab /M "選項 1 請選擇 a,選項 2 請選擇 b。"CHOICE /C ab /N /M "選項 1 請選擇 a,選項 2 請選擇 b。"

例:test.bat的內容如下(**注意,用if errorlevel判斷傳回值時,要按傳回值從高到低排列**):

@echo offchoice /C dme /M "defrag,mem,end"::if errorlevel 3 goto end::if errorlevel 2 goto mem::if errorlevel 1 goto defrag:defragc:\dos\defraggoto end:memmemgoto end:endecho good bye

此批處理運行後,將顯示defrag,mem,end[D,M,E]?,使用者可選擇d m e ,然後if語句根據使用者的選擇作出判斷,d表示執行標號為defrag的程式段,m表示執行標號為mem的程式段,e表示執行標號為end的程式段,每個程式段最後都以goto end將程式跳到end標號處,然後程式將顯示good bye,批處理運行結束。

for迴圈

for 迴圈命令,只要條件符合,它將多次執行同一命令。

文法:對一組檔案中的每一個檔案執行某個特定命令。FOR %%variable IN (set) DO command [command-parameters](set) 指定一個或一組檔案。可以使用萬用字元。command 指定對每個檔案執行的命令。command-parameters 為特定命令指定參數或命令列開關。例如一個批次檔中有一行:for %%c in (*.bat *.txt) do type %%c則該命令列會顯示目前的目錄下所有以bat和txt為副檔名的檔案的內容。

需要指出的是, 當()中的字串並非單個或多個檔案名稱時, 它將單純被當作字串替換, 這個特性再加上()中可以嵌入多個字串的特性, 很明顯 for 可以被看作一種遍曆型迴圈。

 

批處理樣本IF-EXIST
  • 首先用記事本在C:\建立一個test1.bat批次檔,檔案內容如下:
    @echo offIF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BATIF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist

然後運行它:C:\>TEST1.BAT

如果C:\存在AUTOEXEC.BAT檔案,那麼它的內容就會被顯示出來,如果不存在,批處理就會提示你該檔案不存在。

  • 接著再建立一個test2.bat檔案,內容如下:
    @ECHO OFFIF EXIST \%1 TYPE \%1IF NOT EXIST \%1 ECHO \%1 does not exist

執行:C:\>TEST2 AUTOEXEC.BAT,該命令運行結果同上。

說明:

(1) IF EXIST 是用來測試檔案是否存在的,格式為IF EXIST [路徑+檔案名稱] 命令

(2) test2.bat檔案中的%1是參數,DOS允許傳遞9個批參數資訊給批次檔,分別為%1~%9(%0表示test2命令本身) ,這有點象編程中的實參和形參的關係,%1是形參,AUTOEXEC.BAT是實參。

DOS沒有 "只允許傳遞9個批參數資訊" 的限制, 參數的個數只會受到命令列長度和所調用命令處理能力的限制. 但是, 我們在批次程式中, 在同一時刻只能同時引用10個參數, 因為 DOS只給出了 %0~%9這十個參數引用符。

  • 更進一步的,建立一個名為TEST3.BAT的檔案,內容如下:
    @echo offIF "%1" == "A" ECHO XIAOIF "%2" == "B" ECHO TIANIF "%3" == "C" ECHO XIN

如果運行:C:\>TEST3 A B C,螢幕上會顯示:

XIAOTIANXIN

如果運行:C:\>TEST3 A B,螢幕上會顯示:

XIAOTIAN

在這個命令執行過程中,DOS會將一個Null 字元串指定給參數%3。

IF-ERRORLEVEL

建立TEST4.BAT,內容如下:

@ECHO OFFXCOPY C:\AUTOEXEC.BAT D:IF ERRORLEVEL 1 ECHO 檔案拷貝失敗IF ERRORLEVEL 0 ECHO 成功拷貝檔案

然後執行檔案:C:\>TEST4

如果檔案拷貝成功,螢幕就會顯示"成功拷貝檔案",否則就會顯示"檔案拷貝失敗"。

IF ERRORLEVEL 是用來測試它的上一個DOS命令的傳回值的,注意只是上一個命令的傳回值,而且傳回值必須依照從大到小次序順序判斷。

因此下面的批次檔是錯誤的:

@ECHO OFFXCOPY C:\AUTOEXEC.BAT D:IF ERRORLEVEL 0 ECHO 成功拷貝檔案IF ERRORLEVEL 1 ECHO 未找到拷貝檔案IF ERRORLEVEL 2 ECHO 使用者通過ctrl-c中止拷貝操作IF ERRORLEVEL 3 ECHO 預置錯誤阻止檔案拷貝操作IF ERRORLEVEL 4 ECHO 拷貝過程中寫盤錯誤 if errorlevel 判斷是大於等於判斷
  • 常用命令傳回值
    以下就是幾個常用命令的傳回值及其代表的意義:backup0 備份成功1 未找到備份檔案2 檔案分享權限設定衝突阻止備份完成3 使用者用ctrl-c中止備份4 由於致命的錯誤使備份操作中止diskcomp0 盤比較相同1 盤比較不同2 使用者通過ctrl-c中止比較操作3 由於致命的錯誤使比較操作中止4 預置錯誤中止比較diskcopy0 盤拷貝操作成功1 非致命盤讀/寫錯2 使用者通過ctrl-c結束拷貝操作3 因致命的處理錯誤使盤拷貝中止4 預置錯誤阻止拷貝操作format0 格式化成功3 使用者通過ctrl-c中止格式化處理4 因致命的處理錯誤使格式化中止5 在提示"proceed with format(y/n)?"下使用者鍵入n結束xcopy0 成功拷貝檔案1 未找到拷貝檔案2 使用者通過ctrl-c中止拷貝操作4 預置錯誤阻止檔案拷貝操作5 拷貝過程中寫盤錯誤chkdsk0 未找到錯誤255 找到一個或多個錯誤choice0 使用者按下ctrl+c/break1 使用者按下第一個鍵255 檢測到命令列中的錯誤條件其它 使用者按下的有效字元在列表中的位置defrag0 片段壓縮成功1 出現內部錯誤2 磁碟上沒有空簇。要運行DEFRAG,至少要有一個空簇3 使用者用Ctrl+C退出了DEFRAG4 出現一般性錯誤5 DEFRAG在讀簇時遇到錯誤6 DEFRAG在寫簇時遇到錯誤7 分配空間有錯8 記憶體錯9 沒有足夠空間來壓縮磁碟片段deltree0 成功地刪除一個目錄diskcomp0 兩盤相同1 發現不同2 按CTRL+C 終止了比較3 出現嚴重錯誤4 出現初始化錯誤find0 尋找成功且至少找到了一個匹配的字串1 尋找成功但沒找到匹配的字串2 尋找中出現了錯誤keyb0 鍵盤定義檔案裝入成功1 使用了非法的鍵盤代碼,字元集或文法2 鍵盤定義檔案壞或未找到4 鍵盤、監視器通訊時出錯5 要求的字元集未準備好move0 成功地移動了指定的檔案1 發生了錯誤  msav /N86 檢查到了病毒replace0 REPLACE成功地替換或加入了檔案1 MS-DOS版本和REPLACE不相容2 REPLACE找不到源檔案3 REPLACE找不到源路徑或目標路徑5 不能存取要替換的檔案8 記憶體不夠無法執行REPLACE11 命令列句法錯誤restore0 RESTORE成功地恢複了檔案1 RESTORE找不到要恢複的檔案3 使用者按CTRL+C終止恢複過程4 RESTORE因錯誤而終止scandisk0 ScanDisk在它檢查的磁碟機上未檢測到任何錯誤1 由於命令列的文法不對,不能運行ScanDisk2 由於記憶體用盡或發生內部錯誤,ScanDisk意外終止3 使用者讓ScanDisk中途退出4 進行盤面掃描時,使用者決定提前退出254 ScanDisk找到磁碟故障並已全部校正255 ScanDisk找到磁碟故障,但未能全部校正setver0 SETVER成功地完成了任務1 使用者指定了一個無效的命令開關2 使用者指定了一個非法的檔案名稱3 沒有足夠的系統記憶體來運行命令4 使用者指定了一個非法的版本號碼格式5 SETVER在版本表中未找到指定的項6 SETVER未找到SETVER.EXE檔案7 使用者指定了一個非法的磁碟機8 使用者指定了太多的命令列參數9 SETVER檢測到丟失了命令列參數10 在讀SETVER.EXE檔案時,SETVER檢測到發生錯誤11 SETVER.EXE檔案損壞12 指定的SETVER.EXE檔案不支援版本表13 版本表中沒有足夠的空間存放新的項14 在寫SETVER.EXE檔案時SETVER檢測到發生錯誤 
IF STRING1 == STRING2

建立TEST5.BAT,檔案內容如下:

@echo offIF "%1" == "A" FORMAT A:

執行:C:\>TEST5 A,螢幕上就出現是否將A:盤格式化的內容。

注意:為了防止參數為空白的情況,一般會將字串用雙引號(或者其它符號,注意不能使用保留符號)括起來。

如:if [%1]==[A] 或者 if %1*==A*

GOTO

建立TEST6.BAT,檔案內容如下:

@ECHO OFFIF EXIST C:\AUTOEXEC.BAT GOTO _COPYGOTO _DONE:_COPYCOPY C:\AUTOEXEC.BAT D::_DONE
  • 注意:
    1. 標號前是ASCII字元的冒號":",冒號與標號之間不能有空格。
    2. 標號的命名規則與檔案名稱的命名規則相同(簽不能以大多數的非字母數字字元開始, 而檔案名稱中則可以使用很多)。
    3. DOS支援最長八位字元的標號,當無法區別兩個標籤時, 將跳轉至位置最靠前的標籤。
FOR

建立C:\TEST7.BAT,檔案內容如下:

@ECHO OFFFOR %%C IN (*.BAT *.TXT *.SYS) DO TYPE %%C

運行:C:\>TEST7

執行以後,螢幕上會將C:盤根目錄下所有以BAT、TXT、SYS為副檔名的檔案內容顯示出來(不包括隱藏檔案)。

建立test.cmd

@ECHO OFFFOR %%C IN (%*) DO @ECHO %%CECHO ---------------FOR %%C IN (%*) DO (FOR /L %%I IN (1,1,2) DO echo %%C%%I)ECHO ---------------FOR %%C IN (%*) DO (   FOR /L %%I IN (3,1,4) DO echo %%C-%%I      )

運行:test.cmd a b,輸入內容如下:

ab---------------a1a2b1b2---------------a-3a-4b-3b-4
命令列表
  • 版本:Microsoft Windows XP [版本 5.1.2600]
  • 有關某個命令的詳細資料,請鍵入:HELP 命令名查看。
  • 命令列表
    ASSOC    顯示或修改副檔名關聯。AT       計劃在電腦上啟動並執行命令和程式。ATTRIB   顯示或變更檔屬性。BREAK    設定或清除擴充式 CTRL+C 檢查。CACLS    顯示或修改檔案的存取控制清單(ACLs)。CALL     從另一個批次程式調用這一個。CD       顯示目前的目錄的名稱或將其更改。CHCP     顯示或設定活動字碼頁數。CHDIR    顯示目前的目錄的名稱或將其更改。CHKDSK   檢查磁碟並顯示狀態報表。CHKNTFS  顯示或修改啟動時間磁碟檢查。CLS      清除螢幕。CMD      開啟另一個 Windows 命令解釋程式視窗。COLOR    設定預設控制台前景和背景顏色。COMP     比較兩個或兩套檔案的內容。COMPACT  顯示或更改 NTFS 分區上檔案的壓縮。CONVERT  將 FAT 卷轉換成 NTFS。您不能轉換當前磁碟機。COPY     將至少一個檔案複製到另一個位置。DATE     顯示或設定日期。DEL      刪除至少一個檔案。DIR      顯示一個目錄中的檔案和子目錄。DISKCOMP 比較兩個磁碟片的內容。DISKCOPY 將一個磁碟片的內容複寫到另一個磁碟片。DOSKEY   編輯命令行、調用 Windows 命令並建立宏。ECHO     顯示訊息,或將命令回顯開啟或關上。ENDLOCAL 結束批檔案中環境更改的本地化。ERASE    刪除至少一個檔案。EXIT     退出 CMD.EXE 程式(命令解釋程式)。FC       比較兩個或兩套檔案,並顯示不同處。FIND     在檔案中搜尋文字字串。FINDSTR  在檔案中搜尋字串。FOR      為一套檔案中的每個檔案運行一個指定的命令。FORMAT   格式化磁碟,以便跟 Windows 使用。FTYPE    顯示或修改用於副檔名關聯的檔案類型。GOTO     將 Windows 命令解釋程式指向批次程式中某個標明的行。GRAFTABL 啟用 Windows 來以映像模式顯示擴充字元集。HELP     提供 Windows 命令的協助資訊。IF       執行批次程式中的條件性處理。LABEL    建立、更改或刪除磁碟的卷標。MD       建立目錄。MKDIR    建立目錄。MODE     配置系統裝置。MORE     一次顯示一個結果螢幕。MOVE     將檔案從一個目錄移到另一個目錄。PATH     顯示或設定可執行檔的搜尋路徑。PAUSE    暫停批檔案的處理並顯示訊息。POPD     還原 PUSHD 儲存的目前的目錄的上一個值。PRINT    列印文字檔。PROMPT   更改 Windows 命令提示字元。PUSHD    儲存目前的目錄,然後對其變更。RD       刪除目錄。RECOVER  從有問題的磁碟恢複可讀資訊。REM      記錄批檔案或 CONFIG.SYS 中的注釋。REN      重新命名檔案。RENAME   重新命名檔案。REPLACE  替換檔案。RMDIR    刪除目錄。SET      顯示、設定或刪除 Windows 環境變數。SETLOCAL 開始批檔案中環境更改的本地化。SHIFT    更換批檔案中可替換參數的位置。SORT     對輸入進行分類。START    啟動另一個視窗來運行指定的程式或命令。SUBST    將路徑跟一個磁碟機代號關聯。TIME     顯示或設定系統時間。TITLE    設定 CMD.EXE 會話的視窗標題。TREE     以圖形模式顯示磁碟機或路徑的目錄結構。TYPE     顯示文字檔的內容。VER      顯示 Windows 版本。VERIFY   告訴 Windows 是否驗證檔案是否已正確寫入磁碟。VOL      顯示磁碟卷標和序號。XCOPY    複製檔案和目錄

windows批處理學習---01

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.