Windows batch檔案學習筆記
-
運作程式
-
call
文法: call [ [Drive:] [Path] FileName [BatchParameters]][:label [arguments]]
參數: [Drive:][Path] FileName 指定要調用的批處理程式的位置和名稱。Filename 參數必須是.bat 或 .cmd 擴充名的類型檔案。BatchParameters 指定批處理程式所需的指令行資訊(即參數項)。
調用另一個批處理程式,并且不終止父批處理程式(如果不用call而直接調用别的批處理檔案,那麼執行完那個批處理檔案後将無法傳回目前檔案并執行目前檔案的後續指令)。
call 指令接受用作跳轉目标的标簽。如果在腳本或批處理檔案外使用call,它将不會在指令行起作用。
@echo off echo 示例 echo start call call1.bat echo running call2 echo end pause @echo off echo 示例 call :label echo echo :label echo echo
-
start
call的時候,他們擁有同一個殼cmd.exe,在同一個程序當中,是以他們的變量是互通的。
start的時候,他們擁有兩個殼cmd.exe,但child.bat可以看成是main.bat的子程序,子程序可以讀取父程序中的變量
使用方式可在cmd中檢視:start/?
-
start 和 call 的不同
總結結論:
對于start,概況二句話:“不同程序不能傳值”,“相同程序單向傳值,老子傳兒子,非兒子傳老子”。
對于call,“同一程序,變量互通”。
-
-
echo的使用
- Echo :顯示目前ECHO的狀态:ECHO ON 或者ECHO OFF 。
- ECHO ON :ECHO狀态設為ON,将顯示指令行(如每行前的C:>等類似标志)。
- ECHO OFF:CHO狀态設為OFF,将不顯示指令行(如每行前的C:>等類似标志) 。
- ECHO 字元串 :将輸入的字元串顯示在CMD螢幕上。
- ECHO 字元串 &ECHO 字元串 … :&,類似and的意思,邏輯運算,用來顯示多行資料。
- ECHO 字元串 > 檔案路徑和檔案名:将字元串寫入檔案中,若已有資料将先清空後寫入。
-
ECHO 字元串 >> 檔案路徑和檔案名 :将字元串寫入檔案中,若已有資料将追加到末尾。
注意每次:ECHO 字元串 >> 檔案路徑和檔案名,指令之後,ECHO就回自動在在字元串後添加換行符,是以要想直接添加到檔案末尾,那麼檔案中已有的資料,不能是ECHO指令先前輸入的(或者手工删掉換行符)
-
(ECHO 字元串 &ECHO 字元串…)>檔案路徑和檔案名 :
将多行資料寫入檔案中(注意括号不能去掉,如果括号去掉的話,那麼隻能寫入最後一個,前面的将輸出在CMD視窗中。如果檔案中已經有資料,将先自動清空後再寫入。
-
(ECHO 字元串 &ECHO 字元串…)>>路徑和檔案名
将多行資料寫入檔案中(注意括号不能去掉,如果括号去掉的話,那麼隻能寫入最後一個,前面的将輸出在CMD視窗中。如果檔案中已經有資料,就将該字元串追加到檔案的末尾。
- (ECHO 字元串)>>檔案路徑和檔案名:在檔案中另起一行追加上字元串。如圖所示:
-
ECHO.:輸出空行,即相當于輸入一個回車
注意指令行中的“.”要緊跟在ECHO後面中間不能有空格,否則“.”将被當作提示資訊輸出到螢幕。另外“.”可以用,:;+等任一符号替代。
- ECHO答複語|指令檔案名:自動答複指令中的提問 ,不需要人為的輸入
-
ECHO ^G :“^G”是用Ctrl+G敲入連體符号,輸入多個^G可以産生多聲鳴響。
-
@指令:echo off相象,但它是加在其它指令行的最前面,表示運作時不顯示指令行本身。
-
rem 表示此指令後的字元為解釋行,不執行,隻是給自己今後查找用的。:: 也可以起到 rem 的注釋作用, 而且更簡潔有效
-
%指令
%表示參數,參數是指在運作批處理檔案時在檔案名後加的字元串。變量可以從 %0到%9,%0表示檔案名本身,字元串用%1到%9順序表示 -
~指令
- 用在 set /a 語句中時,它是一進制運算符号,表示将操作數字按位取反,例如,set /a num=~1的執行結果是-2,set /a num=~0的結果是-1
-
用在for語句中,表示增強for的功能,能夠提取到更多的資訊。例如:在批處理檔案的for語句中:
%%~i表示去掉第一對外側引号,
%%~zi表示擷取檔案的大小(以位元組為機關),
%%~ni表示擷取檔案名,
%%~xi表示擷取擴充名(帶點号)……它們可以組合使用,如%%~nxi表示擷取檔案名和字尾名
-
| 指令
一般而言,它以管道符号的身份出現,表示把在它之前的指令或語句的執行結果作為在它之後的指令或語句的處理對象,簡而言之,就是把它之前的輸出作為它之後的輸入,例如:echo abcd|findstr “b”,表示把echo abcd的執行結果,作為findstr “b” 的執行對象,也就是在字元串abcd中查找b字元;如果test.txt中有abcd字元串,則該語句與 findstr “b” test.txt 具有同樣的效果; -
set指令
-
設定變量
格式:set 變量名=變量值
詳細:被設定的變量以%變量名%引用
-
取消變量
格式:set 變量名=
詳細:取消後的變量若被引用%變量名%将為空
-
展示變量
格式:set 變量名
詳細:展示以變量名開頭的所有變量的值
-
列出所有可用的變量
格式:set
-
電腦
格式:set /a 表達式
示例:set /a 1+2*3 輸出 7
-
設定變量為表達式計算後的值
set a=1+2
echo %a% ==>輸出1+2
set /a a=1+2
echo %a% ==>輸出3
-
設定變量為使用者輸入的值
set /p a=輸入一個值 ==>輸出 輸入一個值
echo %a% ==>顯示使用者輸入的值
-
替換變量值的内容
文法:set newVar=”oldVar:str1=str2%
将變量oldVar的值中的str1替換成str2,并将替換後的變量值賦給newVar.
-
字元串截取
%Var:~start,len% 注意:從0開始。
%Var:~-len% 截取倒數len位
%Var:~0,-len% 截取從第一位開始,倒數第len位結束的值。
-
-
-
:、:: 指令
- 以:打頭的單個的:表示該行是一個标簽,它之後的内容是一個标簽段,如:test,則表示:test之下的内容是标簽段,而test是這個标簽段的名,可以用 goto test 、goto :test 跳轉到該标簽段或用 call :test 調用該子過程;
- :: 而連續兩個冒号打頭表示該行内容為注釋内容,實際上,:: 是個無效的标簽名,:加上空格同樣可以起到注釋的作用,此時,::的功能和注釋指令rem相同;但是,rem 注釋語句中的某些指令符号如重定向符号和管道符号還是會執行,而如果用::來注釋的時候,與::同處一行的所有指令或符号直接被指令解釋器忽略掉,無形中提高了注釋的相容性和整個程式的執行效率,并且在衆多的指令語句中更顯得醒目,是以,注釋語句推薦使用::的格式
-
控制指令
-
if “參數” == “字元串” 待執行的指令
== 等于;EQU等于;NEQ不等于;LSS 小于;
EQ 小于或等于;GTR 大于;GEQ大于或等于
- if exist 檔案名 待執行的指令
-
if errorlevel 數字 待執行的指令
如果傳回碼等于指定的數字,則條件成立,運作指令,否則運作下一句。如if errorlevel 2 goto x2,DOS程式運作時都會傳回一個數字給DOS,稱為錯誤碼errorlevel或稱傳回碼
-
FOR [%%cariable] in (集合) DO [指令]
%%variable 指定一個單一字母表示可替換的參數。
(set) 指定一個或一組檔案。可以使用通配符。
command 指定對每個檔案執行的指令。
command-parameters 為特定指令指定參數或指令行開關
參數:FOR有4個參數 /d /l /r /f
/d:FOR /D %%variable IN (set) DO command [command-parameters]
如果集中包含通配符,則指定與目錄名比對,而不與檔案名比對。
如果 Set (也就是我上面寫的 “相關檔案或指令”) 包含通配符(* 和 ?),将對與 Set 相比對的每個目錄(而不是指定目錄中的檔案組)執行指定的 Command
*号表示任意N個字元,而?号隻表示任意一個字元
/R:FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
檢查以 [drive:]path 為根的目錄樹,指向每個目錄中的FOR 語句。如果在 /R 後沒有指定目錄,則使用目前目錄。如果集僅為一個單點(.)字元,則枚舉該目錄樹。 遞歸
1、set中的檔案名如果含有通配符(?或*),則列舉/R參數指定的目錄及其下面的所用子目錄中與set相符合的所有檔案,無相符檔案的目錄則不列舉。
2、相反,如果set中為具體檔案名,不含通配符,則枚舉該目錄樹(即列舉該目錄及其下面的所有子目錄),而不管set中的指定檔案是否存在。這與前面所說的單點(.)枚舉目錄樹是一個道理,單點代表目前目錄,也可視為一個檔案
/L : 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)
-
-
目錄切換
- CD [盤符][路徑]:同一個分區的切換
- CD /d [盤符][路徑]:不同分區的切換
- %cd%:顯示目前的完整路徑
-
常用指令指令
Del:删除檔案
Copy:複制檔案
Xcopy:複制檔案夾
Md:建立檔案夾
rd:删除檔案夾
ren:重命名檔案(夾)
move:移動檔案(夾)
find:字元串查找
findstr:字元串查找增強,可以進行模式比對搜尋
-
重定向符 >、>>
管道指令的優先級高于重定向指令,重定向指令的優先級高于組合指令:|、>、&&
重定向符, 意思是傳遞并且覆寫,它所起的作用是将運作的結果傳遞到後面的範圍(後邊可以是檔案,也可以是預設的系統控制台,即指令提示符)。
重定向符将指令的輸出結果追加到其後面的裝置中去。這個符号的作用和>有點類似,但他們是有差別的 >>是
-
指令管道符 |
echo Y|rd /s c:\abc,通過管道指令|将echo y 的結果傳給rd /s c:\abc 指令,進而達到自動輸入y 的目的 -
轉義字元 ^
要輸出特殊字元,就需要用 echo ^>、echo ^|、echo ^|^|、echo ^^……之類的格式來處理 -
組合指令 &、&&、||
&符号,允許同時執行多條指令,當第一個指令執行失敗了,也不影響後邊的指令執行。這裡 & 兩邊的指令是順序執行的,從前往後執行。
&&符号,允許同時執行多條指令,當碰到執行出錯的指令後将不再執行後面的指令,如果一直沒有出錯則一直執行完所有指令。
||符号,正确的指令後将不執行後面的指令,如果沒有出現正确的指令則一直執行完所有指令
-
變量引導符 %
- 變量引用:當百分号成對出現,并且其間包含非特殊字元時,如%var%、%str%
- 形式參數的引用,%0 表示批處理檔案本身,包括完整的路徑和擴充名;%1至%9 表示第一個參數至第九個參數。
-
set /a 語句,表示兩數相除取餘數。在指令行視窗中,隻需要單個的%,在批處理檔案中,需要連續兩個百分号,寫成%%。
set /a num=4%%2,得到num為0而非2
- 轉義符号:如果要顯示%本身時,需要在前面用%來轉義
-
界定符 “”
- 在表示帶有空格或特殊符号的路徑時常要用”“來将路徑括起來。
- 表示其中的内容是一個完整的字元串。set “var=abc 123”
-
setlocal ENABLEDELAYEDEXPANSION (延遲環境變量擴充)
在我們啟用了”延遲環境變量擴充”後,當CMD在解釋涵有嵌套格式的指令時,他會把嵌套的指令一條一條的先執行一次,然後再進行比對操作,這樣我們的指派操作就會完成.并且再”延遲環境變量擴充”啟用後,CMD會用!号來判斷這是不是一個變量,如沒啟用來變量 用%name%這樣的格式判斷,啟用後就用!name!這樣的格式判斷了,這個符号我們需要注意!@echo off set var=test for /l %%i in (,,) do ( set var=%%i echo %var% ) ::會列印個test了,說明for /l %%i in (,,) 沒有起作用
@echo off setlocal ENABLEDELAYEDEXPANSION set var=test for /l %%i in (,,) do ( set var=%%i echo !var! ) ::會正常列印出