windows腳本-CMD和Batch

1、DOS,CMD和batch

      DOS是磁盤操做系統(英文:Disk Operating System)的縮寫,是我的計算機上的一類操做系統。從1981年直到1995年的15年間,DOS在IBM PC兼容機市場中佔有舉足輕重的地位【1】。html

      batch是DOS系統下的腳本,這些腳本是純文本文檔,以.bat爲結尾,能夠用任何文本編輯器來進行編輯。它的特色是文件的每一行都是看成命令來運行。java

      CMD是用來運行batch的程序,在windows上是一個32位的命令行程序,基於windows操做系統的命令解釋程序。面試

2、CMD的經常使用命令和batch的經常使用示例

     雖然今天的操做系統已經發展的很好了,可是基於DOS的CMD仍是有很大的用途的如在安裝java後驗證版本,運行java程序,註冊表從新註冊,設定時間日期,初始化網絡鏈接等。要對CMD進行學習,先了解幾個經常使用的CMD的命令,在windows下面試試效果。express

(1)幫助命令 /?

這個比較經常使用單獨說明,遇到不懂的看幫助文檔就能夠。windows

命令是:命令+/? 如cd /?會跳出以下界面瀏覽器

image

(2)其它命令

netstat -a:查看全部的端口網絡

tasklist:查看全部的進程編輯器

dir(directory):列出當前目錄下的文件以及文件夾學習

md (make directory):建立目錄測試

rd (remove directory): 刪除目錄(帶內容的文件或者文件夾不能直接刪除,必須先刪除裏面,再刪除外面)。若是要刪除非空目錄,可使用命令

rd /s xxxdir或者rd /s /q xxxdir

cd (change directory) :改變指定目錄(進入指定目錄)

cd..:退回到上一級目錄

cd\:退回到根目錄

del (delete): 刪除文件,刪除一堆後綴名同樣的文件*.txt

exit:    退出dos命令行

cls :   (clear screen)清屏

(3)batch文件

batch文件就是一些CMD的命令組合

1. 同時運行多個程序

打開電腦時須要同時運行多個程序,好比打開QQ,瀏覽器,等

@echo off
echo Starting QQ...
::路徑改爲本身相應的
start "" "D:\Program Files\QQ\qq.exe"
echo Starting matlab...
start "" "D:\Program Files\MATLAB\R2013a\bing\matlab.exe"
echo Starting Google Talk...
start "" "D:\Program Files\Gtalk\googletalk.exe"

2.批量重命名文件

現有一堆照片,命名格式爲0001.jpg,0002.jpg,0003.jpg,…,00020.jpg,……要求在全部文件名前加上A_

@echo off 
rem 啓用"延緩環境變量擴充" 
setlocal EnableDelayedExpansion set a=1 
rem 循環當前目錄下全部圖片的文件名,支持帶空格的名稱 
for /f "delims=" %%i in ('dir /b *.jpg') do ( 
rem 若是沒有相同的文件名,則繼續 
if not "%%~ni"=="%~n0" ( 
if !a! LSS 10 (ren "%%i" "A_000!a!.jpg") else ren "%%i" "A_!a!.jpg" 
rem 設置數值型變量a=a+1 
set /a a+=1 
) 
) 
echo 批量重命名完成! pause

3、batch中經常使用的一些符號和命令

batch的命令不少可是經常使用的沒多少,因此本文首先介紹batch文件中常見的一些符合和命令,而後介紹bat文件的程序流程控制

1. 經常使用的一些符合和命令

1.1 @:表示不顯示@後面的命令。經常使用的命令有@echo off,其中echo off表示能夠關閉掉整個批處理命令的回顯,但不能關掉ECHO OFF這個命令,如今咱們在ECHO OFF這個命令前加個@,就能夠關掉ECHO OFF這個命令。

這條語句的用處是能讓咱們更加清楚看到命令的結果,好比在cmd上顯示1-5,下面分別展現有@echo off和沒有的區別

@echo off

echo %1
::Show 1 to 5
for /l %%i in (1,1,5) do (
    set a=%%i echo !a! )

pause

image

沒有@echo off

image

1.2 %
百分號用在不一樣的場合,有不一樣的含義:

① 當百分號成對出現,而且其間包含非特殊字符時,通常作變量引用處理,好比:%var%、%str%。這樣引用的目的是,若是不添加%那麼解釋器就把這個原本是變量的值當成了字符了。

把如下代碼保存爲批處理文件,運行後觀察屏幕顯示結果:
   

@echo off
set str=abd echo var str's value :str
echo var str's value :%str% pause


在屏幕上將顯示這樣的結果:

image 
   另外,百分號做爲變量引用還有一種特殊形式,那就是對形式參數的引用,此時,單個百分號後面緊跟0~9這10個數字,如%0、%1,其中,%0爲腳本自己的名稱,%1至%9爲第二至九個參數...最多支持%0~%9,%10之後就是變量引用了,即%15爲%1的值接上5。
請看演示代碼:

@echo off 
    if defined str goto next set str= 
    set /p str=請把文件拉到本窗口後回車: call "%~0" %str% pause 
    exit 
    :next 
    cls 
    echo 本批處理文件完整路徑爲:"%~0" 
    echo 拖到本窗口的文件完整路徑爲:"%~1" 
    goto :eof

1.3 :、::
① :以:打頭的單個的:表示該行是一個標籤,它以後的內容是一個標籤段,如:test,則表示:test之下的內容是標籤段,而test是這個標籤段的名,能夠用 goto test 、goto :test 跳轉到該標籤段或用 call :test 調用該子過程;

②:: 而連續兩個冒號打頭表示該行內容爲註釋內容,實際上,:: 是個無效的標籤名,:加上空格一樣能夠起到註釋的做用,此時,::的功能和註釋命令rem相同;可是,rem 註釋語句中的某些命令符號如重定向符號和管道符號仍是會執行,而若是用::來註釋的時候,與::同處一行的全部命令或符號直接被命令解釋器忽略掉,無形中提升了註釋的兼容性和整個程序的執行效率,而且在衆多的命令語句中更顯得醒目,因此,註釋語句推薦使用::的格式。

1.4 ~
① 用在 set /a 語句中時,它是一元運算符號,表示將操做數字按位取反,例如,set /a num=~1的執行結果是-2,set /a num=~0的結果是-1
② 用在for語句中,表示加強for的功能,可以提取到更多的信息。例如:在批處理文件的for語句中:%%~i表示去掉第一對外側引號,%%~zi表示獲取文件的大小(以字節爲單位),%%~ni表示獲取文件名,%%~xi表示獲取擴展名(帶點號)……它們能夠組合使用,如%%~nxi表示獲取文件名和後綴名。

1.五、>、>>
通常而言,>表示用新內容覆蓋原文件內容,>>表示向原文件追加內容,此時,它們以重定向符號的身份出現;

1.六、|
通常而言,它以管道符號的身份出現,表示把在它以前的命令或語句的執行結果做爲在它以後的命令或語句的處理對象,簡而言之,就是把它以前的輸出做爲它以後的輸入,例如:echo abcd|findstr "b",表示把echo abcd的執行結果,做爲findstr "b" 的執行對象,也就是在字符串abcd中查找b字符;若是test.txt中有abcd字符串,則該語句與 findstr "b" test.txt 具備一樣的效果;

1.七、^
通常而言,^以轉義字符的身份出現。由於在 cmd環境中,有些字符具有特殊功能,如>、>>表示重定向,|表示管道,&、&&、||表示語句鏈接……它們都有特定的功能,若是須要把它們做爲字符輸出的話,echo >、echo | ……之類的寫法就會出錯——cmd解釋器會把它們做爲具備特殊功能的字符對待,而不會做爲普通字符處理,這個時候,就須要對這些特殊字符作轉義處理:在每一個特殊字符前加上轉義字符^,所以,要輸出這些特殊字符,就須要用 echo ^>、echo ^|、echo ^|^|、echo ^^……之類的格式來處理;

1.八、&
通常而言,&表示兩條命令或語句同時執行的意思。如 echo a&echo b,將在屏幕上同時顯示a和b字符。當幾條語句含義近似或做用相同且沒有前後的順序之別時,啓用&符號鏈接這些語句將會增長程序的可讀性;

