bat 學習整理的筆記
%~dp0[獲取當前路徑]
“d”為Drive的縮寫,即驅動器,“p”為path的縮寫,即為目錄
cd %~dp0:進入批處理所在目錄
cd %~dp0bin:進入批處理所在目錄的bin目錄
示例
%cd%[當前執行的路徑]
taskkill /f /im notepad.exe [終止進程]
獲取命令幫助
xxx /?
ver /?
cmd /?
set /?
rem /?
if /?
echo /?
goto /?
for /?
shift /?
call /?
type /?
find /?
findstr /?
copy /?
一.基本語法
1.批處理文件是一個“.bat”結尾的文本文件,這個文件的每一行都是一條DOS命令。可以使用任何文本文件編輯工具創建和修改。
2.批處理是一種簡單的程序,可以用 if 和 goto 來控制流程,也可以使用 for 循環。
3.批處理的編程能力遠不如C語言等編程語言,也十分不規范。
4.每個編寫好的批處理文件都相當于一個DOS的外部命令,把它所在的目錄放到DOS搜索路徑(path)中,即可在任意位置運行。
5.C:\AUTOEXEC.BAT 是每次系統啟動時都會自動運行的,可以將每次啟動時都要運行的命令放入該文件中。
6.大小寫不敏感(命令符忽略大小寫)
7.批處理的文件擴展名為 .bat 或 .cmd。
8.在命令提示下鍵入批處理文件的名稱,或者雙擊該批處理文件,系統就會調用Cmd.exe來運行該文件。
二 、參數
1)系統參數
%SystemRoot% === C:\WINDOWS (%windir% 同樣)
%ProgramFiles% === C:\Program Files
%USERPROFILE% === C:\Documents and Settings\Administrator (子目錄有“桌面”,“開始菜單”,“收藏夾”等)
%APPDATA% === C:\Documents and Settings\Administrator\Application Data
%TEMP% === C:\DOCUME1\ADMINI1\LOCALS~1\Temp (%TEM% 同樣)
%APPDATA% === C:\Documents and Settings\Administrator\Application Data
%OS% === Windows_NT (系統)
%Path% === %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem (原本的設置)
%HOMEDRIVE% === C: (系統盤)
%HOMEPATH% === \Documents and Settings\Administrator
:: 枚舉當前的環境變量
setlocal enabledelayedexpansion
FOR /F "usebackq delims==" %%i IN (set
) DO @echo %%i !%%i!
2)傳遞參數給批處理文件
%[1-9]表示參數,參數是指在運行批處理文件時在文件名后加的以空格(或者Tab)分隔的字符串。
變量可以從%0到%9,%0表示批處理命令本身,其它參數字符串用 %1 到 %9 順序表示。
Sample:
call test2.bat "hello" "haha" (執行同目錄下的“test2.bat”文件,并輸入兩個參數)
在“test2.bat”文件里寫:
echo %1 (打印: "hello")
echo %2 (打印: "haha")
echo %0 (打印: test2.bat)
echo %19 (打印: "hello"9)
3.批處理基本命令
1.help 命令
/?
sample : type /? >>tmp.txt
2.echo 命令
語法: echo [{on|off}] [message]
ECHO [ON | OFF] 打開回顯或關閉回顯功能。
ECHO 顯示當前回顯設置。
ECHO [message] 顯示信息。
echo off 表示在此語句后所有運行的命令都不顯示命令行本身;默認是on,on時會顯示如: C:\文件夾路徑>命令行。
在實際應用中我們會把這條命令和重定向符號( 也稱為管道符號,一般用 > >> ^ )結合來實現輸入一些命令到特定格式的文件中。
Sample: echo off
Sample: echo hello world (顯示出“hello world”)
Sample: echo Windows Registry Editor Version 5.00 > c:\setupreg.reg (此前還沒有 setupreg.reg 這個文件)
Sample: echo "SourcePath"="D:\Win2003\" >> c:\setupreg.reg (追加內容進 setupreg.reg 這個文件)
3.@命令
表示不顯示@后面的命令,(在入侵過程中自然不能讓對方看到你使用的命令啦)
@ 與 echo off 相象,但它是加在每個命令行的最前面,表示運行時不顯示這一行的命令行(只能影響當前行)。
Sample: @echo off (此語句常用于開頭,表示不顯示所有的命令行信息,包括此句)
Sample: @echo please wait a minite...
Sample: @format X: /q/u/autoset
(format 這個命令是不可以使用/y這個參數的,可喜的是微軟留了個autoset這個參數給我們,效果和/y是一樣的。)
4 goto 命令
語法:goto label (label是參數,指定所要轉向的批處理程序中的行。)
指定跳轉到標簽行,找到標簽行后,程序將處理從下一行開始的命令。
label標簽的名字可以隨便起,但是最好是有意義的,字母前必須加個冒號“:”來表示這個字母是標簽。
goto命令就是根據這個冒號來尋找下一步跳到到那里。經常與 if 配合使用,根據不同的條件來執行不同的命令組。
例題見“5.Pause 命令”
5.rem 命令
語法:Rem Message...
(小技巧:用::代替rem)
注釋命令,在C語言中相當與/.../,它并不會被執行,只是起一個注釋的作用,便于別人閱讀和自己日后修改。
Sample:@Rem Here is the description.
6.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 命令會使程序掛起,以便您更換磁盤,然后按任意鍵再次復制。
7.call命令
語法: call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
參數: [Drive:][Path] FileName 指定要調用的批處理程序的位置和名稱。filename 參數必須具有 .bat 或 .cmd 擴展名。
調用另一個批處理程序,并且不終止父批處理程序。
如果不用call而直接調用別的批處理文件,那么執行完那個批處理文件后將無法返回當前文件并執行當前文件的后續命令。
call 命令接受用作調用目標的標簽。如果在腳本或批處理文件外使用 Call,它將不會在命令行起作用。
Sample:call="%cd%\test2.bat" haha kkk aaa (調用指定目錄下的 test2.bat,且輸入3個參數給他)
Sample:call test2.bat arg1 arg2 (調用同目錄下的 test2.bat,且輸入2個參數給他)
注:可以調用自身(死循環、遞歸)
8 .start 命令
調用外部程序,所有的 DOS命令 和 命令行程序 都可以由 start命令 來調用。
入侵常用參數:
MIN 開始時窗口最小化
SEPARATE 在分開的空間內開始 16 位 Windows 程序
HIGH 在 HIGH 優先級類別開始應用程序
REALTIME 在 REALTIME 優先級類別開始應用程序
WAIT 啟動應用程序并等候它結束
parameters 這些為傳送到命令/程序的參數
Sample:start /MIN test2.bat arg1 arg2 (調用同目錄下的 test2.bat,且輸入2個參數給他,且本窗口最小化)
Sample:e:"program files"\極品列車時刻表\jpskb.exe (文件路徑名有空格時)
9.if 命令
if 表示將判斷是否符合規定的條件,從而決定執行不同的命令。有三種格式:
- IF
語法: if [not] "參數" == "字符串" 待執行的命令
參數如果等于(not表示不等,下同)指定的字符串,則條件成立,運行命令,否則運行下一句。(注意是兩個等號)
Sample: if "%1" == "a" format a:
Sample: if {%1} == {} goto noparms
- if exist
語法: if [not] exist [路徑]文件名 待執行的命令
如果有指定的文件,則條件成立,運行命令,否則運行下一句。
Sample: if exist config.sys edit config.sys (表示如果存在這文件,則編輯它,用很難看的系統編輯器)
Sample: if exist config.sys type config.sys (表示如果存在這文件,則顯示它的內容)
- if errorlevel number
語法: if [not] errorlevel <數字> 待執行的命令
如果程序返回值等于指定的數字,則條件成立,運行命令,否則運行下一句。(返回值必須按照從大到小的順序排列)
Sample:
@echo off
XCOPY F:\test.bat D:\
IF ERRORLEVEL 1 (ECHO 文件拷貝失敗
) Else IF ERRORLEVEL 0 ECHO 成功拷貝文件
pause
很多DOS程序在運行結束后會返回一個數字值用來表示程序運行的結果(或者狀態),稱為錯誤碼errorlevel或稱返回碼。
常見的返回碼為0、1。通過if errorlevel命令可以判斷程序的返回值,根據不同的返回值來決定執行不同的命令。
- else
語法: if 條件 (成立時執行的命令) else (不成立時執行的命令)
如果是多個條件,建議適當使用括號把各條件包起來,以免出錯。
Sample: if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) else (echo comment3 )
注:如果 else 的語句需要換行,if 執行的行尾需用“^”連接,并且 if 執行的動作需用(括起來),否則報錯
Sample: if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) ^
else (echo comment3 )
- 比較運算符:
EQU - 等于 (一般使用“==”)
NEQ - 不等于 (沒有 “!=”,改用“ if not 1==1 ”的寫法)
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
10 choice 命令
choice 使用此命令可以讓用戶輸入一個字符(用于選擇),從而根據用戶的選擇返回不同的 errorlevel,
然后配合 if errorlevel 選擇運行不同的命令。
注意:choice命令為DOS或者Windows系統提供的外部命令,不同版本的choice命令語法會稍有不同,請用choice /?查看用法。
choice 使用此命令可以讓用戶輸入一個字符,從而運行不同的命令。
使用時應該加/c:參數,c:后應寫提示可輸入的字符,之間無空格。它的返回碼為1234……
Sample: choice /c:dme defrag,mem,end
將顯示: defrag,mem,end[D,M,E]?
Sample:
choice /c:dme defrag,mem,end
if errorlevel 3 goto defrag (應先判斷數值最高的錯誤碼)
if errorlevel 2 goto mem
if errotlevel 1 goto end
11 for命令
for 命令是一個比較復雜的命令,主要用于參數在指定的范圍內循環執行命令。
- for {%variable | %%variable} in (set) do command [command-parameters]
%variable 指定一個單一字母可替換的參數。變量名稱是區分大小寫的,所以 %i 不同于 %I
在批處理文件中使用 FOR 命令時,指定變量建議用 %%variable而不要用 %variable。
(set) 指定一個或一組文件。可以使用通配符。
command 指定對每個文件執行的命令。
command-parameters 為特定命令指定參數或命令行開關。
- 如果命令擴展名被啟用,下列額外的 FOR 命令格式會受到支持:
a.FOR /D %variable IN (set) DO command [command-parameters]
如果集里面包含通配符,則指定與目錄名匹配,而不與文件名匹配。
b.FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
檢查以 [drive:]path 為根的目錄樹,指向每個目錄中的FOR 語句。
如果在 /R 后沒有指定目錄,則使用當前目錄。如果集僅為一個單點(.)字符,則枚舉該目錄樹。
c.FOR /L %variable IN (start,step,end) DO command [command-parameters]
該集表示以增量形式從開始到結束的一個數字序列。
如:(1,1,5) 將產生序列 1 2 3 4 5; 而(5,-1,1) 將產生序列 (5 4 3 2 1)。
d.有或者沒有 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
參數"options"為:
eol=c - 指一個行注釋字符的結尾(就一個,如“;”)
skip=n - 指在文件開始時忽略的行數。
delims=xxx - 指分隔符集。這個替換了空格和跳格鍵的默認分隔符集。
tokens=x,y,m-n - 指每行的哪一個符號被傳遞到每個迭代的 for 本身。這會導致額外變量名稱的分配。
m-n格式為一個范圍。通過 nth 符號指定 mth。
如果符號字符串中的最后一個字符星號,那么額外的變量將在最后一個符號解析之后分配并接受行的保留文本。
usebackq - 指定新語法已在下類情況中使用:
在作為命令執行一個后引號的字符串并且一個單引號字符為文字字符串命令并允許在 filenameset中使用雙引號擴起文件名稱。
- Sample:
- 如下命令行會顯示當前目錄下所有以bat或者txt為擴展名的文件名。
for %%c in (*.bat *.txt) do (echo %%c)
a. 如下命令行會顯示當前目錄下所有包含有 e 或者 i 的目錄名。
for /D %%a in (e i) do echo %%a
b. 如下命令行會顯示 E盤test目錄 下所有以bat或者txt為擴展名的文件名。
for /R E:\test %%b in (*.txt *.bat) do echo %%b
for /r %%c in (*) do (echo %%c) :: 遍歷當前目錄下所有文件
c. 如下命令行將產生序列 1 2 3 4 5
for /L %%c in (1,1,5) do echo %%c
d. 以下兩句,顯示當前的年月日和時間
For /f "tokens=1-3 delims=-/. " %%j In ('Date /T') do echo %%j年%%k月%%l日
For /f "tokens=1,2 delims=: " %%j In ('TIME /T') do echo %%j時%%k分
e. 把記事本中的內容每一行前面去掉8個字符
setlocal enabledelayedexpansion
for /f %%i in (zhidian.txt) do (
set atmp=%%i
set atmp=!atmp:~8!
if {!atmp!}=={} ( echo.) else echo !atmp!
)
:: 讀取記事本里的內容(使用 delims 是為了把一行顯示全,否則會以空格為分隔符)
for /f "delims=" %%a in (zhidian.txt) do echo.%%a
- continue 和 break
利用 goto 實現程序中常用的 continue 和 break 命令, 其實非常簡單
continue: 在 for 循環的最后一行寫上一個標簽,跳轉到這位置即可
break: 在 for 循環的外面的下一句寫上一個標簽,跳轉到這位置即可
Sample: (偽代碼)
for /F ["options"] %variable IN (command) DO (
... do command ...
if ... goto continue
if ... goto break
... do command ...
:continue
)
:break
12.ping 命令
測試網絡聯接狀況以及信息包發送和接收狀況。但是不能夠測試端口。
語法:ping IP地址或主機名 [-t] [-a] [-n count] [-l size]
參數含義:
-t 不停地向目標主機發送數據;
-a 以IP地址格式來顯示目標主機的網絡地址;
-n count 指定要Ping多少次,具體次數由count來指定;
-l size 指定發送到目標主機的數據包的大小。
Sample: ping 192.168.0.1 -t (不停的測試192.168.0.1,按ctrl+c停止)
Sample: for /L %%a in (0,1,255) do ping 192.168.0.%%a -n 1 >> tmp.txt (ping一下所有的局域網電腦)
13. random 命令
產生隨機數(正整數0~)
14. exit 命令
結束程序。即時是被調用的程序,結束后也不會返回原程序
15. shutdown命令
shutdown -s 關機
四、字符串處理
1) 分割字符串,以查看時間為例
%源字符串:~起始值,截取長度% (起始值從0開始;截取長度是可選的,如果省略逗號和截取長度,將會從起始值截取到結尾;
截取長度如果是負數,表示截取到倒數第幾個。)
"%time%" 顯示如:"11:04:23.03" (完整的時間"hh:mm:ss.tt")
"%time:~0,5%" 顯示"hh:mm"(即"11:04"),其中0表示從右向左移位操作的個數,5表示從左向右移位操作的個數
"%time:~0,8%" 顯示標準時間格式"hh:mm:ss"(即"11:04:23",前8個字符串)
"%time:~3,-3%"顯示"mm:ss"(即從第4個開始,截去最后3個的字符串)
"%time:~3%" 顯示"04:23.03"(即去掉前4個字符串)
"%time:~-3%" 顯示".tt"(即最后3個字符串)
上面的字串分割格式,也可以用于其它地方,如目錄路徑:"%cd:~0,10%"
2) 替換字符串
set a="abcd1234"
echo %a% 顯示:"abcd1234"
set a=%a:1=kk% 替換“1”為“kk”
echo %a% 顯示:"abcdkk234"
3) 字符串合并
由于沒有直接的字符串合并函數,只能用笨方法了。
set str1=%str1%%str2% (合并 str1 和 str2)
4) 計算字符串長度
沒有現成的函數。如下程序利用 goto形成循環,不斷將字符串截短1,并記錄截短的次數,到字符串變成空時的次數即長度。
set testStr=This is a test string
:: 將 testStr 復制到str,str 是個臨時字符串
set str=%testStr%
:: 標簽,用于goto跳轉
:next1
:: 判斷str是不是空,如果不是則執行下邊的語句
if not "%str%"=="" (
:: 算術運算,使num的值自增1,相當于num++或者++num語句
set /a num+=1
:: 截取字符串,每次截短1
set "str=%str:~1%"
:: 跳轉到next1標簽: 這里利用goto和標簽,構成循環結構
goto next1
)
:: 當以上循環結構執行完畢時,會執行下邊的語句
echo testStr=%testStr%
echo testStr的長度為:%num%
5) 截取字符串時,需要傳遞參數
直接 echo %args:~%num%,-5% 沒辦法想要的字符串,需要如下兩步
setlocal enabledelayedexpansion
echo !args:~%num%,-5!
五、文件處理
1.刪除
- 刪除一個文件或多個文件
del /s /q /f d:\test\a.bat
將直接刪除d:\test\a.bat,沒有任務提示
del temp* /q /f /s
將直接刪除 本目錄的 temp 目錄的所有文件,沒有任務提示
刪除文件的時候可以使用“*”作通配符
- 2)刪除一個空目錄
rd /q /s d:\test\log
將直接刪除d:\test\log目錄,如果log目錄里面有文件將無法刪除
- 3)刪除一個非空目錄 (必須指定目錄名稱)
rmdir /q /s d:\test\logs
必須指定目錄名稱,不能使用通配符
/S 除目錄本身外,還將刪除指定目錄下的所有子目錄
/Q 安靜模式,帶 /S 刪除目錄樹時不要求確認
無論里面是否有文件或文件夾將全部直接刪除
2.創建目錄
MKDIR [drive:]path
MD [drive:]path
路徑有空格時,可以用雙引號括起來,也可以用 ? 替代