常用的bat批處理腳本大全(精選)
前言
在windows上編程或者制作一些小工具,少不了使用批處理腳本,而且在各種開發(fā)環(huán)境搭建中我們經(jīng)常會(huì)看到批處理腳本。批處理腳本以cmd命令為基礎(chǔ),增加一些變量和參數(shù)構(gòu)造多命令來完成復(fù)雜的任務(wù)。
1、echo
echo就是跟所有語言相似的輸出打印命令,一般我們會(huì)在前面加上@前綴,表示不會(huì)顯示打印語句。
C:\Users\buejee\Desktop\battutorial>for %i in (1,3,5) do echo %i C:\Users\buejee\Desktop\battutorial>echo 1 1 C:\Users\buejee\Desktop\battutorial>echo 3 3 C:\Users\buejee\Desktop\battutorial>echo 5 5 C:\Users\buejee\Desktop\battutorial>for %i in (1,3,5) do @echo %i 1 3 5
我們也會(huì)調(diào)用@echo off關(guān)閉顯示打印信息,這樣后面的所有echo就不用加@前綴來隱藏命令。
C:\Users\buejee\Desktop\battutorial>type bat_echo.bat echo hello @echo off echo world C:\Users\buejee\Desktop\battutorial>bat_echo.bat C:\Users\buejee\Desktop\battutorial>echo hello hello world
在這個(gè)示例中,第一次沒有設(shè)置@echo off,運(yùn)行腳本,回顯了echo hello,但是當(dāng)運(yùn)行echo world的時(shí)候,它沒有回顯,因?yàn)橐呀?jīng)關(guān)閉了回顯。
echo表示輸出,那么輸入怎么辦?這里要借助一個(gè)小技巧set /p
@echo off echo please input you name: set /p name= echo your name is : %name%
運(yùn)行:
echo還可以結(jié)合>與>>命令向文件中寫入和追加內(nèi)容。
C:\Users\buejee\Desktop\battutorial>echo hello > hello.txt C:\Users\buejee\Desktop\battutorial>echo world >> hello.txt C:\Users\buejee\Desktop\battutorial>type hello.txt hello world C:\Users\buejee\Desktop\battutorial>echo hello,world > hello.txt C:\Users\buejee\Desktop\battutorial>type hello.txt hello,world C:\Users\buejee\Desktop\battutorial>
其實(shí)這個(gè)示例里面隱含了一個(gè)操作,就是如果hello.txt文件不存在就創(chuàng)建,存在就覆蓋或者追加。在linux下,我們新建一個(gè)文件可以使用touch命令,在windows命令行下,創(chuàng)建文件可以使用echo > xxx.txt 就可以了。
值得一提的是,因?yàn)閏md命令行默認(rèn)編碼是ANSI(936),而批處理腳本默認(rèn)編碼是UTF8(65001),所以在bat文件中使用echo輸出中文會(huì)亂碼。解決辦法:要么改變cmd編碼,要么改變腳本編碼為ANSI。
改變腳本編碼,可以在notepad++里面直接使用 "編碼" 菜單項(xiàng):轉(zhuǎn)為 ANSI 編碼 修改,再一個(gè)辦法就是通過記事本打開腳本,然后“另存為”的時(shí)候選擇編碼 ANSI,如下所示:
2、注釋
任何語言都有注釋,批處理腳本語言也不例外,它的注釋,就是使用關(guān)鍵字REM,一般帶上@前綴。
在這個(gè)圖中,可以看到,當(dāng)使用REM關(guān)鍵字的時(shí)候,這一行內(nèi)容就已經(jīng)變?yōu)榫G色高亮,明顯與可以執(zhí)行的語句有區(qū)別。
3、常見cmd命令
windows命令行 | 功能描述 | linux終端 |
cd | 切換工作目錄 | cd |
dir | 列出當(dāng)前文件夾下所有文件 | ls [-lh] |
type | 查看文件內(nèi)容 | cat |
md/mkdir | 創(chuàng)建目錄 | mkdir |
del | 刪除文件 | rm |
rd | 刪除目錄 | rm -r |
copy/xcopy | 拷貝 | cp [-r] |
cls | 清屏 | clear |
findstr | 根據(jù)關(guān)鍵字查找 | grep |
move/rename | 移動(dòng)/重命名 | mv/rename |
tasklist | 查找進(jìn)程 | ps [-ef] |
taskkill | 殺死進(jìn)程 | kill [-9] |
4、參數(shù)與變量
在執(zhí)行腳本的時(shí)候,我們可以在腳本后面跟上一些參數(shù),這些參數(shù)我們在腳本中通過%1、%2、%3、%4依此類推類獲取。
@echo off @echo first param is %1 @echo second param is %2 @echo third param is %3 @echo fourth param is %4
運(yùn)行腳本,打印如下:
C:\Users\buejee\Desktop\battutorial>bat_params.bat hello world 3 4
first param is hello
second param is world
third param is 3
fourth param is 4
bat腳本參數(shù)只能表示%1~%9,也就是最多可以表示出9個(gè)參數(shù)。
從這個(gè)腳本顯示的樣子可以看出,當(dāng)表示%10的時(shí)候,其實(shí)已經(jīng)無法表示了,只是表示%1后面拼接了一個(gè)0,所以第十個(gè)參數(shù)是10,第十一個(gè)參數(shù)是11,第十二個(gè)參數(shù)是12。
C:\Users\buejee\Desktop\battutorial>bat_params.bat 1 2 3 4 5 6 7 8 9 9 9 9
first param is 1
second param is 2
third param is 3
fourth param is 4
fifth param is 5
sixth param is 6
seventh param is 7
eighth param is 8
ninth param is 9
tenth param is 10
eleventh param is 11
twelfth param is 12
解決辦法就是需要將前面的參數(shù)彈出。使用shift /1
代碼:
@echo off @echo first param is %1 @echo second param is %2 @echo third param is %3 @echo fourth param is %4 @echo fifth param is %5 @echo sixth param is %6 @echo seventh param is %7 @echo eighth param is %8 @echo ninth param is %9 shift /1 @echo tenth param is %9 shift /1 @echo eleventh param is %9 shift /1 @echo twelfth param is %9
運(yùn)行結(jié)果:
C:\Users\buejee\Desktop\battutorial>bat_params.bat 1 2 3 4 5 6 7 8 9 100 101 199
first param is 1
second param is 2
third param is 3
fourth param is 4
fifth param is 5
sixth param is 6
seventh param is 7
eighth param is 8
ninth param is 9
tenth param is 100
eleventh param is 101
twelfth param is 199
變量賦值與取值:
變量賦值語句使用“=”,且“=”兩邊沒有空格。 取值的時(shí)候使用%%包裹,這個(gè)跟我們在命令行下打印系統(tǒng)環(huán)境變量的值一樣:echo %JAVA_HOME%
在bat腳本中,for循環(huán)的變量,我們需要使用兩個(gè)%%來表示,在cmd命令行下,可以使用一個(gè)%表示:
bat_variable_in_forloop.bat
@echo off for %%i in (1,2,3,5) do ( @echo %%i )
運(yùn)行:
以上這些都是自定義變量,還有一些系統(tǒng)內(nèi)置的變量,可以方便我們在腳本中使用:
- %cd% 當(dāng)前目錄
- %os% 操作系統(tǒng)名稱
- %date% 系統(tǒng)日期
- %time% 系統(tǒng)時(shí)間
- %username% 當(dāng)前用戶名
在操作腳本的時(shí)候,想要得到腳本相關(guān)的參數(shù):比如腳本屬性、所在盤符、全路徑名、文件名、 路徑、縮寫路徑、文件最后修改時(shí)間、擴(kuò)展名、文件大小、帶盤符路徑。就需要用到如下的變量:%~(a|d|f|n|p|s|t|x|z|dp)0。示例如下:
bat_builtin_variable.bat
@echo off @REM attribute @echo attr : %~a0 @REM drive name @echo drive : %~d0 @REM filename @echo filename : %~f0 @REM name @echo name : %~n0 @REM path @echo path : %~p0 @REM short name @echo shortname : %~s0 @REM time(modify) @echo time : %~t0 @REM extension name @echo extensionname : %~x0 @REM size @echo size : %~z0 @REM drive name + path @echo dp : %~dp0
運(yùn)行結(jié)果如下:
從中可以看出,name沒有擴(kuò)展名后綴.bat,path沒有盤符c:,所以一般使用%~dp0來表示腳本路徑。 縮寫這里,如果一個(gè)文件夾名稱不超過6個(gè)字符,則使用原樣名稱,只有文件名稱超過6個(gè)字符,才使用縮寫,而且縮寫的名稱會(huì)變大寫。
5、for循環(huán)
for循環(huán)的語法是:
for [/d/l/r/f] %%i in () do ( )
這里可以根據(jù)場景選擇不同的參數(shù):
/d 表示獲取某一目錄下的所有文件夾
@echo off for /d %%i in (%cd%\*) do ( @echo %%i )
運(yùn)行結(jié)果:
/l 可以使用一個(gè)序列來做循環(huán),比如 (1,2,10)表示從1開始,10結(jié)束,步長為2,產(chǎn)生的序列為:(1,3,5,7,9)。(5,-1,1),表示從5開始,1結(jié)束,步長為-1,也就是遞減數(shù)列(5,4,3,2,1)。
@echo off for /l %%i in (1 2 10) do ( echo %%i )
運(yùn)行結(jié)果:
/r 可以獲取某一個(gè)目錄下所有的文件以及文件夾下的文件
@echo off for /r %%i in (*.txt) do ( @echo %%i )
該腳本的意思是讀取當(dāng)前文件夾以及子文件夾下的所有.txt擴(kuò)展名的文件。與/d遍歷當(dāng)前文件夾下的文件夾不同, 它不止遍歷當(dāng)前文件夾,還遍歷子文件夾。
運(yùn)行結(jié)果:
/f 讀取文件
@echo off for /f %%a in (user.txt) do ( echo %%a )
運(yùn)行結(jié)果:
我們準(zhǔn)備的文件,user.txt里面是id,name,age三列按空格分割的五行數(shù)據(jù),最后只讀到了id這一列,因?yàn)?f默認(rèn)是按照空格分隔來讀取每一行第一列內(nèi)容。
可以增加一個(gè)"delims="的參數(shù),表示不分割讀取每一行。
@echo off for /f "delims=" %%a in (user.txt) do ( echo %%a )
運(yùn)行結(jié)果:
還可以分割,并取分割之后的某幾列,增加tokens參數(shù):比如"tokens=1-3 delims= "表示按照空格分隔,取1到3列,也就是所有列,但是每一列在取的時(shí)候,需要按照%%a,%%b,%%c依次類推來取值。
@echo off for /f "tokens=1-3 delims= " %%a in (user.txt) do ( echo %%a - %%b - %%c )
運(yùn)行結(jié)果:
/f 這里不僅可以讀取文件,還可以用來讀取系統(tǒng)命令執(zhí)行的結(jié)果。
@echo off for /f "usebackq tokens=1-5 delims= " %%a in (`netstat -aon^| findstr 135`) do ( @echo %%a - %%b - %%c - %%d - %%e )
這段腳本讀取netstat -aon | findstr 135的結(jié)果,并按照空格分隔,取1-5列。
運(yùn)行結(jié)果:
6、函數(shù)
bat腳本里面的函數(shù)定義:采用冒號開頭,然后定義函數(shù)名。在調(diào)用的時(shí)候,使用關(guān)鍵字call,同樣的要跟上冒號:函數(shù)名。
bat腳本有個(gè)特點(diǎn),它雖然可以定義函數(shù),因?yàn)槟_本串行執(zhí)行的特點(diǎn),如果沒有跳轉(zhuǎn)指令控制的話,函數(shù)定義也會(huì)被當(dāng)作指令執(zhí)行,雖然函數(shù)沒有被調(diào)用。
如下所示的代碼,我們定義了hello、world兩個(gè)函數(shù),我們只調(diào)用了world函數(shù),但是最后運(yùn)行結(jié)果很詭異:
@echo off call :world :hello @echo hello goto :eof :world @echo world goto :eof
運(yùn)行結(jié)果:
C:\Users\buejee\Desktop\battutorial>bat_func_test.bat
world
hello
要想讓上面的代碼執(zhí)行正確,我們需要在call :world函數(shù)之后增加 goto :eof的跳轉(zhuǎn)控制:
call除了可以調(diào)用函數(shù)之外,還可以調(diào)用其他腳本。
7、數(shù)組
和其他語言一樣,數(shù)組在bat腳本中,可以直接通過set 命令設(shè)置,如下所示:
@echo off set arr=1,3,5,7,9 for %%a in (%arr%) do ( @echo %%a )
運(yùn)行結(jié)果:
這種方式定義的數(shù)組,卻無法通過下標(biāo)訪問,它雖然可以通過for循環(huán)遍歷并得到數(shù)組中的所有元素,但是卻不能稱為普通意義上的數(shù)組。這種一次性聲明的數(shù)組,只能是一個(gè)類數(shù)組。
在批處理腳本中,可以通過下標(biāo)訪問的數(shù)組,需要這樣來定義:
@echo off setlocal enabledelayedexpansion set a[0]=1 set a[1]=3 set a[2]=5 set a[3]=7 set a[4]=9 set a[5]=11 for /l %%n in (0,1,5) do ( @echo !a[%%n]! )
運(yùn)行結(jié)果:
這種數(shù)組,雖然可以通過下標(biāo)訪問,但是無法知道它的長度,在進(jìn)行遍歷的時(shí)候,我們不得不寫死范圍。可以通過如下的方式計(jì)算數(shù)組長度:
@echo off set Arr[0]=1 set Arr[1]=2 set Arr[2]=3 set Arr[3]=4 set Arr[4]=5 set "x=0" :loop if defined Arr[%x%] ( set /a "x+=1" goto loop ) echo the length is %x%
運(yùn)行結(jié)果:
=======================================================
批處理腳本與cmd命令行密切相關(guān),所有在腳本中能夠執(zhí)行的操作,基本都可以在命令行下執(zhí)行,但是有時(shí)候,命令行與腳本也有少許差別,比如在命令行下的for循環(huán)中,變量可以直接使用一個(gè)%來表示,但是腳本中必須使用兩個(gè)%%來表示。
總結(jié)
到此這篇關(guān)于常用的bat批處理腳本大全的文章就介紹到這了,更多相關(guān)bat批處理腳本大全內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
防arp欺騙的批處理 自動(dòng)綁定網(wǎng)關(guān)的批處理
防arp欺騙的批處理 自動(dòng)綁定網(wǎng)關(guān)的批處理,需要的朋友可以參考下。2011-01-01教你三招讓電腦“自廢武功”的不錯(cuò)設(shè)置方法
教你三招讓電腦“自廢武功”的不錯(cuò)設(shè)置方法...2007-05-05下載站運(yùn)行廣告合作exe文件然后再運(yùn)行程序文件的bat
有時(shí)候下載內(nèi)容需要接一些靜默安裝額文件,其實(shí)這個(gè)代碼就是從別的下載站扒來的2013-04-04