茫茫網海中的冷日 - 對這文章發表回應
茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1672361 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00149.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2015/12/17 5:44:15

深入淺出Windows BATCH

1.什麼是Windows BATCH

BATCH也就是批處理文件,有時簡稱為BAT,是Windows平台上的一種可執行腳本,與*nix(Linux和Unix)上的Shell腳本和其他的腳本(Perl,Python)等是一樣的,實質上就是一個文本文件,但是用特定的軟件去解釋的時候,就變成了可執行腳本。在Windows上,可執行腳本就是BATCH文件,也叫批處理文件,這是從DOS時代遺留下來的名字,意思就是把很多命令放到一起來執行。它的擴展名是*.bat,雙擊便可直接運行,在命令行(CMD或叫做命令提示符)下面也可以當作一個命令來運行。因為這是Windows支持的東西,所以只能在Windows平台使用。(特殊情況除外,不要鑽牛角尖,沒意思的)。比如著名的Windows垃圾清理小工具就是一個BAT批處理文件。

2. 為什麼需要BAT

歸根結底是為了提高工作效率。這個解釋起來比較費勁,因為在GUI大行其道的今天,再提命令行,很多人會不熟悉,或者認為這是倒退。但是眾多關於提高工作效率的書籍都會提到命令行可以大大的提高效率,因為命令可以方便的直接寫路徑,而不用在文件瀏覽器中一層一層的打開,和命令行可以把命令組合起來,也就是把不同的命令組合起來來完成一個任務,而不用打開多個GUI窗口來做(甚至很多時候GUI窗口都是無法完成的)。對於這點*nix的程序猿們應該最有體會,真正的*nix高手是不會離開命令行的。他們的工作只需打開一個Terminal(命令行),編輯用Vim,其他全都用命令行的工具來完成,甚至他們都不用鼠標!

Windows的CMD沒有*nix的Terminal那麼強大,所以完全在其內做開發有點不切實際,雖然有很多工具可以讓CMD變得強大些,但是還是無法達到*nix那樣的地步,因為它們從根本上就是走的不同的路線*nix是為了開發人員準備的,而Windows是為了普通大眾準備的。
再說的具體一點就是為了DRY和Automation,也就是說讓計算機幫你完成一些機械重複性的工作任務(對於DRY和Automation可以參考《The Productive Programmer》和《Pragmatic Programmer》)。因為BAT可以組合命令,所以某個操作需要超過一個命令,或者參數較多時,或者路徑較長時,就可以把它寫成BAT,變成一個簡單的命令,一次二個可能沒感覺,但是當天天都用時,就省去了大量的Typing。舉個例子,比如我要經常性的在手機上抓取Tcpdump,然後查看,通常要用到如下的命令:

D:\>adb shell tcpdump -p -s 0 -i any -w /sdcard/capture.pcap
D:\>adb pull /sdcard/capture.pcap .
然後再用Wireshark去查看這個文件。如果一個一個的去敲的話,容易寫錯,通常要試幾次才能成功。但是如果寫一個BAT腳本的話:


::tcpdump.bat
@echo off
set dir=/sdcard
set file=capture.pcap
adb shell rm -r %dir%/%file%
adb shell tcpdump -p -s 0 -i any -w %dir%/%file%
@echo on
::gettcpdump.bat
@echo off
set dir=/sdcard
set file=capture.pcap
set wireshark="C:\Program Files\Wireshark\Wireshark.exe"
del /q %file%
adb remount
adb pull %dir%/%file% .
%wireshark% %file%
@echo on
第一個腳本tcpdump.bat是抓取,第二個腳本是查看所抓取的數據,我每次只需運行這二個命令就可以輕鬆的查看:


D:\>tcpdump
Press Ctrl-C to stop capturing
D:\>gettcpdump
之後Wireshark就會把所抓取的數據打開,直接看就行了。

3. 哪裡可以用到BAT

任何需要重複做的事情都可以嘗試用腳本來完成。比如,每天的版本更新,拷貝文件,每天都使用的命令等等。如前面所說的,只要某些事情你超過第二次做,或者每天都做幾十次,就應該考慮用BAT。或者,某些命令很複雜,也要使用BAT,即使把二個簡單命令合成一個BAT也是值得的。比如,調試的時候要查看手機內的數據,就可以用腳本來完成:

::getmmsdb.bat
@echo off
set datadir=/data/data/com.android.providers.telephony/databases
set mmsdb=mmssms.db
del /q %mmsdb%
adb remount
adb pull %datadir%/%mmsdb% .
sqlite3 %mmsdb%
@echo on
因為BAT中可以寫任何可以在CMD命令行中運行的命令,另外,很多應用程序也提供了命令版本,比如WinRAR,如果你需要從某個地方拷貝東西並解壓,就可以用BAT:


::copyversion.bat
@echo off
del /q stable.rar
set winrar="C:\Program Files\WinRAR\WinRAR.exe"
copy /y \\192.168.0.1\version\release\stable.rar .
%winrar% x stable.rar
@echo on
不管怎麼樣,這都比手動去做要來的方便。

另外就是*nix上面的很多實用命令行程序都有了Windows的版本,比如Subversion,它有一個版本就是專門用於命令行的,所以把所安裝的軟件與內置的一些命令組合起來,可以創造出很強大的Automation的工具。
還有一點就是第三方工具的拓展,Windows本身的內置命令很少,但是有第三方的工具來拓展它比如PowerShell等,加之這些工具,可以讓程序員的工具箱更加的豐富和強大。
其實,這裡最關鍵的地方不在BAT,或者你是否會寫這樣的腳本,而是在於你能否意識到BAT腳本可以替代手工。可以讀一讀《The Productive Programmer》和《Pragmatic Programmer》來獲取點靈感。

4. 如何使用BAT

BAT是一個可執行腳本,也就是說它跟一個*.exe可執行程序一樣,只要雙擊它就可以執行了。另外的方式就是通過CMD在命令行中啟動它,但需要給出它的路徑,也就是說要讓解釋程序能找到它,所以推薦的做法是把所寫的BAT收集整理到一個文件夾中,然後把這個文件放到系統的環境變量PATH中去,這樣就可以在任何的路徑中使用了。
如,我的配置是這樣的,把所有的BAT放在D:\work\bin下面,然後把D:\work\bin加到Path變量中去。
添加環境變量的方法是右擊"我的電腦"-->"屬性"-->"高級"-->環境變量-->在用戶變量中編輯Path(如果沒有就新加一個)然後把D:\work\bin加入其中,與其他的路徑用分號;分隔。之後就可以像運行內置命令一樣來運行它了。(如果你有權限,也可修改系統變量)。

5. 如何寫BAT

0. 文件的編輯

它就是一個文本文件,所以用最簡單的記事本就可以編輯。當然,你用其他的強大的工具也可以,比如如果用Vim編輯還能有語法高亮等VIP級待遇。無論用什麼編輯器,一定要注意保存時一定把要文件的擴展名記為*.bat,否則就不再是可執行腳本了,大家都是程序猿,你們懂得。
前面提到了,BAT其實就是把CMD中的命令或其他可執行命令組合到一起,所以BAT的基石是命令,下面重點講下命令。

1. 基本命令及其通用的規則

這裡指的基本命令是指CMD命令中的的內置命令,也就是help命令所顯示的命令,不包括在環境變量中的以及第三方的,那些是外部命令。
基本的命令有文件操作,文件夾操作,時間等等。比如:del, ren, rd, cd, copy, xcopy, time等等。

a. 命令的一般格式

與*nix系統的命令的一樣,它的格式也都是
command [options] [arguments]
其中options是控制和改變命令的行為,每個選項必須以/開頭,後面跟選項,可以把多個選項連在一起寫,也可以用空格格開,每個選項也可以跟自己的參數。arguments就是傳遞給命令的參數,也就是要命令所執行的對象。如:

del /f /q /s tmp
這裡/f /q /s就是三個選項/f意思是強制刪除,/q是安靜模式,也就是刪除前不提示,/s是刪除子目錄;而tmp則是要刪除的對象也就是del命令的參數。
dir /on tmp

這裡的話/on是它的選項,其中/o是選項,意思是排序,而n是選項的參數,合起來就是按名字排序。
通常,一個命令都有缺省的選項和參數,也就是說你不指定,也會有。具體選項不同的命令會有不同的選項。

b. 一些通用的選項:

雖然不同的命令有著不同的參數,但是有一些共同的:

  • /?  顯示幫助信息,所有的命令都有(跟*nix的-h一樣)
  • /s  對於文件夾操作來講是包括子目錄(跟*nix的-r一樣)
  • /q  安靜模式,也就是某些操作不要提示,比如刪除時,或覆蓋文件時不要提示

