天天看點

玩bat和cmd檔案

在很多windows程式中會見到很多用擴充名為.bat和.cmd結尾的檔案,那麼這些檔案能幹什麼呢?其實他們都是一些批處理檔案,在指令提示下鍵入批處理檔案的名稱,或者輕按兩下該批處理檔案,系統就會調用Cmd.exe來運作該檔案。選中檔案後右擊滑鼠用記事本打開,看看裡面都是一些什麼吧。裡面都是一些dos指令,把一些你知道是指令寫在一個記事本裡面然後用.bat和.cmd字尾來存儲,用滑鼠輕按兩下打開,看看他的作用吧。

下面是一些批處理基本指令

0. help 指令

  /? 指令

  文法: 指令 /?

  可顯示此指令的幫助資訊

  Sample: type /? >>tmp.txt  (把 type 指令的幫助資訊寫入到tmp.txt檔案裡)

  Sample: help type  (顯示跟“type /?”一樣)

1.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 這個檔案)

2.@ 指令

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

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

  Sample: @echo off  (此語句常用于開頭,表示不顯示所有的指令行資訊,包括此句)

  Sample: @echo please wait a minite...

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

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

3.Goto 指令

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

  指定跳轉到标簽行,找到标簽行後,程式将處理從下一行開始的指令。

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

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

  例題見“5.Pause 指令”

4.Rem 指令

  文法:Rem Message...

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

  注釋指令,在C語言中相當與/*...*/,它并不會被執行,隻是起一個注釋的作用,便于别人閱讀和自己日後修改。

  Sample:@Rem Here is the description.

5.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 指令會使程式挂起,以便您更換磁盤,然後按任意鍵再次複制。

6.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個參數給他)

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

7.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

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

        :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 /?

五、字元串處理

    1) 分割字元串,以檢視時間為例

       %源字元串:~起始值,截取長度%  (起始值從0開始;截取長度是可選的,如果省略逗号和截取長度,将會從起始值截取到結尾;

       截取長度如果是負數,表示截取到倒數第幾個。)

      "%time%"      顯示如:"11:04:23.03" (完整的時間"hh:mm:ss.tt")

      "%time:~0,5%" 顯示"hh:mm"(即"11:04"),其中0表示從右向左移位操作的個數,5表示從左向右移位操作的個數

      "%time:~0,8%" 顯示标準時間格式"hh:mm:ss"(即"11:04:23",前8個字元串)

      "%time:~3,-3%"顯示"mm:ss"(即從第4個開始,截去最後3個的字元串)

      "%time:~3%"   顯示"04:23.03"(即去掉前4個字元串)

      "%time:~-3%"  顯示".tt"(即最後3個字元串)

      上面的字串分割格式,也可以用于其它地方,如目錄路徑:"%cd:~0,10%"

    2) 替換字元串

       set a="abcd1234"

       echo %a%          顯示:"abcd1234"

       set a=%a:1=kk%    替換“1”為“kk”

       echo %a%          顯示:"abcdkk234"

    3) 字元串合并

       由于沒有直接的字元串合并函數,隻能用笨方法了。

       set str1=%str1%%str2%    (合并 str1 和 str2)

    4) 計算字元串長度

       沒有現成的函數。如下程式利用 goto形成循環,不斷将字元串截短1,并記錄截短的次數,到字元串變成空時的次數即長度。

       set testStr=This is a test string

       :: 将 testStr 複制到str,str 是個臨時字元串

       set str=%testStr%

       :: 标簽,用于goto跳轉

       :next1

       :: 判斷str是不是空,如果不是則執行下邊的語句

       if not "%str%"=="" (

       :: 算術運算,使num的值自增1,相當于num++或者++num語句

       set /a num+=1

       :: 截取字元串,每次截短1

       set "str=%str:~1%"

       :: 跳轉到next1标簽: 這裡利用goto和标簽,構成循環結構

       goto next1

       )

       :: 當以上循環結構執行完畢時,會執行下邊的語句

       echo testStr=%testStr%

       echo testStr的長度為:%num%

    5) 截取字元串時,需要傳遞參數

       直接 echo %args:~%num%,-5% 沒辦法想要的字元串,需要如下兩步

       setlocal enabledelayedexpansion

       echo !args:~%num%,-5!