1.九、&&、||
這是一對含義截然相反的命令符,&&表示若是它以前的語句成功執行,將執行它以後的語句,而||則表示若是它以前的語句執行失敗,將執行它以後的語句;在某些場合,它們能替代 if……else…… 語句;例如: 
 

@echo off 
    md test&&echo 成功建立文件夾test||echo 建立文件夾test失敗 pause


效果等同於以下代碼:

@echo off 
    md test if "%errorlevel%"=="0" (echo 成功建立文件夾test) else echo 建立文件夾test失敗 pause

 

1.十、+、-、*、/
在 set /a 語句中,這些符號的含義分別爲:加、減、乘、除。例如:set /a num=1+2-3*4/5。須要注意的是,這些運算符號遵循數學運算中的優先級順序:先乘除後加減,有括號的先算括號,而且,直接忽略小數點,所以,剛纔那個算式的結果是1而不是0或0.6。
另外,有可能會在代碼中看到這樣的寫法:set /a num+=一、set /a num-=一、set /a num*=1 和 set /a num/=1,這些表示累加、累減、累乘、累除,步長都是1,展開後的完整寫法爲:set /a num=num+一、set /a num=num-一、set /a num=num*1 和 set /a num=num/1(set /a 語句中,變量引用能夠忽略百分號對或感嘆號對,set /a num=%num%+1 與 set /a num=num+1 等同)

2、batch的流程控制

2.1 if命令


   IF 條件判斷語句,語法格式以下:
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

(1) IF [NOT] ERRORLEVEL number command
IF ERRORLEVEL這個句子必須放在某一個命令的後面,執行命令後由IF ERRORLEVEL 來判斷命令的返回值。Number的數字取值範圍0~255,判斷時值的排列順序應該由大到小。返回的值大於等於指定的值時,條件成立。

例:

@echo off
dir c: rem退出代碼爲>=1就跳至標題1處執行,>=0就跳至標題0處執行 IF ERRORLEVEL 1 goto 1
IF ERRORLEVEL 0 goto 0
Rem 上面的兩行不可交換位置,不然失敗了也顯示成功。
:0
echo 命令執行成功! Rem 程序執行完畢跳至標題exit處退出
goto exit :1
echo 命令執行失敗! Rem 程序執行完畢跳至標題exit處退出
goto exit
:exit
pause


運行顯示:命令執行成功!
(2) IF [NOT] string1==string2 command
string1和string2都爲字符的數據,英文內字符的大小寫將看做不一樣,這個條件中的等於號必須是兩個(絕對相等的意思)
條件相等後即執行後面的command
檢測當前變量的值作出判斷,爲了防止字符串中含有空格,可用如下格式
if [NOT] {string1}=={string2} command
if [NOT] [string1]==[string2] command
if [NOT] "string1"=="string2" command
這種寫法實際上將括號或引號當成字符串的一部分了,只要等號左右兩邊一致就好了,好比下面的寫法就不行:
if {string1}==[string2] command
(3) IF [NOT] EXIST filename command
EXIST filename爲文件或目錄存在的意思

echo off
IF EXIST autoexec.bat echo 文件存在! IF not EXIST autoexec.bat echo 文件不存在!

2.2 for 命令

1. 基本格式
FOR %%variable IN (set) DO command [command-parameters]
  %%variable  指定一個單一字母表示可替換的參數。
  (set)            指定一個或一組文件。可使用通配符。
  command     指定對每一個文件執行的命令。
  command-parameters
                   爲特定命令指定參數或命令行開關。
參數:FOR有4個參數 /d   /l   /r   /f   下面用例子解釋

2. 參數 /d
FOR /D %%variable IN (set) DO command [command-parameters]
    若是集中包含通配符,則指定與目錄名匹配,而不與文件
    名匹配。
若是 Set (也就是我上面寫的 "相關文件或命令") 包含通配符(* 和 ?),將對與 Set 相匹配的每一個目錄(而不是指定目錄中的文件組)執行指定的 Command。
這個參數主要用於目錄搜索,不會搜索文件,看這樣的例子

@echo off
for /d %%i in (c:\*) do echo %%i pause


運行會把C盤根目錄下的所有目錄名字打印出來,而文件名字一個也不顯示!
在來一個,好比咱們要把當前路徑下文件夾的名字只有1-3個字母的打出來

