何謂批次檔(Batch File)?
• 將多個指令置於同一檔案,讓OS一次執行
• 文字格式,由Windows的cmd.exe解讀
• 提供多種指令
o 批次指令(cmd.exe提供)
o 內部指令(cmd.exe提供)
o 外部指令(OS/User提供)
• 版本演進:DOS -> Win9x -> Win2000/WinXP
• 優點:cmd.exe為OS內建,通用、簡單、不用編譯。特別適用於文字檔處理。
• 缺點:速度不快、無法撰寫複雜動作
應用面
• 排程定時:GUI方式、批次檔版本
• 更改IP:GUI版本、批次版本
• 登入時變換桌面
• 自動收送信
• 自動登入bbs
• 自動ftp下載
• 自動化google查詢
• 自動化MP3壓縮
• 自動備份資料
• 自動化傳送簡訊
• ..............
常用指令
• 萬用字元: *.exe ????.bat
• 目錄: . .. nul
• cmd的DOS指令
o 檔案目錄指令:dir, copy, del, md, cd, rd ...
o 導向指令: |, >, <, >>
• cmd的批次指令
o for, if, set, goto, exit, echo ...
• 外部指令
o 篩選指令:more, findstr, sort
o 常用指令:telnet、ftp、ping、ipconfig、chkdsk、xcopy....
o 其他指令:開始/說明及支援/搜尋:"命令列參照"
CMD的DOS指令DEMO
• 啟動cmd.exe
o 開始/程式集/執行/輸入cmd.exe
• 建立一個叫mywork的目錄,並將工作目錄轉到mywork
o mkdir mywork & cd mywork
• 將c:\下的目錄列表存成dir.txt。
o dir /b /ad c:\ > dir.txt
• 尋找c:\winnt下,所有"setup"字樣的.txt檔(包含子目錄和子子目錄和.....)並排序存到my.txt
o dir /s c:\winnt\setup*.txt | sort > my.txt
• 尋找c:\winnt\comsetup.log中,有出現"dllhost"的那幾行(不分大小寫)
o findstr /i "call" c:\winnt\comsetup.log
• 請用echo在dir.txt後面附加上文字"=目錄列表紀錄="
o echo =目錄列表紀錄= >> dir.txt
• 以my.txt履寫dir.txt(不能有提示符號出現)
o copy /y my.txt dir.txt
CMD的Batch指令
• 可將DOS指令們寫入一文字batch檔,並利用batch指令加強其功能
o 可執行重覆動作,簡化手動工作
o EX. backup.bat
• 處處可使用
o 只要有Windows即可使用
o 語法和指令都比C/Java和其他語言都簡單
o 撰寫時間短
systemroot
username
var1
......
cmd.exe
my_1.bat
systemroot
username
var2
......
cmd.exe
my_2.bat
批次檔格式
• 單純的文字檔。
• 將重覆指令整合為一個檔案。
• 以 .bat 或 .cmd 作為副檔名
mkdir mywork & cd mywork
dir /b /ad c:\ > dir.txt
dir /s c:\winnt\setup*.txt | sort > my.txt
findstr /i "call" c:\winnt\comsetup.log
echo =目錄列表紀錄= >> dir.txt
copy /y my.txt dir.txt
demo.bat
批次指令:基本顯示
• 顯示字串:echo
o 秀出hihi的字樣:echo hihi
o 關閉指令的顯示,但仍可顯示字樣:@echo hihi
o 關閉此後所有指令的顯示:@echo off
o 開始此後所有指令的顯示:@echo on
• 註解
o rem
• 標號
o :
o 配合goto 時使用
批次指令:變數
• 環境變數操作
o 一般用法:set var=henry
o 讀取var變數:echo %var%
o 顯示目前全部變數:set
o 數值運算:set /a var=3*2
o 使用者指定:set /p var=Please write something:
• 特殊系統變數:%windir% %cd% %date% %systemroot% %username%...
• 設定區域變數:setlocal/endlocal
windir
username
var
......
cmd.exe
my.bat
Setlocal/endlocal範例
call demo.bat
echo %id%
output : oct
set id=oct
call demo.bat
echo %id%
output : %id%
setlocal
set id=oct
endlocal
批次指令:流程控制
• if, else
o if %NUMBER_OF_PROCESSORS%==1 echo you've only one processor
o if not "%OS%"=="" @echo your os is %os%
o if "%abc%"=="" (echo nothing) else (echo yes)
How about if "%abc%"=="" echo nothing else (echo yes)
o if /i "a"=="A" echo a is the same as A
• 跳至:goto :label
• 暫停:pause
Example
:startpoint
set choice=2
if %choice%==1 (
dir /w
) else if %choice%==2(
type c:\boot.ini
) else (
goto :startpoint
)
:What's the result ?
批次指令:特殊字元
• 括號:( ..... )
• pipe : |
• 導向: > >> <
• 特殊字元避開:
o & ()[]{}^=;!'+,`~ 加""表示為純字元,失去特殊意義
o &<>()@^| 加^表示為自身字元,失去特殊意義
• 注意:batch檔中把%視為特殊字元
o 要使用%的字元者,要寫成%%才行
o 指令列中的 %i ,在Batch中要寫成%%i
o 指令列中的3%2,在 Batch中要寫成3%%2
批次指令: For
• 重覆性處理
o for %i in (monkey dog monkey) do @echo I love %i
• 顯示目錄中的特定檔案
o for %j in (%windir%\*.txt) do type %j
• 從1顯示到100
o for /L %i in (1,1,100) do echo %i
• 列出目前所有的目錄
o for /D %i in (*) do echo %i
For /f 的使用!!!
• 將指定文檔逐行顯示
o for /f %i in (%windir%\system32\eula.txt) do @echo %i
• 剖析文字檔,抓出第2、3個區塊
o for /f "delims=, tokens=3,7" %i in (%windir%\svcpack.log) do @echo %i %j
• 剖析字串
o for /f "tokens=1,2,3,4" %i in ("my name is jtchen") do @echo your %j is %l, welcome!!
• 將執行結果視為文檔,進行剖析
o for /F %i in ('dir/b/ad') do echo %i
o 如果不要剖析呢?? (即希望整行輸出)
• 剖析輸出:秀出目前的環境變數
o for /f "delims== tokens=1" %a in ('set') do @echo %a
批次指令: %變數使用
• for變數
o 取出%i的檔名:%~ni
o 取出%i的時間:%~ti
• 指令列參數的變數延伸 :
o 取出第2參數的絕對路徑:%~f2
o 可用的變數延伸列表,請見for /?
• 環境變數延伸:
o 字串範圍擷取:%username:~m,n%,其中m表起始位位置,n表長度且n可為負數。
o 字串取代:%date:a=b% 將date字串中的a全部以b取代
o 詳情請見set /?
%i的變數延伸示範
for %i in (%windir%\system32\eula.txt) do (
echo The filename is %~nxi
echo The fullpath of file is %~fi
echo The create time of file is %~ti
echo The size of file is %~zi
)
變數的字串處理示範
set name=nthu
set name=pme2003
echo %name:2003=2004%
echo the department is %name:~1,-4%
echo the year is %name:~4,7%
echo the year is %name:~4%
批次指令:指令列參數的引用
• 傳參數進入批次檔的三種方法
o 指令列參數:%0, %1, ... %9
o 於呼叫前設定環境變數 => 不佳
• 指令列參數相關指令:
o 指令列全部參數:%*
o 遞移:
Shift 結果:%0->%1, %1->%2
Shift /2 結果: %1->%1 %2->%3
o When to use ?
對 檔案/目錄 按右鍵的"傳送到"功能
示範
• 實作一demo.bat如下
o echo you select a directory/file called %1
o pause
• copy demo.bat到%userprofile%\sendto的目錄下
o copy demo.bat %userprofile%\sendto
• 對任意檔案/目錄按右鍵選 傳送到/demo.bat,測試結果
批次指令:立即展開和延遲展開
• 預先展開:%var%
• 延後展開:!var!
• 為何延後展開
o 有些變數的變動性大,必須在使用的前一刻才能確定
• 啟動延遲展開的方法
o 在batch檔中以指令啟動
setlocal enabledelayedexpansion
o 在系統登錄檔中修改設定
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\DelayedExpansion的DWORD為1
• Win2000/WinXP預設是有啟動延遲展開的
立即/延遲展開的差異
set id=sep
(
echo %id%
set id=oct
echo !id!
)
set id=jt
(
echo %id%
set id=oct
echo !id!
)
set id=jt
(
echo jt
set id=oct
echo !id!
)
set id=jt
(
echo jt
set id=oct
echo !id!
)
set id=jt
(
echo jt
set id=oct
echo !id!
)
輸出: sep oct
立即/延遲展開的示範程式
• Ex1,
o set LIST=
o for /L %i in (1,1,5) do set LIST=%LIST% %i
o echo %LIST%
• Ex2,
o setlocal enabledelayedexpansion
o set LIST=
o for /L %%i in (1,1,5) do set LIST=!LIST! %%i
o echo %LIST%
The opinions and views expressed in this e-mail are solely those of the author and do not necessarily represent our company and its affiliates. If this e-mail is not originally intended for you, or received by you in error, do not disclose its content to anyone and delete it immediately. This e-mail may contain information that is legally privileged, confidential or exempt from disclosure.
沒有留言:
張貼留言