發表文章

目前顯示的是有「來源:https://www.gitbook.com/book/peterju/cmddoc/details」標籤的文章

doc 變數

變數 設定變數 批次檔使用的變數就是作業系統的 環境變數 ,一般來說都視為字串變數,而且是是全域變數,我們可以透過下面的指令觀察有哪些環境變數。 set 設定變數時,一樣使用 set 指令, 注意等號左右不能有空白 。 set myname=Peter 若設定的變數代表路徑時,因為路徑中可能包含空白字元,建議以雙引號含括起來較好,單純顯示沒問題,但在命令列解析時,因為會以空白當作參數分隔,若沒有用雙引號時,會被分開當成2個參數處理,造成錯誤。 set ProgramPath="c:\Program Files (x86)" 取用變數 取用變數時,則需在變數前後加上% echo %myname% 取消變數 取消變數時,只需依照設定變數的方式,但值是空白即可 set var= 變數的運算 set 使用 /a 參數,可使後面的敘述成為運算式 set var=6 set /a var+=3 需注意的是,若變數的值為08或09的時候,會被視為一個錯誤的8進位而其值為0,影響後續的計算 set var=08 set /a var+=3 set var=09 set /a var+=3 輸入提示 set 使用 /p 參數,等號(=)開始到冒號(:)結束的一段文字將視為輸入的提示 @echo off :menu echo 1.dir echo 2.dir /w echo 0.離開 set /p id=請輸入功能代碼: if %id%==1 goto one if %id%==2 goto two if %id%==0 goto zero :one dir goto menu :two dir /w goto menu :zero 字串的擷取 批次檔也可以像一般程式語言一樣,做到從字串的第n個位置開始擷取m個字元這件事 步驟 %date% %date :~0,4 % 說明 當下日期變數 變數從第0位開始取4碼  1 值 2015/10/17 週六 2015 上述說明的程式碼如下 set today=%date:~0,4%/%date:~5,2%/%date:~8,2% echo %today% 1 字串擷取符號說明 冒號(:) 波浪符號(~) 開始位置(從0...

doc call呼叫外部程式與副程式

呼叫外部程式與副程式 常用的呼叫外部程式有下列幾種方式 call 外部程式 從批次檔中呼叫外部程式並可傳遞參數,在同一個 shell 環境下,可共同存取相同的環境變數。 rem test.cmd @echo off call test1.cmd hello pause rem test1.cmd @echo off echo %1 timeout 6 cmd /c 外部指令 呼叫一個新的shell程式(cmd)並於指令執行完成後結束這個 shell ,返回原來的shell環境,外部程式執行在新的shell之中,因此存取的環境變數與原程式不同,有區域變數的遮蔽效果 @echo off cmd /c notepad.exe exit 留意上述範例執行情形,在notepad.exe關閉以前,不會執行 exit 指令,因為指令尚未結束,還留在新的shell當中。 開始一個新視窗執行程式 => start [program] [parameters] 因為 cmd /c 具有同步特性(會等外部程式執行完畢),因此不太適合呼叫需與使用者互動的視窗程式,因為命令提示視窗會因等待而保持開啟,所以適合改用 start 來呼叫執行。 @echo off start notepad.exe exit 使用 /wait 也可以改讓 start 具有同步特性,詳情參考 start /? 副程式呼叫 批次檔的副程式呼叫也是利用 call 指令,不同的是 call 的對象不是外部程式 ,而是相同檔案中的標籤,也可以傳遞參數。 因為批次檔的副程式僅利用標籤代表區塊的開始,因此副程式都放在程式的尾部,之後就不要寫任何命令敘述了,代表區塊的結束。 因為批次檔循序讀取的特性,就算副程式沒有被呼叫,也會被當作標籤一般順序執行下來,因此在副程式之前通常要加上 goto :EOF 強制結束批次檔。 call :標籤 參數1 參數2... @echo off rem for迴圈使用方式請參考本手冊相關章節 for %%i in (*.dll *.exe) DO CALL :SubRoutin "%%i" pause goto :EOF :SubRoutin echo %1, %~n1, %~x1

doc for 迴圈

for 迴圈 批次檔的 for 迴圈很重要,但有些特性比較隱晦,不容易駕馭,下面稍加整理需注意使用之處 for 迴圈初始化變數,在撰寫為批次檔時,請使用 %%variable,而在命令列執行時要改用 %variable。 for 迴圈初始化變數有大小寫的區分,所以 %%i 不同於 %%I。 for 迴圈內的變數會有取值異常的情形。 以下針對第3點取值異常的情形作一說明,迴圈的敘述通常是以下列格式撰寫,左括弧與 do 同一行,右括弧放在最後面獨立成行 for %%i in (*) do ( echo %%i timeout 1 ) 但其實批次檔會把迴圈內的敘述集結成一行變成 for %%i in (*) DO echo %%i & timeout 1 但就因為集結成一行的關係,批次檔在命令解譯器進行直譯時,會對每一行敘述中的變數進行預先賦值的動作,因此會造成同一行敘述中,對變數改變其值卻無效的情形,請猜一下底下這個範例會顯示的值是甚麼? @echo off set var=Peter set var=John & echo %var% timeout 6 結果仍是 Peter ,因為針對第3行,命令解譯器會預先賦值給%var%,然後才進行 set var = John,若要正確取出此變數異動後的值 John ,必須  啟用變數延遲展開(SETLOCAL ENABLEDELAYEDEXPANSION) 的功能,在開啟用變數延遲展開功能之後,取用變數的方式要由 %var% 更改為 !var!,將範例修改如下 @echo off SETLOCAL ENABLEDELAYEDEXPANSION set var=Peter set var=John & echo !var! timeout 6 批次檔中只要是利用括弧()分成多行撰寫的指令,實際上都看成一行,在括弧()裡面取用變數時都會遇到需要開啟用延遲環境變數擴充功能的問題,一定要特別注意。 以下直接說明範例不特別解釋語法,細節請透過 for /? 學習 找出符合條件之檔案的 for 迴圈 顯示批次檔存在的目錄中所有符合 .mp4  .avi *.mpg的檔案名稱 for %%i in (*.mp4 *.a...