bat批處理腳本語言(一)


批處理(Batch)通常被認為是一種簡化的腳本語言,擴展名是.bat或者.cmd,應用於DOS和Windows系統中,由其系統內嵌的解釋器解釋運行,類似於Unix中的Shell腳本。

 

批處理定義:顧名思義,批處理文件是將一系列命令按一定的順序集合為一個可執行的文本文件,改其擴展名為BAT或者CMD。這些命令被統稱批處理命令

一、基礎語法:

    1.批處理文件是一個“.bat”結尾的文本文件,這個文件的每一行都是一條DOS命令。可以使用任何文本文件編輯工具創建和修改。

    2.批處理是一種簡單的程序,可以用 if 和 goto 來控制流程,也可以使用 for 循環。

    3.批處理的編程能力遠不如C語言等編程語言,也十分不規范。

    4.每個編寫好的批處理文件都相當於一個DOS的外部命令,把它所在的目錄放到DOS搜索路徑(path)中,即可在任意位置運行。

    5.C:\AUTOEXEC.BAT 是每次系統啟動時都會自動運行的,可以將每次啟動時都要運行的命令放入該文件中。

    6.大小寫不敏感(命令符忽略大小寫)

    7.批處理的文件擴展名為 .bat 或 .cmd。

    8.在命令提示下鍵入批處理文件的名稱,或者雙擊該批處理文件,系統就會調用Cmd.exe來運行該文件。

二、參數

 

 (1)系統參數

  %SystemRoot% === C:\WINDOWS (%windir% 同樣)

  %ProgramFiles% === C:\Program Files %USERPROFILE% === C:\Documents and Settings\Administrator (子目錄有“桌面”,“開始菜單”,“收藏夾”等)

  %APPDATA% === C:\Documents and Settings\Administrator\Application Data

  %TEMP% === C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp (%TEM% 同樣)

  %APPDATA% === C:\Documents and Settings\Administrator\Application Data

  %OS% === Windows_NT (系統)

  %Path% === %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem (原本的設置)

  %HOMEDRIVE% === C: (系統盤) %HOMEPATH% === \Documents and Settings\Administrator

  :: 枚舉當前的環境變量 setlocal enabledelayedexpansion

  FOR /F "usebackq delims==" %%i IN (`set`) DO @echo %%i !%%i!

 

(2)傳參

 %[1-9]表示參數,參數是指在運行批處理文件時在文件名后加的以空格(或者Tab)分隔的字符串。

 變量可以從%0到%9,%0表示批處理命令本身,其它參數字符串用 %1 到 %9 順序表示。

Sample:

  call test2.bat "hello" "haha" (執行同目錄下的“test2.bat”文件,並輸入兩個參數)

  在“test2.bat”文件里寫:

  echo %1 (打印: "hello")

  echo %2 (打印: "haha")

  echo %0 (打印: test2.bat)

  echo %19 (打印: "hello"9)

三、批處理命令

 

1、pause 命令

  會暫停批處理的執行並在屏幕上顯示Press any key to continue...的提示,等待用戶按任意鍵后繼續

Sample:  

@echo off  

:begin  

copy a:*.* d:\back  

echo Please put a new disk into driver A  

pause  

goto begin

在這個例子中,驅動器 A 中磁盤上的所有文件均復制到d:\back中。顯示的信息提示您將另一張磁盤放入驅動器 A 時,pause 命令會使程序掛起,以便您更換磁盤,然后按任意鍵再次復制。

2、Echo 命令

語法: echo [{on|off}] [message]

ECHO [ON | OFF]   打開回顯或關閉回顯功能。

ECHO              顯示當前回顯設置。

ECHO [message]    顯示信息。

echo off 表示在此語句后所有運行的命令都不顯示命令行本身;默認是on,on時會顯示如: C:\文件夾路徑>命令行。

在實際應用中我們會把這條命令和重定向符號( 也稱為管道符號,一般用 > >> ^ )結合來實現輸入一些命令到特定格式的文件中。

Sample: echo off

Sample: echo hello world  (顯示出“hello world”)

Sample: echo Windows Registry Editor Version 5.00 > c:\setupreg.reg (此前還沒有 setupreg.reg 這個文件)

Sample: echo "SourcePath"="D:\\Win2003\\" >> c:\setupreg.reg   (追加內容進 setupreg.reg 這個文件)

 

