批處理
一、call命令
1、介紹
從批處理程序調用另一個批處理程序。
2、語法
CALL [drive:][path]filename [batch-parameters] batch-parameters 指定批處理程序所需的命令行信息。 如果命令擴展被啟用,CALL 會如下改變:CALL 命令現在將卷標當作 CALL 的目標接受。語法是: CALL:label arguments
一個新的批文件上下文由指定的參數所創建,控制在卷標被指定后傳遞到語句。你必須通過達到批腳本文件末兩次來 "exit" 兩次。第一次讀到文件末時,控制會回到 CALL 語句的緊后面。第二次會退出批腳本。鍵入 GOTO /?,參看 GOTO :EOF 擴展的描述,此描述允許你從一個批腳本返回。 另外,批腳本文本參數參照(%0、%1、等等)已如下改變: 批腳本里的 %* 指出所有的參數(如 %1 %2 %3 %4 %5 ...) 批參數(%n)的替代已被增強。你可以使用以下語法: %~1 - 刪除引號("),擴展 %1 %~f1 - 將 %1 擴展到一個完全合格的路徑名 %~d1 - 僅將 %1 擴展到一個驅動器號 %~p1 - 僅將 %1 擴展到一個路徑 %~n1 - 僅將 %1 擴展到一個文件名 %~x1 - 僅將 %1 擴展到一個文件擴展名 %~s1 - 擴展的路徑只含有短名 %~a1 - 將 %1 擴展到文件屬性 %~t1 - 將 %1 擴展到文件的日期/時間 %~z1 - 將 %1 擴展到文件的大小 %~$PATH:1 - 查找列在 PATH 環境變量的目錄,並將 %1 擴展到找到的第一個完全合格的名稱。如果 環境變量名未被定義,或者沒有找到文件, 此修改符會擴展到空字符串 可以組合修改符來取得多重結果: %~dp1 - 只將 %1 擴展到驅動器號和路徑 %~nx1 - 只將 %1 擴展到文件名和擴展名 %~dp$PATH:1 - 在列在 PATH 環境變量中的目錄里查找 %1,並擴展到找到的第一個文件的驅動器號和路徑。 %~ftza1 - 將 %1 擴展到類似 DIR 的輸出行。 在上面的例子中,%1 和 PATH 可以被其他有效數值替換。%~ 語法被一個有效參數號碼終止。%~ 修定符不能跟 %*使用
二、for語句
1、介紹
對一組文件中的每一個文件執行某個特定命令。
2、語法
FOR/參數 %variable IN (set) DO command [command-parameters] 參數: /L 指用增量形式{ (set)為增量形式時 }; /F 指從文件中不斷取值,直到取完為止{ (set)為文件時,如(d:pass.txt)時 }。 %variable 指定一個單一字母可替換的參數,如:%i ,而指定一個變量則用:%%i ,而調用變量時用:%i% ,變量是區分大小寫的(%i 不等於 %I)。批處理每次能處理的變量從%0—%9共10個,其中%0默認給批處理文件名使用,%1默認為使用此批處理時輸入的的第一個值,同理:%2—%9指輸入的第2-9個值;
例:net use ipipc$ pass /user:user 中ip為%1,pass為%2 ,user為%3
(set) 指定一個或一組文件。可以使用通配符,如:(D:user.txt)和(1 1 254)(1 -1 254),{ “(1 1 254)”第一個"1"指起始值,第二個"1"指增長量,第三個"254"指結束值,即:從1到254;“(1 -1 254)”說明:即從254到1 } command 指定對每個文件執行的命令,如:net use命令;如要執行多個命令時,命令這間加:& 來隔開 command-parameters 為特定命令指定參數或命令行開關。 IN (set):指在(set)中取值; DO command :指執行command 如果啟用命令擴展,則會支持下列 FOR 命令的其他格式: FOR /D %variable IN (set) DO command [command-parameters] 如果集中包含通配符,則指定與目錄名匹配,而不與文件名匹配。 FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters] 檢查以 [drive:]path 為根的目錄樹,指向每個目錄中的 FOR 語句。 如果在 /R 后沒有指定目錄規范,則使用當前目錄。如果集僅為一個單點(.)字符, 則枚舉該目錄樹。 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) FOR /F ["options"] %variable IN (file-set) DO command [command-parameters] FOR /F ["options"] %variable IN ("string") DO command [command-parameters] FOR /F ["options"] %variable IN ('command') DO command [command-parameters] 或者,如果有 usebackq 選項: FOR /F ["options"] %variable IN (file-set) DO command [command-parameters] FOR /F ["options"] %variable IN ("string") DO command [command-parameters] FOR /F ["options"] %variable IN ('command') DO command [command-parameters] fileset 為一個或多個文件名。繼續到 fileset 中的下一個文件之前, 每份文件都被打開、讀取並經過處理。處理包括讀取文件,將其分成一行行的文字, 然后將每行解析成零或更多的符號。然后用已找到的符號字符串變量值調用 For 循環。 以默認方式,/F 通過每個文件的每一行中分開的第一個空白符號。跳過空白行。 你可通過指定可選 "options" 參數替代默認解析操作。這個帶引號的字符串包括一個 或多個指定不同解析選項的關鍵字。這些關鍵字為: eol=c - 指一個行注釋字符的結尾(就一個) skip=n - 指在文件開始時忽略的行數。 delims=xxx - 指分隔符集。這個替換了空格和制表符的 默認分隔符集。 tokens=x,y,m-n - 指每行的哪一個符號被傳遞到每個迭代 的 for 本身。這會導致額外變量名稱的分配。m-n 格式為一個范圍。通過 nth 符號指定 mth。如果 符號字符串中的最后一個字符星號, 那么額外的變量將在最后一個符號解析之后 分配並接受行的保留文本。 usebackq - 指定新語法已在下類情況中使用: 在作為命令執行一個后引號的字符串並且一個單 引號字符為文字字符串命令並允許在 file-set 中使用雙引號擴起文件名稱。 某些范例可能有助: FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k 會分析 myfile.txt 中的每一行,忽略以分號打頭的那些行,將每行中的第二個和第三個符號傳遞給 for 函數 體,用逗號和/或空格分隔符號。請注意,此 for 函數體的語句引用 %i 來獲得第二個符號,引用 %j 來獲得第 三個符號,引用 %k來獲得第三個符號后的所有剩余符號。對於帶有空格的文件名,你需要用雙引號將文件名括起 來。為了用這種方式來使用雙引號,還需要使用 usebackq 選項,否則,雙引號會被理解成是用作定義某個要分析 的字符串的。 %i 在 for 語句中顯式聲明,%j 和 %k 是通過 tokens= 選項隱式聲明的。可以通過 tokens= 一行 指定最多 26 個符號,只要不試圖聲明一個高於字母 "z" 或 "Z" 的變量。請記住,FOR 變量是單一字母、分大小寫和全局的變量; 而且,不能同時使用超過 52 個。 還可以在相鄰字符串上使用 FOR /F 分析邏輯,方法是, 用單引號將括號之間的 file-set 括起來。這樣,該字符 串會被當作一個文件中的一個單一輸入行進行解析。 最后,可以用 FOR /F 命令來分析命令的輸出。方法是,將 括號之間的 file-set 變成一個反括字符串。該字符串會 被當作命令行,傳遞到一個子 CMD.EXE,其輸出會被捕獲到 內存中,並被當作文件分析。如以下例子所示: FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i 會枚舉當前環境中的環境變量名稱。 另外,FOR 變量參照的替換已被增強。你現在可以使用下列選項語法: %~I - 刪除任何引號("),擴展 %I %~fI - 將 %I 擴展到一個完全合格的路徑名 %~dI - 僅將 %I 擴展到一個驅動器號 %~pI - 僅將 %I 擴展到一個路徑 %~nI - 僅將 %I 擴展到一個文件名 %~xI - 僅將 %I 擴展到一個文件擴展名 %~sI - 擴展的路徑只含有短名 %~aI - 將 %I 擴展到文件的文件屬性 %~tI - 將 %I 擴展到文件的日期/時間 %~zI - 將 %I 擴展到文件的大小 %~$PATH:I - 查找列在路徑環境變量的目錄,並將 %I 擴展 到找到的第一個完全合格的名稱。如果環境變量名 未被定義,或者沒有找到文件,此組合鍵會擴展到 空字符串 可以組合修飾符來得到多重結果: %~dpI - 僅將 %I 擴展到一個驅動器號和路徑 %~nxI - 僅將 %I 擴展到一個文件名和擴展名 %~fsI - 僅將 %I 擴展到一個帶有短名的完整路徑名 %~dp$PATH:I - 搜索列在路徑環境變量的目錄,並將 %I 擴展 到找到的第一個驅動器號和路徑。 %~ftzaI - 將 %I 擴展到類似輸出線路的 DIR 在以上例子中,%I 和 PATH 可用其他有效數值代替。%~ 語法用一個有效的 FOR 變量名終止。選取類似 %I 的大寫變量名比較易讀,而且避免與不分大小寫的組合鍵混淆。
3、實例
@echo off echo 用法格式:test.bat *.*.* > test.txt for /L %%G in (1 1 254) do echo %1.%%G >>test.txt & net use %1.%%G /user:administrator | find "命令成功完成" >>test.txt 存為test.bat 說明:對指定的一個C類網段的254個IP依次試建立administrator密碼為空的IPC$連接,如果成功就把該IP存在test.txt中。 /L指用增量形式(即從1-254或254-1);輸入的IP前面三位:*.*.*為批處理默認的 %1;%%G 為變量(ip的最后一位);& 用來隔開echo 和net use 這二個命令;| 指建立了ipc$后,在結果中用find查看是否有"命令成功完成"信息;%1.%%G 為完整的IP地址;(1 1 254) 指起始值,增長量,結止值。 @echo off echo 用法格式:ok.bat ip FOR /F %%i IN (D:user.dic) DO smb.exe %1 %%i D:pass.dic 200 存為:ok.exe 說明:輸入一個IP后,用字典文件d:pass.dic來暴解d:user.dic中的用戶密碼,直到文件中值取完為止。%%i為用戶名;%1為輸入的IP地址(默認)
三、find命令
1、介紹
在文件中搜索字符串。
2、語法
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]] /V 顯示所有未包含指定字符串的行。 /C 僅顯示包含字符串的行數。 /N 顯示行號。 /I 搜索字符串時忽略大小寫。 /OFF[LINE] 不要跳過具有脫機屬性集的文件。 "string" 指定要搜索的文本字符串。 [drive:][path]filename 指定要搜索的文件。 如果沒有指定路徑,FIND 將搜索在提示符處鍵入 的文本或者由另一命令產生的文本。
四、goto命令
1、介紹
將 cmd.exe 定向到批處理程序中帶標簽的行。
2、語法
GOTO label label 指定批處理程序中用作標簽的文字字符串。 標簽必須單獨一行,並且以冒號打頭。
如果命令擴展被啟用,GOTO 會如下改變: GOTO 命令現在接受目標標簽 :EOF,這個標簽將控制轉移到當前批腳本文件的結尾。不定義就退出批腳本文件,這是一個容易的辦法。有關能使該功能有用的 CALL 命令的擴展描述,請鍵入CALL /?。
五、if語法
1、介紹
執行批處理程序中的條件處理。
2、語法
a、IF [NOT] ERRORLEVEL number command b、IF [NOT] string1==string2 command c、IF [NOT] EXIST filename command NOT 指定只有條件為 false 的情況下,Windows 才 應該執行該命令。 ERRORLEVEL number 如果最后運行的程序返回一個等於或大於 指定數字的退出代碼,指定條件為 true。 string1==string2 如果指定的文字字符串匹配,指定條件為 true。 EXIST filename 如果指定的文件名存在,指定條件為 true。 command 如果符合條件,指定要執行的命令。如果指定的 條件為 FALSE,命令后可跟 ELSE 命令,該命令將 在 ELSE 關鍵字之后執行該命令。 a語句實例: IF errorlevel 0 命令 指程序執行后返回的值為0時,就值行后面的命令; IF not errorlevel 1 命令指程序執行最后返回的值不等於1,就執行后面的命令。 0 指發現並成功執行(真);1 指沒有發現、沒執行(假)。 b語句實例: “if "%2%"=="4" goto start” 指:如果輸入的第二個變量為4時,執行后面的命令(注意:調用變量時就%變量名%並加" ") c語句實例: “if not nc.exe goto end”指:如果沒有發現nc.exe文件就跳到":end"標簽處。 ELSE 子句必須出現在同一行上的 IF 之后。例如: IF EXIST filename. ( del filename. ) ELSE ( echo filename. missing. ) 由於 del 命令需要用新的一行終止,因此以下子句不會有效: IF EXIST filename. del filename. ELSE echo filename. missing 由於 ELSE 命令必須與 IF 命令的尾端在同一行上,以下子句也不會有效: IF EXIST filename. del filename. ELSE echo filename. missing 如果都放在同一行上,以下子句有效: IF EXIST filename. (del filename.) ELSE echo filename. missing 如果命令擴展被啟用,IF 會如下改變: IF [/I] string1 compare-op string2 command IF CMDEXTVERSION number command IF DEFINED variable command 其中, compare-op 可以是: EQU - 等於 NEQ - 不等於 LSS - 小於 LEQ - 小於或等於 GTR - 大於 GEQ - 大於或等於 而 /I 開關(如果指定)說明要進行的字符串比較不分大小寫。/I 開關可以用於 IF 的 string1==string2 的形式上。這些比較都是通用的;原因是,如果 string1 和 string2 都是由數字組成的,字符串會被轉換成數字,進行數字比較。 CMDEXTVERSION 條件的作用跟 ERRORLEVEL 的一樣,除了它是在跟與命令擴展有關聯的內部版本號比較。第一個版本 是 1。每次對命令擴展有相當大的增強時,版本號會增加一個。命令擴展被停用時,CMDEXTVERSION 條件不是真的。 如果已定義環境變量,DEFINED 條件的作用跟 EXIST 的一樣,除了它取得一個環境變量,返回的結果是 true。 如果沒有名為 ERRORLEVEL 的環境變量,%ERRORLEVEL%會擴充為 ERROLEVEL 當前數值的字符串表達式;否則,你會得到其數值。運行程序后,以下語句說明 ERRORLEVEL 的用法: goto answer%ERRORLEVEL% :answer0 echo Program had return code 0 :answer1 echo Program had return code 1 你也可以使用以上的數字比較: IF %ERRORLEVEL% LEQ 1 goto okay 如果沒有名為 CMDCMDLINE 的環境變量,%CMDCMDLINE%將在 CMD.EXE 進行任何處理前擴充為傳遞給 CMD.EXE 的原始命令行;否則,你會得到其數值。 如果沒有名為 CMDEXTVERSION 的環境變量,%CMDEXTVERSION% 會擴充為 CMDEXTVERSION 當前數值的字串符表達式;否則,你會得到其數值。
六、pause命令
1、介紹
暫停批處理程序,並顯示以下消息: 請按任意鍵繼續. . .
2、語法
pause
七、rem命令
1、介紹
在批處理文件或 CONFIG.SYS 里加上注解或說明。
2、語法
REM [comment]
八、setlocal命令
1、介紹
開始批處理文件中環境改動的本地化操作。在執行 SETLOCAL 之后所做的環境改動只限於批處理文件。要還原原先的設置,必須執行 ENDLOCAL。達到批處理文件結尾時,對於該批處理文件的每個尚未執行的 SETLOCAL 命令,都會有一個隱含的 ENDLOCAL 被執行。
2、語法
SETLOCAL 如果啟用命令擴展,則 SETLOCAL 更改如下: SETLOCAL 批命令現在可以接受可選參數: ENABLEEXTENSIONS / DISABLEEXTENSIONS 啟用或禁用命令處理器擴展。這些 參數比 CMD /E:ON 或 /E:OFF 開關有優先權。請參閱 CMD /? 獲取詳細信息。 ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION 啟用或禁用延緩環境變量 擴展。這些參數比 CMD /V:ON 或 /V:OFF 開關有優先權。請參閱 CMD /? 獲取詳細信息。 無論在 SETLOCAL 命令之前的設置是什么,這些修改會一直生效,直到出現相應的ENDLOCAL 命令。 在給定參數的情況下, SETLOCAL 命令將設置 ERRORLEVEL 值。如果給定兩個有效參數中的一個,另一個未給定,則該值為零。通過以下方法,你可以在批腳本中使用此項來確定擴展是否可用: VERIFY OTHER 2>nul SETLOCAL ENABLEEXTENSIONS IF ERRORLEVEL 1 echo Unable to enable extensions 此方法之所以有效,是因為在 CMD.EXE 的舊版本上,SETLOCAL不設置 ERRORLEVEL 值。如果參數不正確,VERIFY 命令會將ERRORLEVEL 值初始化為非零值。
九、start命令
1、介紹
啟動一個單獨的窗口以運行指定的程序或命令。
2、語法
START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL] [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B] [command/program] [parameters] "title" 在窗口標題欄中顯示的標題。 path 啟動目錄。 B 啟動應用程序,但不創建新窗口。 應用程序已忽略 ^C 處理。除非應用程序 啟用 ^C 處理,否則 ^Break 是唯一可以中斷 該應用程序的方式。 I 新的環境將是傳遞 給 cmd.exe 的原始環境,而不是當前環境。 MIN 以最小化方式啟動窗口。 MAX 以最大化方式啟動窗口。 SEPARATE 在單獨的內存空間中啟動 16 位 Windows 程序。 SHARED 在共享內存空間中啟動 16 位 Windows 程序。 LOW 在 IDLE 優先級類中啟動應用程序。 NORMAL 在 NORMAL 優先級類中啟動應用程序。 HIGH 在 HIGH 優先級類中啟動應用程序。 REALTIME 在 REALTIME 優先級類中啟動應用程序。 ABOVENORMAL 在 ABOVENORMAL 優先級類中啟動應用程序。 BELOWNORMAL 在 BELOWNORMAL 優先級類中啟動應用程序。 NODE 將首選非一致性內存結構(NUMA)節點指定為 十進制整數。 AFFINITY 將處理器關聯掩碼指定為十六進制數字。 進程被限制在這些處理器上運行。 將 /AFFINITY 和 /NODE 結合使用時,會對關聯掩碼 進行不同的解釋。指定關聯掩碼,以便將零位作為起始位置(就如將 NUMA 節點的處理器掩碼向右移位一樣)。 進程被限制在指定關聯掩碼和 NUMA 節點之間的 那些通用處理器上運行。 如果沒有通用處理器,則進程被限制在 指定的 NUMA 節點上運行。 WAIT 啟動應用程序並等待它終止。 command/program 如果它是內部 cmd 命令或批文件,則 該命令處理器是使用 cmd.exe 的 /K 開關運行的。 這表示運行該命令之后,該窗口 將仍然存在。 如果它不是內部 cmd 命令或批文件,則 它就是一個程序,並將作為一個窗口化應用程序或 控制台應用程序運行。 parameters 這些是傳遞給 command/program 的參數。 注意: 在 64 位平台上不支持 SEPARATE 和 SHARED 選項。 通過指定 /NODE,可按照利用 NUMA 系統中的內存區域的方式 創建進程。例如,可以創建兩個完全 通過共享內存互相通信的進程以共享相同的首選 NUMA 節點, 從而最大限度地減少內存延遲。只要有可能, 它們就會分配來自相同 NUMA 節點的 內存,並且會在指定節點之外的處理器上自由運行。 start /NODE 1 application1.exe start /NODE 1 application2.exe 這兩個進程可被進一步限制在相同 NUMA 節點內的指定處理器 上運行。在以下示例中,application1 在 節點的兩個低位處理器上運行,而 application2 在該節點的其后兩個處理器上運行。該示例假定指定節點至少具有四個邏輯處理器。請注意,節點號可更改為該計算機的任何有效節點號, 而無需更改關聯掩碼。 start /NODE 1 /AFFINITY 0x3 application1.exe 啟動 /NODE 1 /AFFINITY 0xc application2.exe 如果命令擴展被啟用,通過命令行或 START 命令的外部命令 調用會如下改變: 將文件名作為命令鍵入,非可執行文件可以通過文件關聯調用。 (例如,WORD.DOC 會調用跟 .DOC 文件擴展名關聯的應用程序)。 關於如何從命令腳本內部創建這些關聯,請參閱 ASSOC 和 FTYPE 命令。 執行的應用程序是 32 位 GUI 應用程序時,CMD.EXE 不等應用 程序終止就返回命令提示符。如果在命令腳本內執行,該新行為 則不會發生。 如果執行的命令行的第一個符號是不帶擴展名或路徑修飾符的 字符串 "CMD","CMD" 會被 COMSPEC 變量的數值所替換。這 防止從當前目錄提取 CMD.EXE。 如果執行的命令行的第一個符號沒有擴展名,CMD.EXE 會使用 PATHEXT 環境變量的數值來決定要以什么順序尋找哪些擴展 名。PATHEXT 變量的默認值是: .COM;.EXE;.BAT;.CMD 請注意,該語法跟 PATH 變量的一樣,分號隔開不同的元素。 查找可執行文件時,如果沒有相配的擴展名,看一看該名稱是否 與目錄名相配。如果確實如此,START 會在那個路徑上調用 Explorer。如果從命令行執行,則等同於對那個路徑作 CD /D。
十、shift命令
1、介紹
更改批處理文件中可替換參數的位置。
2、語法
SHIFT [/n] 如果命令擴展被啟用,SHIFT 命令支持/n 命令行開關;該命令行開關告訴 命令從第 n 個參數開始移位;n 介於零和八之間。例如: SHIFT /2 會將 %3 移位到 %2,將 %4 移位到 %3,等等;並且不影響 %0 和 %1。