@echo off
for /d %%i in (???) do echo %%i pause


這樣的話若是你當前目錄下有目錄名字只有1-3個字母的,就會顯示出來,沒有就不顯示了
這裏解釋下*號和?號的做用,*號表示任意N個字符,而?號只表示任意一個字符
知道做用了,給你們個思考題目!

@echo off
for /d %%i in (window?) do echo %%i pause


保存到C盤下執行,會顯示什麼呢?本身看吧! 顯示:windows
/D參數只能顯示當前目錄下的目錄名字。


3. 參數 /R
FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
    檢查以 [drive:]path 爲根的目錄樹,指向每一個目錄中的
    FOR 語句。若是在 /R 後沒有指定目錄,則使用當前
目錄。若是集僅爲一個單點(.)字符,則枚舉該目錄樹。
遞歸
上面咱們知道,/D只能顯示當前路徑下的目錄名字,那麼如今這個/R也是和目錄有關,他能幹嗎呢?放心他比/D強大多了!
他能夠把當前或者你指定路徑下的文件名字所有讀取,注意是文件名字,有什麼用看例子!
請注意2點:
    一、set中的文件名若是含有通配符(?或*),則列舉/R參數指定的目錄及其下面的所用子目錄中與set相符合的全部文件,無相符文件的目錄則不列舉。
    二、相反,若是set中爲具體文件名,不含通配符,則枚舉該目錄樹(即列舉該目錄及其下面的全部子目錄),而無論set中的指定文件是否存在。這與前面所說的單點(.)枚舉目錄樹是一個道理,單點表明當前目錄,也可視爲一個文件。
例:

@echo off
for /r c:\ %%i in (*.exe) do echo %%i pause


我們把這個BAT保存到D盤隨便哪裏而後執行,我會就會看到,他把C盤根目錄,和每一個目錄的子目錄下面所有的EXE文件都列出來了

例:

@echo off
for /r %%i in (*.exe) do @echo %%i pause


參數不同了吧!這個命令前面沒加那個C:\也就是搜索路徑,這樣他就會以當前目錄爲搜索路徑,好比你這個BAT你把他放在d:\test目錄下執行,那麼他就會把D:\test目錄和他下面的子目錄的所有EXE文件列出來!!!
例:

@echo off
for /r c:\ %%i in (boot.ini) do echo %%i pause


運行本例發現枚舉了c盤全部目錄,爲了只列舉boot.ini存在的目錄,可改爲下面這樣:

@echo off
for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i pause


4. 參數 /L
FOR /L %%variable IN (start,step,end) DO command [command-parameters]
    該集表示以增量形式從開始到結束的一個數字序列。
    所以,(1,1,5) 將產生序列 1 2 3 4 5,(5,-1,1) 將產生
    序列 (5 4 3 2 1)。
