批處理文件——BAT學習

批處理文件——BAT學習


批處理文件是無格式的文本文件,它包含一條或多條命令。它的文件擴展名爲 .bat 或 .cmd。在命令提示下鍵入批處理文件的名稱,或者雙擊該批處理文件,系統就會調用Cmd.exe按照該文件中各個命令出現的順序來逐個運行它們。

使用批處理文件(也被稱爲批處理程序或腳本),可以簡化日常或重複性任務。當然我們的這個版本的主要內容是介紹批處理在入侵中一些實際運用,例如我們後面要提到的用批處理文件來給系統打補丁、批量植入後門程序等。

下面就開始我們批處理學習之旅吧。

語法:

  1. 批處理文件是一個“.bat”結尾的文本文件,這個文件的每一行都是一條DOS命令。可以使用任何文本文件編輯工具創建和修改。
  2. 批處理是一種簡單的程序,可以用 if 和 goto 來控制流程,也可以使用 for 循環。
  3. 批處理的編程能力遠不如C語言等編程語言,也十分不規範。
  4. 每個編寫好的批處理文件都相當於一個DOS的外部命令,把它所在的目錄放到DOS搜索路徑(path)中,即可在任意位置運行。
  5. C:\AUTOEXEC.BAT 是每次系統啓動時都會自動運行的,可以將每次啓動時都要運行的命令放入該文件中。
  6. 大小寫不敏感(命令符忽略大小寫)
  7. 批處理的文件擴展名爲 .bat 或 .cmd。
  8. 在命令提示下鍵入批處理文件的名稱,或者雙擊該批處理文件,系統就會調用Cmd.exe來運行該文件。

批處理命令簡介

help命令

/? 命令
語法: 命令 /?
可顯示此命令的幫助信息

  Sample: type /? >>tmp.txt  (把 type 命令的幫助信息寫入到tmp.txt文件裏)
  Sample: help type  (顯示跟“type /?”一樣)

Echo 命令

打開回顯或關閉請求回顯功能,或顯示消息。如果沒有任何參數,echo命令將顯示當前回顯設置。

  語法
     echo [{on off}] [message] 
     Sample:@echo off / echo hello world 

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

  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 這個文件)

@ 命令

表示不顯示@後面的命令,在入侵過程中(例如使用處理來格式化敵人的硬盤)自然不能讓對方看到你使用的命令。

 Sample:@echo off 
 @echo Now initializing the program,please wait a minite... 
 @format X: /q/u/autoset (format 這個命令是不可以使用/y這個參數的,可喜的是微軟留了個autoset這個參數給我們,效果和/y是一樣的。)

Goto 命令

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

語法:goto label (label是參數,指定所要轉向的處理程序中的行。) 
Sample: 
if {%1}=={} goto noparms 
if {%2}=={} goto noparms(如果這裏的if、%1、%2你不明白的話,先跳過去,後面會有詳細的解釋。) 
 @Rem check parameters if null show usage 
  :noparms 
  echo Usage: monitor.bat ServerIP PortNumber 
  goto end 

標籤的名字可以隨便起,但最好是有意義的字母,字母前加個:用來表示這個字母是標籤,goto命令就是根據這個:來尋找下一步跳到到那裏。

Rem 命令

註釋命令,相當於在C語言中/--------/,它並不會被執行(小技巧:用::代替rem)。

 Rem Message 
  Sample:@Rem Here is the description. 

Pause 命令

運行 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 命令會使程序掛起,以便您更換磁盤,然後按任意鍵繼續處理。

Call 命令

從一個處理程序調用另一個處理程序,並且不終止父處理程序。call 命令接受用作調用目標的標籤。如果在腳本或處理文件外使用 Call,它將不會在命令行起作用。

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

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

start 命令

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

入侵常用參數:
MIN 開始時窗口最小化
SEPARATE 在分開的空間內開始 16 位 Windows 程序
HIGH 在 HIGH優先級類別開始應用程序
REALTIME 在 REALTIME 優先級類別開始應用程序
WAIT 啓動應用程序並等候它結束
parameters 這些爲傳送到命令/程序的參數
執行的應用程序是 32-位 GUI 應用程序時,CMD.EXE不等應用程序終止就返回命令提示。如果在命令腳本內執行,該新行爲則不會發生。

choice 命令

choice 使用此命令可以讓用戶輸入一個字符,從而運行不同的命令。使用時應該加/c:參數,c:後應寫提示可輸入的字符,之間無空格。它的返回碼爲1234……

如: choice /c:dme defrag,mem,end 
將顯示:defrag,mem,end[D,M,E]? 

Sample:
  Sample.bat的內容如下:

@echo off 
  choice /c:dme defrag,mem,end 
  if errorlevel 3 goto defrag (應先判斷數值最高的錯誤碼) 
  if errorlevel 2 goto mem 
  if errotlevel 1 goto end 
  :defrag 
  		c:\dos\defrag 
  		goto end 
  :mem 
  		mem 
  		goto end 
  :end 
  echo good bye 

此文件運行後,將顯示 defrag,mem,end[D,M,E]? 用戶可選擇d m e ,然後if語句將作出判斷,d表示執行標號爲defrag的程序段,m表示執行標號爲mem的程序段,e表示執行標號爲end的程序段,每個程序段最後都以goto end將程序跳到end標號處,然後程序將顯示good bye,文件結束。

If 命令

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

  1. if “參數” == “字符串” 待執行的命令

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

if "%1"=="a" format a: 
if {%1}=={} goto noparms 
if {%2}=={} goto noparms 
  1. if exist 文件名  待執行的命令

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

if exist config.sys edit config.sys 
  1. if errorlevel / if not errorlevel 數字 待執行的命令

如果返回碼等於指定的數字,則條件成立,運行命令,否則運行下一句。 如

if errorlevel 2 goto x2

DOS程序運行時都會返回一個數字給DOS,稱爲錯誤碼errorlevel或稱返回碼,常見的返回碼爲0,1。

  1. 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 )
  1. 比較運算符:
    • EQU - 等於 (一般使用“==” )
    • NEQ - 不等於 (沒有 “!=”,改用“ if not 1==1 ”的寫法)
    • LSS - 小於
    • LEQ - 小於或等於
    • GTR - 大於
    • GEQ - 大於或等於

for 命令

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

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

-%variable 指定一個單一字母可替換的參數。變量名稱是區分大小寫的,所以 %i 不同於 %I,在批處理文件中使用 FOR 命令時,指定變量建議用 %%variable而不要用 %variable。
-(set) 指定一個或一組文件。可以使用通配符。
-command 指定對每個文件執行的命令。
-command-parameters 爲特定命令指定參數或命令行開關。

  1. 如果命令擴展名被啓用,下列額外的 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中使用雙引號擴起文件名稱。

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

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

批處理文件中使用參數

系統參數

%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!

傳遞參數給批處理文件

%[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)

sample2: 
  當我們要建立一個IPC$連接地時候總要輸入一大串命令,弄不好就打錯了,所以我們不如把一些固定命令寫入一個處理,把肉雞地ip password username 當着參數來賦給這個處理,這樣就不用每次都打命令了。 
  @echo off 
  @net use \\1%\ipc$ "2%" /u:"3%" 注意哦,這裏PASSWORD是第二個參數。 
  @if errorlevel 1 echo connection failed 

如何使用組合命令(Compound Command)

1.amp;
  Usage:第一條命令 amp; 第二條命令 [amp; 第三條命令…]
  用這種方法可以同時執行多條命令,而不管命令是否執行成功

Sample: 
  C:\>dir z: amp; dir c:\Ex4rch 
  The system cannot find the path specified. 
  Volume in drive C has no label. 
  Volume Serial Number is 0078-59FB 
  Directory of c:\Ex4rch 

其它命令

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一下所有的局域網電腦)

telnet 命令

測試端口使用 telnet IP地址或主機名 端口,使用tcp協議的
Sample: telnet 192.168.0.1 80 (測試192.168.0.1的80端口)

color 命令

設置背景及字體顏色
語法: color bf

b 是指定背景色的十六進制數字; f 指定前景顏色(即字體顏色)。
顏色值: 0:黑色 1:藍色 2:綠色 3:湖藍 4:紅色 5:紫色 6:黃色 7:白色 8:灰色 9:淡藍 A:淡綠 B:淺綠 C:淡紅 D:淡紫 E:淡黃 F:亮白

如果沒有給定任何參數,該命令會將顏色還原到 CMD.EXE 啓動時的顏色。
如果兩參數一樣,視爲無效輸入。只有一個參數時,設置字體。

random 命令

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

exit 命令

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

shutdown命令

shutdown -s 關機

所有內置命令的幫助信息

ver /?
cmd /?
set /?
rem /?
if /?
echo /?
goto /?
for /?
shift /?
call /?
其他需要的常用命令
type /?
find /?
findstr /?
copy /?

字符串處理

分割字符串(以查看時間爲例)

%源字符串:~起始值,截取長度% (起始值從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%"

替換字符串

   set a="abcd1234"
   echo %a%          顯示:"abcd1234"
   set a=%a:1=kk%    替換“1”爲“kk”
   echo %a%          顯示:"abcdkk234"

字符串合併

   由於沒有直接的字符串合併函數,只能用笨方法了。
   set str1=%str1%%str2%    (合併 str1 和 str2)

計算字符串長度

如下程序利用 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%

截取字符串時,需要傳遞參數

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

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

註冊表操作

備份註冊表,

將[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

修改/添加註冊表內容

  1. 一般的添加或修改

    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;
    

2 .使用變量

     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
  1. 如果註冊表的名稱有空格,或者數據用特殊符號時

    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\
    
  2. 增加空的內容

      reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg\IMJPMIG8.1"
    
  3. 添加或修改默認值

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

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

刪除註冊表的內容

  雙引號裏面的是註冊表的目錄,下面兩句將刪除這目錄下的所有信息
  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

註冊表的常用位置

  1. 系統啓動項:
    [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

  1. 系統環境變量:
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]
  2. 當前用戶的環境變量:
    [HKEY_CURRENT_USER\Environment]

修改註冊表之後

修改註冊表之後,結束並重新加載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與變量延遲

  1. 在沒有開啓變量延遲的情況下,某條命令行中的變量改變,必須到下一條命令才能體現。另外例如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 命令之前的設置如何。

  1. 爲了能夠感知環境變量的動態變化,批處理設計了變量延遲。簡單來說,在讀取了一條完整的語句之後,不立即對該行的變量賦值,而會在某個單條語句執行之前再進行賦值,也就是說“延遲”了對變量的賦值。

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) 刪除一個文件或多個文件
   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 刪除目錄樹時不要求確認
   無論裏面是否有文件或文件夾將全部直接刪除

創建目錄

MKDIR [drive:]path
MD [drive:]path
路徑有空格時,可以用雙引號括起來,也可以用   替代

文章整理轉載於:Bat命令學習批處理及批處理文件中使用參數

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