2016年11月9日 星期三

[FW][DOS]Batch File, set, echo , for , %

何謂批次檔(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%


**********************Confidentiality Notice************************
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.

沒有留言:

張貼留言