使用迭代變量設置起始值 (Start#),而後逐步執行一組範圍的值,直到該值超過所設置的終止值 (End#)。/L 將經過對 Start# 與 End# 進行比較來執行迭代變量。若是 Start# 小於 End#,就會執行該命令。若是迭代變量超過 End#,則命令解釋程序退出此循環。還可使用負的 Step# 以遞減數值的方式逐步執行此範圍內的值。例如,(1,1,5) 生成序列 1 2 3 4 5,而 (5,-1,1) 則生成序列 (5 4 3 2 1)。語法是:

@echo off
for /l %%i in (1,1,5) do @echo %%i pause

保存執行看效果,他會打印從1 2 3 4 5  這樣5個數字

更加詳細的信息參考文獻【3】,這裏只對流程控制有個基本的瞭解就能夠了。

3、設置變量等

3.1 set

1. 設置自定義變量

代碼以下:

@echo off
set var=我是值 echo %var% pause

2. 設置自定義變量,並接受用戶輸入做爲值

代碼以下:

@echo off
@echo off
set /p var=請輸入變量的值: if %var% == 1 echo 您輸入了 1 ~_~ pause

3. SET /A expression
set的/A參數就是讓SET能夠支持數學符號進行加減等一些數學運算! 支持的數學運算包含(優先權遞減):

() - 分組
! ~ - - 一元運算符
* / % - 算數運算符
+ - - 算數運算符
<< >> - 邏輯移位
& - 按位「與」
^ - 按位「異」
| - 按位「或」
= *= /= %= += -= - 賦值
&= ^= |= <<= >>=
, - 表達式分隔符

Batch代碼

代碼以下:

set /a var=2 - 1 結果是多少呢?若是你看不到結果就echo %var%.....
set /a var=2 * 2 乘法運算 set /a var=2 / 2 除法運算 set /a var=(1+1) + (1+1) 結果等於4 看得懂吧! set /a a=1+1,b=2+1,c=3+1 運行後會顯示一個4,但咱們用 echo %a% %b% %c%後看結果,會發現其餘數學運算也有效果!,這就是"鬥"號的做用!

有時候咱們須要直接在原變量進行加減操做就能夠用這種語法
set /a var+=1 這樣的語法對應原始語法就是set /a var = %var% + 1
都是同樣的結果。
對於"邏輯或取餘操做符",須要把他們用雙引號引發來,看例子
Batch代碼

代碼以下:

set /a var= 1 "&" 1 這樣結果就顯示出來了,其餘邏輯或取餘操做符用法 set /a var= 1 "+" 1 異運算 set /a var= 1 "%" 1 取模運算 set /a var= 2 "<<" 2 次方運算 set /a var= 4 ">>" 2 這個不太記得數學裏的叫法....

 

4. 替換變量值的內容
語法:set newVar="oldVar:str1=str2%
將變量oldVar的值中的str1替換成str2,並將替換後的變量值賦給newVar.
看例子

代碼以下:

@echo off
set a=bbs.verybat.cn echo 替換前的值: "%a%"
set var=%a:bbs=sss% echo 替換後的值: "%var%"
pause

對比一下,咱們發現他把變量%a%的bbs給替換掉了,換成了sss.
5.字符串截取
一、%Var:~start,len%
注意:從0開始。
例如:

代碼以下:

@echo off
set a=www.jb51.net
set var=%a:~1,2%
echo %var%
pause

輸出結果是:ww

二、%Var:~-len%
截取倒數len位
三、%Var:~0,-len%
截取從第一位開始,倒數第len位結束的值。
例子

代碼以下:

@echo off
set a=www.jb51.net
set var=%a:~0,-3% echo %var% pause

 

4、例子

下面是本身寫的例子,對batch有了瞭解以後,就實現一個小任務。

學校裏能夠經過代理來共享網絡,只要某臺電腦聯網並開啓了CCPROXY,那麼只要知道這一臺電腦的IP地址,那麼就可以實現免費上網。

這個任務包含兩個方面

1.須要知道局域網中哪臺電腦連入了了。

這個能夠經過ping這條命令來實現。根據計算機網絡知識知道,學校裏的局域網的地址範圍是172.16.0.0.-172.31.255.255.

那麼寫個bat文件遍歷全部IP地址,把那些可以ping通的保存下來就能夠了。

2.如何測試ping通的電腦開啓了ccproxy。

能夠經過proxifier這個軟件來測試,可是存在問題是測試比較麻煩,須要配置和check。暫時還沒能寫個腳本。

先解決第一個問題

@echo off
setlocal enabledelayedexpansion for /l %%a in (16,1,31) do (
   for /l %%b in (0,1,255) do (
      for /l %%c in (0,1,255) do ( ping 172.%%a.%%b.%%c -n 2 -w 100
           if not !errorlevel!==0 (
           :: >>"test_block.txt" echo IP:172.%%a.%%b.%%c cannot ping )
           if not !errorlevel!==1 (
               >>"test_passing.txt" echo IP:172.%%a.%%b.%%c  can ping )
           )
       )
)
echo test finished ! pause

程序比較簡單,3層循環,按照IP地址範圍測試,測試成功到保存的test_passing.txt文件中。雖然設置了回顯請求數位2,而且等待超時時間爲100ms,可是仍是運行好久,能夠進一步減小IP地址範圍,如一個實驗室內。

 

 

參考文獻

【1】:http://zh.wikipedia.org/wiki/DOS

【2】:http://www.jb51.net/list/list_106_1.htm

【3】:http://www.cnblogs.com/glaivelee/archive/2009/10/07/1578737.html

相關文章
相關標籤/搜索