3、@ 命令

  表示不顯示@后面的命令,(在入侵過程中自然不能讓對方看到你使用的命令啦)

  @ 與 echo off 相象,但它是加在每個命令行的最前面,表示運行時不顯示這一行的命令行(只能影響當前行)。

  Sample: @echo off  (此語句常用於開頭,表示不顯示所有的命令行信息,包括此句)

  Sample: @echo please wait a minite...

  Sample: @format X: /q/u/autoset

  (format 這個命令是不可以使用/y這個參數的,可喜的是微軟留了個autoset這個參數給我們,效果和/y是一樣的。)

 

4.Goto 命令

  語法:goto label (label是參數,指定所要轉向的批處理程序中的行。)

  指定跳轉到標簽行,找到標簽行后,程序將處理從下一行開始的命令。

  label標簽的名字可以隨便起,但是最好是有意義的,字母前必須加個冒號“:”來表示這個字母是標簽。

  goto命令就是根據這個冒號來尋找下一步跳到到那里。經常與 if 配合使用,根據不同的條件來執行不同的命令組。

  例題見“5.Pause 命令”

 

5.Rem 命令

  語法:Rem Message...

  (小技巧:用::代替rem)

  注釋命令,在C語言中相當與/*...*/,它並不會被執行,只是起一個注釋的作用,便於別人閱讀和自己日后修改。

  Sample:@Rem Here is the description.

 

6.Pause 命令

  會暫停批處理的執行並在屏幕上顯示Press any key to continue...的提示,等待用戶按任意鍵后繼續

復制代碼

  Sample:

   @echo off

   :begin

   copy a:*.* d:\back

   echo Please put a new disk into driver A

   pause

   goto begin

復制代碼

  在這個例子中,驅動器 A 中磁盤上的所有文件均復制到d:\back中。

  顯示的信息提示您將另一張磁盤放入驅動器 A 時,pause 命令會使程序掛起,以便您更換磁盤,然后按任意鍵再次復制。

 

7.Call 命令

  語法: call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]

  參數: [Drive:][Path] FileName  指定要調用的批處理程序的位置和名稱。filename 參數必須具有 .bat 或 .cmd 擴展名。

  調用另一個批處理程序,並且不終止父批處理程序。

  如果不用call而直接調用別的批處理文件,那么執行完那個批處理文件后將無法返回當前文件並執行當前文件的后續命令。

  call 命令接受用作調用目標的標簽。如果在腳本或批處理文件外使用 Call,它將不會在命令行起作用。

  Sample:call="%cd%\test2.bat" haha kkk aaa    (調用指定目錄下的 test2.bat,且輸入3個參數給他)

  Sample:call test2.bat arg1 arg2    (調用同目錄下的 test2.bat,且輸入2個參數給他)

  注:可以調用自身(死循環、遞歸)

 

8.start 命令

  調用外部程序,所有的 DOS命令 和 命令行程序 都可以由 start命令 來調用。

  入侵常用參數:

        MIN 開始時窗口最小化

        SEPARATE 在分開的空間內開始 16 位 Windows 程序

        HIGH 在 HIGH 優先級類別開始應用程序

        REALTIME 在 REALTIME 優先級類別開始應用程序

        WAIT 啟動應用程序並等候它結束

        parameters 這些為傳送到命令/程序的參數

  Sample:start /MIN test2.bat arg1 arg2    (調用同目錄下的 test2.bat,且輸入2個參數給他,且本窗口最小化)

  Sample:e:\"program files"\極品列車時刻表\jpskb.exe  (文件路徑名有空格時)

 

