2016年11月9日 星期三

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

何謂批次檔(Batch File)
    將多個指令置於同一檔案,讓OS一次執行
    文字格式,由Windowscmd.exe解讀
    提供多種指令
o      批次指令(cmd.exe提供)
o      內部指令(cmd.exe提供)
o      外部指令(OS/User提供)
    版本演進:DOS -> Win9x -> Win2000/WinXP
    優點:cmd.exeOS內建,通用、簡單、不用編譯。特別適用於文字檔處理。
    缺點:速度不快、無法撰寫複雜動作
應用面
    排程定時:GUI方式、批次檔版本
    更改IPGUI版本、批次版本
    登入時變換桌面
    自動收送信
    自動登入bbs
    自動ftp下載
    自動化google查詢
    自動化MP3壓縮
    自動備份資料
    自動化傳送簡訊
    ..............

常用指令
    萬用字元: *.exe     ????.bat
    目錄: .  .. nul
    cmdDOS指令
o      檔案目錄指令:dir, copy, del, md, cd, rd ...
o      導向指令: |, >,  <, >>
    cmd的批次指令
o      for, if, set, goto, exit, echo ...
    外部指令
o      篩選指令:more, findstr, sort
o      常用指令:telnetftppingipconfigchkdskxcopy....
o      其他指令:開始/說明及支援/搜尋:"命令列參照"
CMDDOS指令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
    請用echodir.txt後面附加上文字"=目錄列表紀錄="
o      echo =目錄列表紀錄= >> dir.txt
    my.txt履寫dir.txt(不能有提示符號出現)
o      copy /y my.txt dir.txt



CMDBatch指令
    可將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
    剖析文字檔,抓出第23個區塊
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\DelayedExpansionDWORD1
    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.

沒有留言:

張貼留言