六、系統資料庫操作

    1) 備份系統資料庫,将[HKEY_LOCAL_MACHINE ... Run]的内容,備份到“c:\windows\1.reg”

       reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run c:\windows\1.reg

       reg export HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run c:\windows\2.reg

    2) 修改/添加系統資料庫内容

       a.一般的添加或修改

         reg add "HKCU\Environment" /v Java_Home /t reg_sz /d "D:\Java\jdk1.6.0_07" /f

         上句解析:“HKCU”是“HKEY_CURRENT_USER”的縮寫,不用縮寫用全稱也可以;

         添加名稱為“Java_Home”的變量;類型為“reg_sz”,另一種常見類型是“reg_dword”;值為 D:\Java\jdk1.6.0_07;

       b.使用變量

         set SoftWareHome=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java

         reg add "%SoftWareHome%Web Start\1.6.0_07" /v Home /t reg_sz /d "%cd%\jre1.6.0_07\bin" /f

       c.如果系統資料庫的名稱有空格,或者資料用特殊符号時

         reg add "%SoftWareHome2%\HelpCommands" /v "01:Online Documentation" /t reg_sz /d "\"%cd%\Documentation\Index.htm\"" /f

         傳入值為(值用雙引号括起來的):"D:\ProgramFiles\1.work_soft\Sybase\PowerDesigner_12\Documentation\Index.htm"

         reg add "%SoftWareHome2%\Paths" /v ReportTemplates /t reg_sz /d "%cd%\Resource Files\Report Templates\\" /f

         傳入值為(“\”結尾的): E:\Holemar\1.notes\90. Windows\Resource Files\Report Templates\

       d.增加空的内容

         reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg\IMJPMIG8.1"

       e.添加或修改預設值

         reg add "%vpath%InstallPath" /ve /t reg_sz /d "%cd%" /f

  這裡用“/ve”來代替一般修改時的“/v 變量名”,即可修改預設值了

    3) 删除系統資料庫的内容

      雙引号裡面的是系統資料庫的目錄,下面兩句将删除這目錄下的所有資訊

      reg delete "HKEY_CURRENT_USER\Software\RealVNC" /f

      reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\RealVNC" /f

      雙引号裡面的是系統資料庫的目錄,下面一句将删除這目錄下指定的某個資訊

      reg delete "HKEY_LOCAL_MACHINE\Software\RealVNC" /v VNC_Server /f

    4) 系統資料庫的常用位置

       a.系統啟動項:

         [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]

         [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]

     example: REG ADD HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run /v VNC_Server /t REG_SZ /d "%cd%\VNC_Server.bat" /f

       b.系統環境變量:

         [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]

       c.目前使用者的環境變量:

         [HKEY_CURRENT_USER\Environment]

    5) 修改系統資料庫之後,結束并重新加載explorer.exe程序,可重新整理系統資料庫,令其生效

       taskkill /f /im explorer.exe >nul

       start "" "explorer.exe"

七、系統服務

    1) 停止服務:NET STOP 服務名

       啟動服務:NET Start 服務名

    2) 設定啟動類型

       自動:  SC CONFIG 服務名 START= auto

       手動:  SC CONFIG 服務名 START= demand

       已禁用:SC CONFIG 服務名 START= disabled

       附:“START= ”等号後面必須要有一個空格。(start還有boot,system兩個值)

       Sample:  SC CONFIG Spooler START= demand (列印機附加元件,設定成手動,預設自動)

    3) 檢視系統服務:start %SystemRoot%\system32\services.msc /s

八、setlocal與變量延遲

  0) 在沒有開啟變量延遲的情況下,某條指令行中的變量改變,必須到下一條指令才能展現。

     另外例如for指令等,其後用一對圓括号閉合的所有語句也當作一行。

     example:

       set a=4

       set a=5 & echo %a%

     結果:4

     也可以對這種機制加以利用,如下的變量交換

       set var1=abc

       set var2=123

       echo 交換前: var1=%var1% var2=%var2%

       set var1=%var2%& set var2=%var1%

       echo 交換後: var1=%var1% var2=%var2%

  1) 啟動批處理檔案中環境變量的本地化。本地化将持續到出現比對的 endlocal 指令或者到達批處理檔案結尾為止。

    文法: setlocal {enableextension | disableextensions} {enabledelayedexpansion | disabledelayedexpansion}

    enableextension: 啟用指令擴充,直到出現比對的 endlocal 指令,無論 setlocal 指令之前的設定如何。

    disableextensions: 禁用指令擴充,直到出現比對的 endlocal 指令,無論 setlocal 指令之前的設定如何。

    enabledelayedexpansion: 啟用延遲的環境變量擴充,直到出現比對的 endlocal 指令,無論 setlocal 指令之前的設定如何。

    disabledelayedexpansion: 禁用延遲的環境變量擴充,直到出現比對的 endlocal 指令,無論 setlocal 指令之前的設定如何。