8.If 命令

  if 表示將判斷是否符合規定的條件,從而決定執行不同的命令。有三種格式:

  1) IF

     語法: if [not] "參數" == "字符串" 待執行的命令

     參數如果等於(not表示不等,下同)指定的字符串,則條件成立,運行命令,否則運行下一句。(注意是兩個等號)

   Sample: if "%1" == "a" format a:

   Sample: if {%1} == {} goto noparms

 

  2) if exist

     語法: if [not] exist [路徑\]文件名 待執行的命令

     如果有指定的文件,則條件成立,運行命令,否則運行下一句。

     Sample: if exist config.sys edit config.sys   (表示如果存在這文件,則編輯它,用很難看的系統編輯器)

     Sample: if exist config.sys type config.sys   (表示如果存在這文件,則顯示它的內容)

 

  3) if errorlevel number

     語法: if [not] errorlevel <數字> 待執行的命令

     如果程序返回值等於指定的數字,則條件成立,運行命令,否則運行下一句。(返回值必須按照從大到小的順序排列)

     Sample:

       @echo off

       XCOPY F:\test.bat D:\

       IF ERRORLEVEL 1 (ECHO 文件拷貝失敗

       ) Else IF ERRORLEVEL 0 ECHO 成功拷貝文件

       pause

 

     很多DOS程序在運行結束后會返回一個數字值用來表示程序運行的結果(或者狀態),稱為錯誤碼errorlevel或稱返回碼。

     常見的返回碼為0、1。通過if errorlevel命令可以判斷程序的返回值,根據不同的返回值來決定執行不同的命令。

  4) else

     語法: if 條件 (成立時執行的命令) else (不成立時執行的命令)

     如果是多個條件,建議適當使用括號把各條件包起來,以免出錯。

     Sample: if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) else (echo comment3 )

     注:如果 else 的語句需要換行,if 執行的行尾需用“^”連接,並且 if 執行的動作需用(括起來),否則報錯

     Sample: if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) ^

             else (echo comment3 )

 

  5) 比較運算符:

     EQU - 等於   (一般使用“==”)

     NEQ - 不等於 (沒有 “!=”,改用“ if not 1==1 ”的寫法)

     LSS - 小於

     LEQ - 小於或等於

     GTR - 大於

     GEQ - 大於或等於

 

 

9.choice 命令

  choice 使用此命令可以讓用戶輸入一個字符(用於選擇),從而根據用戶的選擇返回不同的 errorlevel,

  然后配合 if errorlevel 選擇運行不同的命令。

        注意:choice命令為DOS或者Windows系統提供的外部命令,不同版本的choice命令語法會稍有不同,請用choice /?查看用法。

  choice 使用此命令可以讓用戶輸入一個字符,從而運行不同的命令。

  使用時應該加/c:參數,c:后應寫提示可輸入的字符,之間無空格。它的返回碼為1234……

復制代碼

    Sample:  choice /c:dme defrag,mem,end

    將顯示:  defrag,mem,end[D,M,E]?

    Sample:

    choice /c:dme defrag,mem,end

    if errorlevel 3 goto defrag (應先判斷數值最高的錯誤碼)

    if errorlevel 2 goto mem

    if errotlevel 1 goto end

復制代碼

Sample:  choice /c:dme defrag,mem,end

    將顯示:  defrag,mem,end[D,M,E]?

    Sample:

    choice /c:dme defrag,mem,end

    if errorlevel 3 goto defrag (應先判斷數值最高的錯誤碼)

    if errorlevel 2 goto mem

    if errotlevel 1 goto end

 

