bat批處理學習

基礎語法:
    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)

批處理基本命令
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
        ... 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 /?

字符串處理
    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
     也可以對這種機制加以利用,如下的變量交換
     example:
       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 命令之前的設置如何。

  2) 爲了能夠感知環境變量的動態變化,批處理設計了變量延遲。簡單來說,在讀取了一條完整的語句之後,不立即對該行的變量賦值,而會在某個單條語句執行之前再進行賦值,也就是說“延遲”了對變量的賦值。
  examle:
    setlocal enabledelayedexpansion
    set a=4
    set a=5 & echo !a!
  結果: 5
  變量延遲的啓動語句是“setlocal enabledelayedexpansion”,並且變量要用一對歎號“!!”括起來
  由於啓動了變量延遲,所以批處理能夠感知到動態變化,即不是先給該行變量賦值,而是在運行過程中給變量賦值,因此此時a的值就是5了
  另外,啓動變量延遲,“%”的變量還是不變
  example2:
    setlocal enabledelayedexpansion
    for /l %%i in (1,1,5) do (
    set a=%%i
    echo !a!
    )
  結果,打印從1到5;如果不變量延遲,一個變量也沒有打印

文件處理
  1.刪除
    1) 刪除一個文件或多個文件
       del /s /q /f d:\test\a.bat
       將直接刪除d:\test\a.bat,沒有任務提示
       del temp\* /q /f /s
       將直接刪除 本目錄的 temp 目錄的所有文件,沒有任務提示
       刪除文件的時候可以使用“*”作通配符
    2) 刪除一個空目錄
       rd /q /s  d:\test\log
       將直接刪除d:\test\log目錄,如果log目錄裏面有文件將無法刪除
    3) 刪除一個非空目錄 (必須指定目錄名稱)
       rmdir /q /s d:\test\logs
       必須指定目錄名稱,不能使用通配符
       /S  除目錄本身外,還將刪除指定目錄下的所有子目錄
       /Q  安靜模式,帶 /S 刪除目錄樹時不要求確認
       無論裏面是否有文件或文件夾將全部直接刪除
  2.創建目錄
    MKDIR [drive:]path
    MD [drive:]path
    路徑有空格時,可以用雙引號括起來,也可以用   替代



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章