c. 獲取幫助

不可能記住所有的東西,所以每當遇到一個命令時就要獲取其幫助信息。
help command

command /?
就可以看到command的幫助信息。而直接用help命令,則可以查看CMD命令行的幫助,也就是說它支持哪些內置命令。需要注意的是help只能查看有哪些內置以及顯示內置命令的幫助信息。對於那些在環境變量Path中的命令,它是無法獲取幫助信息的,對於那些命令,只能通過命令本身去找幫助信息。

2. 擴展命令

就是CMD命令行非內置的,存在於環境變量Path中的命令,這些命令使用起來跟內部命令無區別,都可以在CMD中直接調用。這些命令通常都是由第三方或操作系統提供,完成某些特定領域的功能,比如C:\Windows\System和C:\Windows\System32下的很多可執行程序,都可做為外部命令來使用,比如你在命令行中直接輸入notepad然後按回車,記事本就會打開。以及安裝的第三方程序如WinRAR等。
這些程序或許支持命令模式,或許不支持,這個要去參考程序的文檔,另外,即使其支持命令行,選項和參數也要參考文檔。

3. 註釋和@及echo off

在BAT中以二個冒號開頭的一行為註釋,::只能註釋一行,且必須在一行的開頭
如:
:: This is a comment
:: copy a file to somewhere
@與echo off的作用一樣,都是DOS 批處理的一個特殊標記符, 僅用於屏蔽命令行回顯。其中@只能影響當前行,而echo off是關閉,直到echo on把回行顯示打開。二個主要在BAT腳本中運用,在命令行中直接用看不出不同。在BAT中每當執行一個命令時,都會在CMD命令中顯示出這個命令,比如:
::mydir.bat
dir /on
這樣的腳本在運行時會是這樣的:
D:\>mydir
D:\>dir /on
(顯示文件夾的內容)

為了在執行腳本時不顯示當前命令,就要用到關閉回行顯示功能@和echo off,所以幾乎每個BAT都有這二行
@echo off
....
@echo on
在開始腳本前關閉回行顯示,然後在結束時再打開。用@的目的是把關閉回行顯示命令的回行顯示也不要顯示出來(抱歉,有點繞)。
為什麼要關閉回行顯示呢?因為回行顯示會跟所執行命令的輸出混全在一起,所以看起來很不爽,特別是當BAT腳本的命令比較多時,所以要關閉它。

4. 管道

與*nix一樣,BAT中也可以使用管道,可以使用管道來把命令組合起來,比如最常見的使用方式就是:
type logfile.txt | more
以分屏查看。

5. 變量的定義和使用

在BAT中用set命令來定義一個變量,然後用二個百分號來引用這個變量,所引用的地方全用所定義的值來完全替換,如:

D:\>set logfile="D:\logs\log.txt"
D:\>echo %logfile%
D:\logs\log.txt

6. 重定向

與*nix一樣BAT也支持文件流重定向。

  • <    重定向輸入流,最常用的方式是用文件代替標準輸入
  • >    重定向輸出流,最常用的方式是把程序執行結果放到文件中
  • >>   重定向輸出流,添加模式,也就是說從文件尾部開始添加,最常用的地方是保存Log用

雖然Windows看起來與*nix相去甚遠(特別是前幾年),但是BAT裡面有著跟*nix和SHELL類似的一些重要的特性(管道和重定向),所以BAT還是相當強大的,雖然不能跟SHELL比,但是至少可以幫助我們完成很多機械重複的工作。

7. 命令行參數

跟編程語言(C, C++, Java, Perl)和SHELL一樣,BAT也支持命令行參數,也就是執行命令時所給的參數。在BAT中用%[1-9]來引用它們,如:
::mytype.bat
@echo off
type %1
type %2
那麼在運行時,
C:\>mytype one.txt two.txt
其中%1就是one.txt,%2就是two.txt
跟C和C++語言一樣,還有一個%0可以用它就是腳本的名字。

8. start命令

在*nix的SHELL中可以用command &的形式來在後台運行一個命令,也就是用一個新進程來運行命令,而不阻塞下面的命令。有些時候這個很有用,比如你想用BAT打開幾個XLSX文件,用如下腳本:

::openxls.bat
@echo off
set excel="C:\Program Files\Microsoft Office\Office12\EXCEL.EXE"
%excel% "D:\documents\status.xlsx"
%excel% "E:\report\report.xlsx"
@echo on
這樣會有問題,運行到打開第一個文件時會停在那裡,除非你關掉status.xlsx否則,它會阻塞在那裡,第二個文件不會執行到。

解決方法就是為每一個會阻塞的命令開啟一個新的進程,用start命令:

::openxls.bat
@echo off
set excel="C:\Program Files\Microsoft Office\Office12\EXCEL.EXE"
start %excel% "D:\documents\status.xlsx"
start %excel% "E:\report\report.xlsx"
@echo on
這樣的話,二個文件都會被打開。

9. BAT的不足之處

前面都在說BAT如何強大,但是畢竟Windows沒有像*nix那樣給予命令行的強大支持,它跟SHELL相比還差的很遠,在執行命令和文件操作方面可能沒什麼大差別,但是在某些方面它還很弱:

a. 輸入的處理

雖然可以用<來重定向輸入流,但是它對輸入的處理很弱,特別的它沒的讀取的命令(SHELL中的read),它也不能按行讀入文件。所以當涉及到文件處理時,它就顯得力不從心了。

b. 文本處理的能力

如上一條說,很多時候能需要從一個文本文件讀取內容,然後對其做一些處理。這點上面BAT很弱,跟SHELL是沒法比的。因為SHELL本身有靈活的讀取函數,可以按行讀,也可以把一行按不同的單詞來讀,再加上其本身有字串處理函數,還有就是*nix有豐富的字串處理命令如grep, sed, ed, awk等等。當然,現在這些東西也都有了Windows的版本。但是用BAT來處理文件還是一個相當麻煩的事。
對於文本處理,最好是能用Perl等程序性的腳本來寫,它在處理輸入,讀取和處理,以及正則表達式上都有很好的支持。

10. 開機自動運行

某些軟件會有內部選項以達到開機自動運行,甚至它總是開機自動運行,比如著名的QQ,迅雷暴風影音等等。對於我來說這些都是流氓軟件,特別是那些無法取消其開機自動運行的,會造成開機時很卡。
但是我們日常工作都需要開一些固定的軟件,比如郵件客戶端,Eclipse,打開某個特定的文件夾,打開某個特定的網頁等等。這些正派的軟件反倒沒有「開機自動運行」選項,怎麼辦呢?這時BAT就派上大用場了,可以寫一個叫做startup.bat,在裡面把要運行的程序都寫上,然後在Start Menu的Startup文件夾中建一個指向我們startup.bat的快捷方式:


:: startup.bat
@echo off
"C:\WINDOWS\explorer.exe" "C:\Documents and Settings\User\桌面\alex"
set ie="C:\Program Files\Internet Explorer\iexplore.exe"
set mail="https://webmail.microsoft.com/"
start %ie% %mail%
start "C:\Program Files\Microsoft Office\Office12\EXCEL.EXE" "D:\documents\report.xlsx"
start mstsc d:\work\rdps\linux.RDP
start mstsc d:\work\rdps\windows.RDP
ddms.bat
clean.bat
D:\eclipse-java-galileo-SR2-win32\eclipse.exe
@echo on
每個工具都有其優勢和不足,我們要做的就是用正確的工具去做正確的事,以期達到最高效的工作效率。雖然有Perl等更加強大的工具,雖然有PowerTools等拓展工具。但是當你有環境的限制的時候,比如由於工作環境的限制,你只有一個Windows系統,沒有Perl或PowerTools時,你能用的就只有BAT了。這個時候就要發揮BAT的威力了,複雜的它做不了,但是簡單的它還是能很好的勝任的。

腳本,強大也好,局限也罷,是為了幫助我們解決一些重複性的問題的。所以關鍵不在腳本,而是在於我們要發現日常工作中的重複性的勞動,然後用腳本來替代。切記,計算機的重複性遠比人好,而且計算機就是被設計用來代替人類做一些機械重複的工作的,這是它的使命,讓它完成它的使命吧!


參考資料:這幾篇文章介紹的比較詳細
基本介紹
  」石頭札記 批處理文件「
這二個哥們寫了很多操作字串的BAT
 "DOS -string operations"
  "DOS - String Manipulation"


原文出處: 深入浅出Windows BATCH - 浪人的星空 - 博客频道 - CSDN.NET
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|