批處理文件(batch file)包含一系列 DOS命令,一般用於自動執行重複性任務。用戶只需雙擊批處理文件即可執行任務,而無需重複輸入相同指令。編寫批處理文件很是簡單,但難點在於確保一切按順序執行。編寫嚴謹的批處理文件能夠極大程度地節省時間,在應對重複性工做時尤爲有效。html
在Windows中善用批處理能夠簡化不少重複工做git
2016年03月29日 - 初稿github
閱讀原文 - http://wsgzao.github.io/post/windows-bat...windows
擴展閱讀網絡
如何編寫批處理文件 - http://zh.wikihow.com/編寫批處理文件
批處理經常使用命令總結 - http://xstarcd.github.io/wiki/windows/wi...編輯器
批處理(Batch),也稱爲批處理腳本。顧名思義,批處理就是對某對象進行批量的處理。批處理文件的擴展名爲bat。工具
目前比較常見 的批處理包含兩類:DOS批處理和PS批處理。PS批處理是基於強大的圖片編輯軟件Photoshop的,用來批量處理圖片的腳本;而DOS批處理則是基於DOS命令的,用來自動地批量地執行DOS命令以實現特定操做的腳本。這裏要講的就是DOS批處理。post
批處理是一種簡化的腳本語言,它應用於DOS和Windows系統中,它是由DOS或者Windows系統內嵌的命令解釋器(一般是COMMAND.COM或者CMD.EXE)解釋運行。相似於Unix中的Shell腳本。批處理文件具備.bat或者.cmd的擴展名,其最簡單的例子,是逐行書寫在命令行中會用到的各類命令。更復雜的狀況,須要使用if,for,goto等命令控制程序的運行過程,如同C,Basic等中高級語言同樣。若是須要實現更復雜的應用,利用外部程序是必要的,這包括系統自己提供的外部命令和第三方提供的工具或者軟件。測試
批處理文件,或稱爲批處理程序,是由一條條的DOS命令組成的普通文本文件,能夠用記事本直接編輯或用DOS命令建立,也能夠用DOS下的文本編輯器Edit.exe來編輯。在「命令提示」下鍵入批處理文件的名稱,或者雙擊該批處理文件,系統就會調用Cmd.exe運行該批處理程序。通常狀況下,每條命令佔據一行;固然也能夠將多條命令用特定符號(如:&、&&、|、||等)分隔後寫入同一行中;還有的狀況就是像if、for等較高級的命令則要佔據幾行甚至幾十幾百行的空間。命令行
系統在解釋運行批處理程序時,首先掃描整個批處理程序,而後從第一行代碼開始向下逐句執行全部的命令,直至程序結尾或碰見exit命令或出錯意外退出。
echo
rem
pause
call
start
goto
set
http://xstarcd.github.io/wiki/windows/wi...
回顯屏蔽 @
重定向1 >與>>
重定向2 <
管道符號 |
轉義符 ^
邏輯命令符包括:&、&&、||
http://xstarcd.github.io/wiki/windows/wi...
文件夾管理
cd 顯示當前目錄名或改變當前目錄。
md 建立目錄。
rd 刪除一個目錄。
dir 顯示目錄中的文件和子目錄列表。
tree 以圖形顯示驅動器或路徑的文件夾結構。
path 爲可執行文件顯示或設置一個搜索路徑。
xcopy 複製文件和目錄樹。
文件管理
type 顯示文本文件的內容。
copy 將一份或多份文件複製到另外一個位置。
del 刪除一個或數個文件。
move 移動文件並重命名文件和目錄。(Windows XP Home Edition中沒有)
ren 重命名文件。
replace 替換文件。
attrib 顯示或更改文件屬性。
find 搜索字符串。
fc 比較兩個文件或兩個文件集並顯示它們之間的不一樣
網絡命令
ping 進行網絡鏈接測試、名稱解析
ftp 文件傳輸
net 網絡命令集及用戶管理
telnet 遠程登錄
ipconfig顯示、修改TCP/IP設置
msg 給用戶發送消息
arp 顯示、修改局域網的IP地址-物理地址映射列表
系統管理
at 安排在特定日期和時間運行命令和程序
shutdown當即或定時關機或重啓
tskill 結束進程
taskkill結束進程(比tskill高級,但WinXPHome版中無該命令)
tasklist顯示進程列表(Windows XP Home Edition中沒有)
sc 系統服務設置與控制
reg 註冊表控制檯工具
powercfg控制系統上的電源設置
對於以上列出的全部命令,在cmd中輸入命令+/?便可查看該命令的幫助信息。如find /?
1 echo 和 @ 回顯命令 @ #關閉單行回顯 echo off #從下一行開始關閉回顯 @echo off #從本行開始關閉回顯。通常批處理第一行都是這個 echo on #從下一行開始打開回顯 echo #顯示當前是 echo off 狀態仍是 echo on 狀態 echo. #輸出一個」回車換行」,空白行 #(同echo, echo; echo+ echo[ echo] echo/ echo) 2 errorlevel echo %errorlevel% 每一個命令運行結束,能夠用這個命令行格式查看返回碼 默認值爲0,通常命令執行出錯會設 errorlevel 爲1 3 dir 顯示文件夾內容 dir #顯示當前目錄中的文件和子目錄 dir /a #顯示當前目錄中的文件和子目錄,包括隱藏文件和系統文件 dir c: /a:d #顯示 C 盤當前目錄中的目錄 dir c: /a:-d #顯示 C 盤根目錄中的文件 dir c: /b/p #/b只顯示文件名,/p分頁顯示 dir *.exe /s #顯示當前目錄和子目錄裏全部的.exe文件 4 cd 切換目錄 cd #進入根目錄 cd #顯示當前目錄 cd /d d:sdk #能夠同時更改盤符和目錄 5 md 建立目錄 md d:abc #若是 d:a 不存在,將會自動建立中級目錄 #若是命令擴展名被停用,則須要鍵入 mkdir abc。 6 rd 刪除目錄 rd abc #刪除當前目錄裏的 abc 子目錄,要求爲空目錄 rd /s/q d:temp #刪除 d:temp 文件夾及其子文件夾和文件,/q安靜模式 7 del 刪除文件 del d:test.txt #刪除指定文件,不能是隱藏、系統、只讀文件 del /q/a/f d:temp*.* 刪除 d:temp 文件夾裏面的全部文件,包括隱藏、只讀、系統文件,不包括子目錄 del /q/a/f/s d:temp*.* 刪除 d:temp 及子文件夾裏面的全部文件,包括隱藏、只讀、系統文件,不包括子目錄 8 ren 重命名命令 ren d:temp tmp #支持對文件夾的重命名 9 cls 清屏 10 type 顯示文件內容 type c:boot.ini #顯示指定文件的內容,程序文件通常會顯示亂碼 type *.txt #顯示當前目錄裏全部.txt文件的內容 11 copy 拷貝文件 copy c:test.txt d:test.bak 複製 c:test.txt 文件到 d: ,並重命名爲 test.bak copy con test.txt 從屏幕上等待輸入,按 Ctrl+Z 結束輸入,輸入內容存爲test.txt文件 con表明屏幕,prn表明打印機,nul表明空設備 copy 1.txt + 2.txt 3.txt 合併 1.txt 和 2.txt 的內容,保存爲 3.txt 文件 若是不指定 3.txt ,則保存到 1.txt copy test.txt + 複製文件到本身,其實是修改了文件日期 12 title 設置cmd窗口的標題 title 新標題 #能夠看到cmd窗口的標題欄變了 13 ver 顯示系統版本 14 label 和 vol 設置卷標 vol #顯示卷標 label #顯示卷標,同時提示輸入新卷標 label c:system #設置C盤的卷標爲 system 15 pause 暫停命令 16 rem 和 :: 註釋命令 註釋行不執行操做 17 date 和 time 日期和時間 date #顯示當前日期,並提示輸入新日期,按"回車"略過輸入 date/t #只顯示當前日期,不提示輸入新日期 time #顯示當前時間,並提示輸入新時間,按"回車"略過輸入 time/t #只顯示當前時間,不提示輸入新時間 18 goto 和 : 跳轉命令 :label #行首爲:表示該行是標籤行,標籤行不執行操做 goto label #跳轉到指定的標籤那一行 19 find (外部命令) 查找命令 find "abc" c:test.txt 在 c:test.txt 文件裏查找含 abc 字符串的行 若是找不到,將設 errorlevel 返回碼爲1 find /i 「abc」 c:test.txt 查找含 abc 的行,忽略大小寫 find /c "abc" c:test.txt 顯示含 abc 的行的行數 20 more (外部命令) 逐屏顯示 more c:test.txt #逐屏顯示 c:test.txt 的文件內容 21 tree 顯示目錄結構 tree d: #顯示D盤的文件目錄結構 22 & 順序執行多條命令,而無論命令是否執行成功 23 && 順序執行多條命令,當碰到執行出錯的命令後將不執行後面的命令 find "ok" c:test.txt && echo 成功 若是找到了"ok"字樣,就顯示"成功",找不到就不顯示 24 || 順序執行多條命令,當碰到執行正確的命令後將不執行後面的命令 find "ok" c:test.txt || echo 不成功 若是找不到"ok"字樣,就顯示"不成功",找到了就不顯示 25 | 管道命令 dir *.* /s/a | find /c ".exe" 管道命令表示先執行 dir 命令,對其輸出的結果執行後面的 find 命令 該命令行結果:輸出當前文件夾及全部子文件夾裏的.exe文件的個數 type c:test.txt|more 這個和 more c:test.txt 的效果是同樣的 26 > 和 >> 輸出重定向命令 > 清除文件中原有的內容後再寫入 >> 追加內容到文件末尾,而不會清除原有的內容 主要將原本顯示在屏幕上的內容輸出到指定文件中 指定文件若是不存在,則自動生成該文件 type c:test.txt >prn 屏幕上不顯示文件內容,轉向輸出到打印機 echo hello world>con 在屏幕上顯示hello world,實際上全部輸出都是默認 >con 的 copy c:test.txt f: >nul 拷貝文件,而且不顯示"文件複製成功"的提示信息,但若是f盤不存在,仍是會顯示出錯信息 copy c:test.txt f: >nul 2>nul 不顯示」文件複製成功」的提示信息,而且f盤不存在的話,也不顯示錯誤提示信息 echo ^^W ^> ^W>c:test.txt 生成的文件內容爲 ^W > W ^ 和 > 是控制命令,要把它們輸出到文件,必須在前面加個 ^ 符號 27 < 從文件中得到輸入信息,而不是從屏幕上 通常用於 date time label 等須要等待輸入的命令 @echo off echo 2005-05-01>temp.txt date <temp.txt del temp.txt 這樣就能夠不等待輸入直接修改當前日期 28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %* 命令行傳遞給批處理的參數 %0 批處理文件自己 %1 第一個參數 %9 第九個參數 %* 從第一個參數開始的全部參數 批參數(%n)的替代已被加強。您可使用如下語法: %~1 - 刪除引號("),擴充 %1 %~f1 - 將 %1 擴充到一個徹底合格的路徑名 %~d1 - 僅將 %1 擴充到一個驅動器號 %~p1 - 僅將 %1 擴充到一個路徑 %~n1 - 僅將 %1 擴充到一個文件名 %~x1 - 僅將 %1 擴充到一個文件擴展名 %~s1 - 擴充的路徑指含有短名 %~a1 - 將 %1 擴充到文件屬性 %~t1 - 將 %1 擴充到文件的日期/時間 %~z1 - 將 %1 擴充到文件的大小 %~$PATH : 1 - 查找列在 PATH 環境變量的目錄,並將 %1 擴充到找到的第一個徹底合格的名稱。若是環境 變量名未被定義,或者沒有找到文件,此組合鍵會 擴充到空字符串 能夠組合修定符來取得多重結果: %~dp1 - 只將 %1 擴展到驅動器號和路徑 %~nx1 - 只將 %1 擴展到文件名和擴展名 %~dp$PATH:1 - 在列在 PATH 環境變量中的目錄裏查找 %1, 並擴展到找到的第一個文件的驅動器號和路徑。 %~ftza1 - 將 %1 擴展到相似 DIR 的輸出行。 能夠參照 call/? 或 for/? 看出每一個參數的含意 echo load "%%1" "%%2">c:test.txt 生成的文件內容爲 load "%1" "%2" 批處理文件裏,用這個格式把命令行參數輸出到文件 29 if 判斷命令 if "%1"=="/a" echo 第一個參數是/a if /i "%1" equ "/a" echo 第一個參數是/a /i 表示不區分大小寫,equ 和 == 是同樣的,其它運算符參見 if/? if exist c:test.bat echo 存在c:test.bat文件 if not exist c:windows ( echo 不存在c:windows文件夾 ) if exist c:test.bat ( echo 存在c:test.bat ) else ( echo 不存在c:test.bat ) 30 setlocal 和 endlocal 設置」命令擴展名」和」延緩環境變量擴充」 SETLOCAL ENABLEEXTENSIONS #啓用"命令擴展名" SETLOCAL DISABLEEXTENSIONS #停用"命令擴展名" SETLOCAL ENABLEDELAYEDEXPANSION #啓用"延緩環境變量擴充" SETLOCAL DISABLEDELAYEDEXPANSION #停用"延緩環境變量擴充" ENDLOCAL #恢復到使用SETLOCAL語句之前的狀態 「命令擴展名」默認爲啓用 「延緩環境變量擴充」默認爲停用 批處理結束系統會自動恢復默認值 能夠修改註冊表以禁用"命令擴展名",詳見 cmd /? 。因此用到"命令擴展名"的程 序,建議在開頭和結尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 語句,以確 保程序能在其它系統上正確運行 "延緩環境變量擴充"主要用於 if 和 for 的符合語句,在 set 的說明裏有其實用例程 31 set 設置變量 引用變量可在變量名先後加 % ,即 %變量名% set #顯示目前全部可用的變量,包括系統變量和自定義的變量 echo %SystemDrive% #顯示系統盤盤符。系統變量能夠直接引用 set p #顯示全部以p開頭的變量,要是一個也沒有就設errorlevel=1 set p=aa1bb1aa2bb2 #設置變量p,並賦值爲 = 後面的字符串,即aa1bb1aa2bb2 echo %p% #顯示變量p表明的字符串,即aa1bb1aa2bb2 echo %p:~6% #顯示變量p中第6個字符之後的全部字符,即aa2bb2 echo %p:~6,3% #顯示第6個字符之後的3個字符,即aa2 echo %p:~0,3% #顯示前3個字符,即aa1 echo %p:~-2% #顯示最後面的2個字符,即b2 echo %p:~0,-2% #顯示除了最後2個字符之外的其它字符,即aa1bb1aa2b echo %p:aa=c% #用c替換變量p中全部的aa,即顯示c1bb1c2bb2 echo %p:aa=% #將變量p中的全部aa字符串置換爲空,即顯示1bb12bb2 echo %p:*bb=c% #第一個bb及其以前的全部字符被替換爲c,即顯示c1aa2bb2 set p=%p:*bb=c% #設置變量p,賦值爲 %p:*bb=c% ,即c1aa2bb2 set /a p=39 #設置p爲數值型變量,值爲39 set /a p=39/10 #支持運算符,有小數時用去尾法,39/10=3.9,去尾得3,p=3 set /a p=p/10 #用 /a 參數時,在 = 後面的變量能夠不加%直接引用 set /a p=」1&0″ #」與」運算,要加引號。其它支持的運算符參見set/? set p= #取消p變量 set /p p=請輸入 屏幕上顯示」請輸入」,並會將輸入的字符串賦值給變量p 注意這條能夠用來取代 choice 命令 注意變量在 if 和 for 的複合語句裏是一次性所有替換的,如 @echo off set p=aaa if %p%==aaa ( echo %p% set p=bbb echo %p% ) 結果將顯示 aaa aaa 由於在讀取 if 語句時已經將全部 %p% 替換爲aaa 這裏的"替換",在 /? 幫助裏就是指"擴充"、"環境變量擴充" 能夠啓用」延緩環境變量擴充」,用 ! 來引用變量,即 !變量名! @echo off SETLOCAL ENABLEDELAYEDEXPANSION set p=aaa if %p%==aaa ( echo %p% set p=bbb echo !p! ) ENDLOCAL 結果將顯示 aaa bbb 還有幾個動態變量,運行 set 看不到 %CD% #表明當前目錄的字符串 %DATE% #當前日期 %TIME% #當前時間 %RANDOM% #隨機整數,介於0~32767 %ERRORLEVEL% #當前 ERRORLEVEL 值 %CMDEXTVERSION% #當前命令處理器擴展名版本號 %CMDCMDLINE% #調用命令處理器的原始命令行 能夠用echo命令查看每一個變量值,如 echo %time% 注意 %time% 精確到毫秒,在批處理須要延時處理時能夠用到 32 start 批處理中調用外部程序的命令,不然等外部程序完成後才繼續執行剩下的指令 33 call 批處理中調用另一個批處理的命令,不然剩下的批處理指令將不會被執行 有時有的應用程序用start調用出錯的,也能夠call調用 34 choice (外部命令) 選擇命令 讓用戶輸入一個字符,從而選擇運行不一樣的命令,返回碼errorlevel爲1234…… win98裏是choice.com win2000pro裏沒有,能夠從win98裏拷過來 win2003裏是choice.exe choice /N /C y /T 5 /D y>nul 延時5秒 35 assoc 和 ftype 文件關聯 assoc 設置'文件擴展名'關聯,關聯到'文件類型' ftype 設置'文件類型'關聯,關聯到'執行程序和參數' 當你雙擊一個.txt文件時,windows並非根據.txt直接判斷用 notepad.exe 打開 而是先判斷.txt屬於 txtfile '文件類型' 再調用 txtfile 關聯的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1 能夠在"文件夾選項"→"文件類型"裏修改這2種關聯 assoc #顯示全部'文件擴展名'關聯 assoc .txt #顯示.txt表明的'文件類型',結果顯示 .txt=txtfile assoc .doc #顯示.doc表明的'文件類型',結果顯示 .doc=Word.Document.8 assoc .exe #顯示.exe表明的'文件類型',結果顯示 .exe=exefile ftype #顯示全部'文件類型'關聯 ftype exefile #顯示exefile類型關聯的命令行,結果顯示 exefile="%1" %* assoc .txt=Word.Document.8 設置.txt爲word類型的文檔,能夠看到.txt文件的圖標都變了 assoc .txt=txtfile 恢復.txt的正確關聯 ftype exefile="%1" %* 恢復 exefile 的正確關聯 若是該關聯已經被破壞,能夠運行 command.com ,再輸入這條命令 36 pushd 和 popd 切換當前目錄 @echo off c: & cd & md mp3 #在 C: 創建 mp3 文件夾 md d:mp4 #在 D: 創建 mp4 文件夾 cd /d d:mp4 #更改當前目錄爲 d:mp4 pushd c:mp3 #保存當前目錄,並切換當前目錄爲 c:mp3 popd #恢復當前目錄爲剛纔保存的 d:mp4 37 for 循環命令 這個比較複雜,請對照 for/? 來看 for %%i in (c: d: e: f:) do echo %%i 依次調用小括號裏的每一個字符串,執行 do 後面的命令 注意%%i,在批處理中 for 語句調用參數用2個% 默認的字符串分隔符是"空格鍵","Tab鍵","回車鍵" for %%i in (*.txt) do find "abc" %%i 對當前目錄裏全部的txt文件執行 find 命令 for /r . %%i in (*.txt) do find "abc" %%i 在當前目錄和子目錄裏全部的.txt文件中搜索包含 abc 字符串的行 for /r . %%i in (.) do echo %%~pni 顯示當前目錄名和全部子目錄名,包括路徑,不包括盤符 for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt 把 d:mp3 及其子目錄裏的mp3文件的文件名都存到 d:mp3.txt 裏去 for /l %%i in (2,1,8) do echo %%i 生成2345678的一串數字,2是數字序列的開頭,8是結尾,1表示每次加1 for /f %%i in ('set') do echo %%i 對 set 命令的輸出結果循環調用,每行一個 for /f "eol=P" %%i in ('set') do echo %%i 取 set 命令的輸出結果,忽略以 P 開頭的那幾行 for /f %%i in (d:mp3.txt) do echo %%i 顯示 d:mp3.txt 裏的每一個文件名,每行一個,不支持帶空格的名稱 for /f "delims=" %%i in (d:mp3.txt) do echo %%i 顯示 d:mp3.txt 裏的每一個文件名,每行一個,支持帶空格的名稱 for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a 對 dir 命令的結果,跳過前面5行,餘下的每行取第4列 每列之間的分隔符爲默認的"空格" 能夠注意到 dir 命令輸出的前5行是沒有文件名的 for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do ( echo %%a echo %%b echo %%c ) 對 date /t 的輸出結果,每行取一、二、3列 第一列對應指定的 %%a ,後面的 %%b 和 %%c 是派生出來的,對應其它列 分隔符指定爲 - 和"空格",注意 delims=- 後面有個"空格" 其中 tokens=1,2,3 若用 tokens=1-3 替換,效果是同樣的 for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b 取第2列給 %%a ,其後的列都給 %%b 38 subst (外部命令) 映射磁盤。 subst z: serverd #這樣輸入z:就能夠訪問serverd了 subst z: /d #取消該映射 subst #顯示目前全部的映時 39 xcopy (外部命令) 文件拷貝 xcopy d:mp3 e:mp3 /s/e/i/y 複製 d:mp3 文件夾、全部子文件夾和文件到 e: ,覆蓋已有文件 加 /i 表示若是 e: 沒有 mp3 文件夾就自動新建一個,不然會有詢問