10.for 命令

   for 命令是一個比較復雜的命令,主要用於參數在指定的范圍內循環執行命令。

   1) for {%variable | %%variable} in (set) do command [command-parameters]

      %variable 指定一個單一字母可替換的參數。變量名稱是區分大小寫的,所以 %i 不同於 %I

      在批處理文件中使用 FOR 命令時,指定變量建議用 %%variable而不要用 %variable。

      (set) 指定一個或一組文件。可以使用通配符。

      command 指定對每個文件執行的命令。

      command-parameters 為特定命令指定參數或命令行開關。

   2) 如果命令擴展名被啟用,下列額外的 FOR 命令格式會受到支持:

      a.FOR /D %variable IN (set) DO command [command-parameters]

        如果集里面包含通配符,則指定與目錄名匹配,而不與文件名匹配。

      b.FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

        檢查以 [drive:]path 為根的目錄樹,指向每個目錄中的FOR 語句。

        如果在 /R 后沒有指定目錄,則使用當前目錄。如果集僅為一個單點(.)字符,則枚舉該目錄樹。

      c.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)。

      d.有或者沒有 usebackq 選項:

        FOR /F ["options"] %variable IN (file-set) DO command

        FOR /F ["options"] %variable IN ("string") DO command

        FOR /F ["options"] %variable IN (command)  DO command

    參數"options"為:

        eol=c           - 指一個行注釋字符的結尾(就一個,如“;”)

        skip=n          - 指在文件開始時忽略的行數。

        delims=xxx      - 指分隔符集。這個替換了空格和跳格鍵的默認分隔符集。

        tokens=x,y,m-n  - 指每行的哪一個符號被傳遞到每個迭代的 for 本身。這會導致額外變量名稱的分配。

                          m-n格式為一個范圍。通過 nth 符號指定 mth。

              如果符號字符串中的最后一個字符星號,那么額外的變量將在最后一個符號解析之后分配並接受行的保留文本。

        usebackq        - 指定新語法已在下類情況中使用:

                          在作為命令執行一個后引號的字符串並且一個單引號字符為文字字符串命令並允許在 filenameset中使用雙引號擴起文件名稱。

   3) Sample:

      1. 如下命令行會顯示當前目錄下所有以bat或者txt為擴展名的文件名。

         for %%c in (*.bat *.txt) do (echo %%c)

      a. 如下命令行會顯示當前目錄下所有包含有 e 或者 i 的目錄名。

         for /D %%a in (*e* *i*) do echo %%a

      b. 如下命令行會顯示 E盤test目錄 下所有以bat或者txt為擴展名的文件名。

         for /R E:\test %%b in (*.txt *.bat) do echo %%b

         for /r %%c in (*) do (echo %%c)  :: 遍歷當前目錄下所有文件

      c. 如下命令行將產生序列 1 2 3 4 5

         for /L %%c in (1,1,5) do echo %%c

      d. 以下兩句,顯示當前的年月日和時間

         For /f "tokens=1-3 delims=-/. " %%j In ('Date /T') do echo %%j年%%k月%%l日

         For /f "tokens=1,2 delims=: " %%j In ('TIME /T') do echo %%j時%%k分

      e. 把記事本中的內容每一行前面去掉8個字符

         setlocal enabledelayedexpansion

         for /f %%i in (zhidian.txt) do (

            set atmp=%%i

            set atmp=!atmp:~8!

           if {!atmp!}=={} ( echo.) else echo !atmp!

         )

         :: 讀取記事本里的內容(使用 delims 是為了把一行顯示全,否則會以空格為分隔符)

         for /f "delims=" %%a in (zhidian.txt) do echo.%%a

   4) continue 和 break

      利用 goto 實現程序中常用的 continue 和 break 命令, 其實非常簡單

      continue: 在 for 循環的最后一行寫上一個標簽,跳轉到這位置即可

      break: 在 for 循環的外面的下一句寫上一個標簽,跳轉到這位置即可

      Sample: (偽代碼)

        for /F ["options"] %variable IN (command)  DO (

        ... do command ...

        if ... goto continue

        if ... goto break

        ... do command ...

        :continue

        )

        :break

四、其它命令

1. ping 命令

   測試網絡聯接狀況以及信息包發送和接收狀況。但是不能夠測試端口。

   語法:ping IP地址或主機名 [-t] [-a] [-n count] [-l size]

    參數含義:

    -t 不停地向目標主機發送數據;

    -a 以IP地址格式來顯示目標主機的網絡地址;

    -n count 指定要Ping多少次,具體次數由count來指定;

    -l size 指定發送到目標主機的數據包的大小。

  Sample: ping 192.168.0.1 -t (不停的測試192.168.0.1,按ctrl+c停止)

  Sample: for /L %%a in (0,1,255) do ping 192.168.0.%%a -n 1 >> tmp.txt (ping一下所有的局域網電腦)

 

2. telnet 命令

   測試端口使用 telnet IP地址或主機名 端口,使用tcp協議的

   Sample:  telnet 192.168.0.1 80 (測試192.168.0.1的80端口)

 

3.color 命令

   設置背景及字體顏色

   語法: color bf

   b 是指定背景色的十六進制數字; f 指定前景顏色(即字體顏色)。

   顏色值:     0:黑色    1:藍色    2:綠色    3:湖藍    4:紅色    5:紫色    6:黃色    7:白色

               8:灰色    9:淡藍    A:淡綠    B:淺綠    C:淡紅    D:淡紫    E:淡黃    F:亮白

   如果沒有給定任何參數,該命令會將顏色還原到 CMD.EXE 啟動時的顏色。

   如果兩參數一樣,視為無效輸入。只有一個參數時,設置字體。

 

4. random 命令

   產生隨機數(正整數0~)

 

5. exit 命令

   結束程序。即時是被調用的程序,結束后也不會返回原程序

 

6. shutdown命令

   shutdown -s 關機

 

 

10. 所有內置命令的幫助信息

  ver /?

  cmd /?

  set /?

  rem /?

  if /?

  echo /?

  goto /?

  for /?

  shift /?

  call /?

  其他需要的常用命令

  type /?

  find /?

  findstr /?

  copy /?

原文地址:https://www.cnblogs.com/SunShineYPH/archive/2011/12/13/2285570.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM