本文是學習bat整理的筆記,由于内容較多,建議結合右側文章大綱檢視。
%~dp0[擷取目前路徑]
%~dp0 “d”為Drive的縮寫,即為驅動器,磁盤、“p”為Path縮寫,即為路徑,目錄
cd %~dp0 :進入批處理所在目錄
cd %~dp0bin\ :進入批處理所在目錄的bin目錄
示例
這個示例在win10 x64測試正常
::作用:以管理者身份安裝Apache
d:
cd %~dp0bin\
httpd.exe -k install -n "Apache24"
運作結果
以管理者身份運作 示例.bat ,執行結果如下:
C:\Windows\system32>d:
D:\>cd D:\Server\Apache24\bin\
D:\Server\Apache24\bin>httpd.exe -k install -n "Apache24"
我的常用指令
%cd%[執行的路徑]
目前執行的路徑,并非目标檔案的路徑
taskkill /f /im notepad.exe [終止程序]
taskkill /?打開幫助

cmd視窗中文亂碼
在CMD視窗右鍵/預設值,打開屬性選擇 “預設代碼頁為簡體中文GBK”,
擷取指令幫助 xxx /?
遇到記不清楚的指令,但記得名字,就可以鍵入 指令名 空格 /?就會有詳細的該指令的幫助了,比如:ping /? cd /?
檢視内置指令的幫助資訊
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:\DOCUME~1\ADMINI~1\LOCALS~1\Temp (%TEM% 同樣)
%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)
三、批處理基本指令
0. help 指令
/? 指令
文法: 指令 /?
可顯示此指令的幫助資訊
Sample: type /? >>tmp.txt (把 type 指令的幫助資訊寫入到tmp.txt檔案裡)
Sample: help type (顯示跟“type /?”一樣)
1.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 這個檔案)
2.@ 指令
表示不顯示@後面的指令,(在入侵過程中自然不能讓對方看到你使用的指令啦)
@ 與 echo off 相象,但它是加在每個指令行的最前面,表示運作時不顯示這一行的指令行(隻能影響目前行)。
Sample: @echo off (此語句常用于開頭,表示不顯示所有的指令行資訊,包括此句)
Sample: @echo please wait a minite...
Sample: @format X: /q/u/autoset
(format 這個指令是不可以使用/y這個參數的,可喜的是微軟留了個autoset這個參數給我們,效果和/y是一樣的。)
3.Goto 指令
文法:goto label (label是參數,指定所要轉向的批處理程式中的行。)
指定跳轉到标簽行,找到标簽行後,程式将處理從下一行開始的指令。
label标簽的名字可以随便起,但是最好是有意義的,字母前必須加個冒号“:”來表示這個字母是标簽。
goto指令就是根據這個冒号來尋找下一步跳到到那裡。經常與 if 配合使用,根據不同的條件來執行不同的指令組。
例題見“5.Pause 指令”
4.Rem 指令
文法:Rem Message...
(小技巧:用::代替rem)
注釋指令,在C語言中相當與/*...*/,它并不會被執行,隻是起一個注釋的作用,便于别人閱讀和自己日後修改。
Sample:@Rem Here is the description.
5.Pause 指令
會暫停批處理的執行并在螢幕上顯示Press any key to continue...的提示,等待使用者按任意鍵後繼續
@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 [[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個參數給他)
注:可以調用自身(死循環、遞歸)
7.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 (檔案路徑名有空格時)
8.If 指令
if 表示将判斷是否符合規定的條件,進而決定執行不同的指令。有三種格式:
1) IF
文法: if [not] "參數" == "字元串" 待執行的指令
參數如果等于(not表示不等,下同)指定的字元串,則條件成立,運作指令,否則運作下一句。(注意是兩個等号)
Sample: if "%1" == "a" format a:
Sample: if {%1} == {} goto noparms
2) if exist
文法: if [not] exist [路徑\]檔案名 待執行的指令
如果有指定的檔案,則條件成立,運作指令,否則運作下一句。
Sample: if exist config.sys edit config.sys (表示如果存在這檔案,則編輯它,用很難看的系統編輯器)
Sample: if exist config.sys type config.sys (表示如果存在這檔案,則顯示它的内容)
3) if errorlevel number
文法: if [not] errorlevel <數字> 待執行的指令
如果程式傳回值等于指定的數字,則條件成立,運作指令,否則運作下一句。(傳回值必須按照從大到小的順序排列)
Sample:
XCOPY F:\test.bat D:\
IF ERRORLEVEL 1 (ECHO 檔案拷貝失敗
) Else IF ERRORLEVEL 0 ECHO 成功拷貝檔案
很多DOS程式在運作結束後會傳回一個數字值用來表示程式運作的結果(或者狀态),稱為錯誤碼errorlevel或稱傳回碼。
常見的傳回碼為0、1。通過if errorlevel指令可以判斷程式的傳回值,根據不同的傳回值來決定執行不同的指令。
4) 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 )
5) 比較運算符:
EQU - 等于 (一般使用“==”)
NEQ - 不等于 (沒有 “!=”,改用“ if not 1==1 ”的寫法)
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
9.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]?
choice /c:dme defrag,mem,end
if errorlevel 3 goto defrag (應先判斷數值最高的錯誤碼)
if errorlevel 2 goto mem
if errotlevel 1 goto end
10.for 指令
for 指令是一個比較複雜的指令,主要用于參數在指定的範圍内循環執行指令。
1) for {%variable | %%variable} in (set) do command [command-parameters]
%variable 指定一個單一字母可替換的參數。變量名稱是區分大小寫的,是以 %i 不同于 %I
在批處理檔案中使用 FOR 指令時,指定變量建議用 %%variable而不要用 %variable。
(set) 指定一個或一組檔案。可以使用通配符。
command 指定對每個檔案執行的指令。
command-parameters 為特定指令指定參數或指令行開關。
2) 如果指令擴充名被啟用,下列額外的 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中使用雙引号擴起檔案名稱。
3) Sample:
1. 如下指令行會顯示目前目錄下所有以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個字元
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
4) 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
:continue
:break
四、其它指令
1. 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一下所有的區域網路電腦)
2. telnet 指令
測試端口使用 telnet IP位址或主機名 端口,使用tcp協定的
Sample: telnet 192.168.0.1 80 (測試192.168.0.1的80端口)
3.color 指令
設定背景及字型顔色
文法: color bf
b 是指定背景色的十六進制數字; f 指定前景顔色(即字型顔色)。
顔色值: 0:黑色 1:藍色 2:綠色 3:湖藍 4:紅色 5:紫色 6:** 7:白色
8:灰色 9:淡藍 A:淡綠 B:淺綠 C:淡紅 D:淡紫 E:淡黃 F:亮白
如果沒有給定任何參數,該指令會将顔色還原到 CMD.EXE 啟動時的顔色。
如果兩參數一樣,視為無效輸入。隻有一個參數時,設定字型。
4. random 指令
産生随機數(正整數0~)
5. exit 指令
結束程式。即時是被調用的程式,結束後也不會傳回原程式
6. 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% 沒辦法想要的字元串,需要如下兩步
echo !args:~%num%,-5!
六、系統資料庫操作
1) 備份系統資料庫,将[HKEY_LOCAL_MACHINE ... Run]的内容,備份到“c:\windows\1.reg”
reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run c:\windows\1.reg
reg export HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run c:\windows\2.reg
2) 修改/添加系統資料庫内容
a.一般的添加或修改
reg add "HKCU\Environment" /v Java_Home /t reg_sz /d "D:\Java\jdk1.6.0_07" /f
上句解析:“HKCU”是“HKEY_CURRENT_USER”的縮寫,不用縮寫用全稱也可以;
添加名稱為“Java_Home”的變量;類型為“reg_sz”,另一種常見類型是“reg_dword”;值為 D:\Java\jdk1.6.0_07;
b.使用變量
set SoftWareHome=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java
reg add "%SoftWareHome%Web Start\1.6.0_07" /v Home /t reg_sz /d "%cd%\jre1.6.0_07\bin" /f
c.如果系統資料庫的名稱有空格,或者資料用特殊符号時
reg add "%SoftWareHome2%\HelpCommands" /v "01:Online Documentation" /t reg_sz /d "\"%cd%\Documentation\Index.htm\"" /f
傳入值為(值用雙引号括起來的):"D:\ProgramFiles\1.work_soft\Sybase\PowerDesigner_12\Documentation\Index.htm"
reg add "%SoftWareHome2%\Paths" /v ReportTemplates /t reg_sz /d "%cd%\Resource Files\Report Templates\\" /f
傳入值為(“\”結尾的): E:\Holemar\1.notes\90. Windows\Resource Files\Report Templates\
d.增加空的内容
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg\IMJPMIG8.1"
e.添加或修改預設值
reg add "%vpath%InstallPath" /ve /t reg_sz /d "%cd%" /f
這裡用“/ve”來代替一般修改時的“/v 變量名”,即可修改預設值了
3) 删除系統資料庫的内容
雙引号裡面的是系統資料庫的目錄,下面兩句将删除這目錄下的所有資訊
reg delete "HKEY_CURRENT_USER\Software\RealVNC" /f
reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\RealVNC" /f
雙引号裡面的是系統資料庫的目錄,下面一句将删除這目錄下指定的某個資訊
reg delete "HKEY_LOCAL_MACHINE\Software\RealVNC" /v VNC_Server /f
4) 系統資料庫的常用位置
a.系統啟動項:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
example: REG ADD HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run /v VNC_Server /t REG_SZ /d "%cd%\VNC_Server.bat" /f
b.系統環境變量:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]
c.目前使用者的環境變量:
[HKEY_CURRENT_USER\Environment]
5) 修改系統資料庫之後,結束并重新加載explorer.exe程序,可重新整理系統資料庫,令其生效
taskkill /f /im explorer.exe >nul
start "" "explorer.exe"
七、系統服務
1) 停止服務:NET STOP 服務名
啟動服務:NET Start 服務名
2) 設定啟動類型
自動: SC CONFIG 服務名 START= auto
手動: SC CONFIG 服務名 START= demand
已禁用:SC CONFIG 服務名 START= disabled
附:“START= ”等号後面必須要有一個空格。(start還有boot,system兩個值)
Sample: SC CONFIG Spooler START= demand (列印機附加元件,設定成手動,預設自動)
3) 檢視系統服務:start %SystemRoot%\system32\services.msc /s
八、setlocal與變量延遲
0) 在沒有開啟變量延遲的情況下,某條指令行中的變量改變,必須到下一條指令才能展現。
另外例如for指令等,其後用一對圓括号閉合的所有語句也當作一行。
example:
set a=4
set a=5 & echo %a%
結果:4
也可以對這種機制加以利用,如下的變量交換
set var1=abc
set var2=123
echo 交換前: var1=%var1% var2=%var2%
set var1=%var2%& set var2=%var1%
echo 交換後: var1=%var1% var2=%var2%
1) 啟動批處理檔案中環境變量的本地化。本地化将持續到出現比對的 endlocal 指令或者到達批處理檔案結尾為止。
文法: setlocal {enableextension | disableextensions} {enabledelayedexpansion | disabledelayedexpansion}
enableextension: 啟用指令擴充,直到出現比對的 endlocal 指令,無論 setlocal 指令之前的設定如何。
disableextensions: 禁用指令擴充,直到出現比對的 endlocal 指令,無論 setlocal 指令之前的設定如何。
enabledelayedexpansion: 啟用延遲的環境變量擴充,直到出現比對的 endlocal 指令,無論 setlocal 指令之前的設定如何。
disabledelayedexpansion: 禁用延遲的環境變量擴充,直到出現比對的 endlocal 指令,無論 setlocal 指令之前的設定如何。
2) 為了能夠感覺環境變量的動态變化,批處理設計了變量延遲。簡單來說,在讀取了一條完整的語句之後,不立即對該行的變量指派,而會在某個單條語句執行之前再進行指派,也就是說“延遲”了對變量的指派。
examle:
set a=5 & echo !a!
結果: 5
變量延遲的啟動語句是“setlocal enabledelayedexpansion”,并且變量要用一對歎号“!!”括起來
由于啟動了變量延遲,是以批處理能夠感覺到動态變化,即不是先給該行變量指派,而是在運作過程中給變量指派,是以此時a的值就是5了
另外,啟動變量延遲,“%”的變量還是不變
example2:
for /l %%i in (1,1,5) do (
set a=%%i
echo !a!
結果,列印從1到5;如果不變量延遲,一個變量也沒有列印
九、檔案處理
1.删除
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
路徑有空格時,可以用雙引号括起來,也可以用 替代
實踐部分:
======================================================================
小摘錄:
1. 調用其他程式時,對檔案的大小寫不敏感,檔案字尾也可忽略
如:start LeapFTP.exe 與 start leapftp 效果一樣,都是運作“LeapFTP.exe”檔案
每行的開頭的字元串會自動查找程式來運作,還可用雙引号引起來(檔案名或目錄名含空格時必須用)
如:"D:\Program Files\Leap FTP.exe"
"LeapFTP.exe" 可正常運作檔案,start "" "LeapFTP.exe" 也可以正常運作檔案(注意,第一個參數是視窗顯示的标題)
3. copy C:\test\*.* D:\back (複制C槽test檔案夾的所有檔案(不包括檔案夾及子檔案夾裡的東西)到D盤的back檔案夾)
4. dir c:\*.* > a.txt (将c盤檔案清單寫入 a.txt 中)
5. > 生成檔案并寫入内容(如果有這檔案則覆寫), >> 檔案裡追加内容
6. md d:\aa (建立檔案夾)
7. 在指令末尾加上“>NUL 2>NUL”,表示隐蔽傳回資訊。
8. 等待使用者輸入: set /p 變量名=螢幕顯示資訊。 Sample:set /p pass=請輸入密碼:
9. 讓使用者按回車退出
小技巧(替代pause),檔案的最後一句:set /p tmp=操作結束,請按Enter鍵退出...
10.設定标題: title JDK安裝
11.設定螢幕顯示顔色,如綠色: color 0a
12.清屏: cls
13.檢視自己的IP:
for /f "tokens=15" %%i in ('ipconfig ^| find /i "ip address"') do set ip=%%i
echo %ip% (這時的 %ip% 就是自己的IP位址)
14. 修改檔案的更新日期
copy 檔案名+,,>nul (修改為目前時間,如果要修改為指定時間,先修改系統時間,再改回系統時間)
15. 修改檔案的字尾名
ren C:\test\*.jpg *.JPG
for /r %%c in (*.jpg) do (ren %%c *.JPG) :: 修改目前目錄下的所有檔案的字尾名,包括子目錄的
16. 修改檔案的檔案名
rename test.jpg test2.JPG
rename *.jpg *.888.JPG
17. 檢視DNS、IP、Mac等
1) Win98: winipcfg
2) Win2000以上: Ipconfig /all
3) NSLOOKUP
18.檢視IP上的共享資源,就可以
net view 192.168.10.8
19.共享
A.檢視你機器的共享資源: net share
B.手工删除共享
net share 共享資源名稱$ /d
注意$後有空格。
C.增加一個共享:
net share mymovie=e:\downloads\movie /users:3
mymovie 共享成功。 同時限制連結使用者數為3人。
20.打開某網站
start iexplore.exe http://www.baidu.com
執行個體
1. 生成 reg 檔案,運作它,再删除它
echo "更改windows安裝檔案的路徑"
echo Windows Registry Editor Version 5.00 > c:\setupreg.reg
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup] >> c:\setupreg.reg
echo "ServicePackSourcePath"="D:\\Win2003\\" >> c:\setupreg.reg
echo "SourcePath"="D:\\Win2003\\" >> c:\setupreg.reg
:: 寫入系統資料庫
regedit /S c:\setupreg.reg
:: 删除系統資料庫檔案
del c:\setupreg.reg
2.調用了exe檔案,結束後沒有關閉,解決方法
用start指令運作檔案,如:
start LeapFTP.exe 192.168.0.100
3.設定系統環境變量
:: 有這個環境變量,則不需再設定,直接結束
if not "%JAVA_HOME%" == "" exit
:: 設定環境變量的位址
set inputJavaHome=%cd%\jdk1.6.0_07
:: 設定環境變量,也可以設定目前使用者的變量
set EnvironmentHome=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
echo 正在設定環境變量,請稍候......
reg add "%EnvironmentHome%" /v JAVA_HOME /t reg_sz /d "%inputJavaHome%" /f
reg add "%EnvironmentHome%" /v ClassPath /t reg_sz /d ".;%%JAVA_HOME%%\lib" /f
reg add "%EnvironmentHome%" /v Path /t reg_sz /d "%%JAVA_HOME%%\bin;%Path%" /f]
:: 重新整理,令環境變量生效
4.隐藏某目錄的所有檔案及檔案夾
cd /d 要隐藏的目錄(如:D:)
for /f "usebackq delims=" %%A in (`dir /a /b`) do (attrib "%%A" -r +h -s)
5.在批進行中使用密碼。密碼為admin,輸入正确,跳轉到next1 ,若輸入密碼錯誤3次,則鎖屏。。
set num=0
:11
set /p pass=請輸入密碼:
if "%pass%"=="admin" goto next1
set /a num=%num% + 1
if %num%==3 goto no1
goto 11
:no1
%windir%\system32\rundll32.exe user32.dll,LockWorkStation
echo 密碼正确,執行下面的程式
6.清空資源回收筒(未成功)
del /f /s /q c:\recycler\*.*
::重新整理螢幕
7.讓系統斷斷續續地鳴叫
:: 發出鳴叫(“”實際就是ASCII碼值為7的特殊字元(蜂鳴鍵beep)
echo
:: 讓程式暫停一小陣子
ping -n 1 -l 1 127.1>nul
goto :begin
8.将 FAT 卷轉換成 NTFS
利用“CONVERT.exe”進行,解析如下:
CONVERT volume /FS:NTFS [/V] [/CvtArea:filename] [/NoSecurity] [/X]
volume 指定驅動器号(後面跟一個冒号)、裝載點或卷名。
/FS:NTFS 指定要被轉換成 NTFS 的卷。
/V 指定 Convert 應該用詳述模式運作。
/CvtArea:filename
将根目錄中的一個接續檔案指定為NTFS 系統檔案的占位符。
/NoSecurity 指定每個人都可以通路轉換的檔案和目錄的安全設定。
/X 如果必要,先強行解除安裝卷。該卷的所有打開的句柄則無效。
程式如下:
@ ECHO OFF
@ ECHO.
@ ECHO. 說 明
@ ECHO --------------------------------------------------------------------------
@ ECHO NTFS是一種磁盤格式。該格式能存放大于4G的單個檔案(如高清電影檔案),并可對
@ ECHO 檔案夾進行加密,但有個缺點是DOS下無法通路。建議D盤及其後的盤使用NTFS格式,
@ ECHO C槽如非必要可以不轉換,FAT32與NTFS這兩種格式的讀寫速度幾乎是沒有差别的。
convert c: /fs:ntfs
:: D盤也轉成 NTFS
convert d: /fs:ntfs
9. 擷取我的檔案
SET SF="HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
FOR /F "tokens=2,*" %%I IN ('REG QUERY %SF% /v Personal 2^>NUL^|FIND /I "Personal"') DO SET "myDoc=%%~J"
:: 複制檔案到我的檔案
XCOPY /D /E /R /Y /C "%cd%\test.txt" "%myDoc%\test\"
10 擷取目前目錄路徑
cd ./
set CURR_PATH=%cd%
==========================================
執行個體:
3.IF-ERRORLEVEL
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:IF ERRORLEVEL 1 ECHO 檔案拷貝失敗
IF ERRORLEVEL 0 ECHO 成功拷貝檔案
如果檔案拷貝成功,螢幕就會顯示“成功拷貝檔案”,否則就會顯示“檔案拷貝失敗”。
IF ERRORLEVEL 是用來測試它的上一個DOS指令的傳回值的,注意隻是上一個指令的傳回值,而且傳回值必須依照從大到小次序順序判斷。是以下面的批處理檔案是錯誤的:
XCOPY C:\AUTOEXEC.BAT D:\
CHO 成功拷貝檔案
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 拷貝過程中寫盤錯誤
=============================================================
@echo off //不顯示shell的指令。
Setlocal //環境改變隻适用于這個檔案。
%OS% //為目前的作業系統。
Rem //注釋一行文本。
Goto 标簽 //改變執行順序,去标簽位置.
:标簽 //定義一個标簽。
Set 變量名=值 //定義變量
Not //取反
Netstat –na //顯示目前被點用的端口.
%0 %1 %2 //用于表示批處理檔案的參數0為指令,共1-9個參數。
Shift //用于向前一個參數,原1變0,原2變1.每調用一次shift向前一移動一位。
Call //調用其他批處理檔案或指令。
Start 指令 參數 //訓示出在另一個視窗中開始運作指令。
:: 這段批處理程式可以自動設定Java環境變量
IF EXIST %1\bin\java.exe (
rem 如輸入正确的 Java2SDK 安裝目錄,開始設定環境變量
@setx JAVA_HOME %1
@setx path %path%;%JAVA_HOME%\bin
@setx classpath %classpath%;.
@setx classpath %classpath%;%JAVA_HOME%\lib\tools.jar
@setx classpath %classpath%;%JAVA_HOME%\lib\dt.jar
@setx classpath %classpath%;%JAVA_HOME%\jre\lib\rt.jar
@echo on
@echo Java 2 SDK 環境參數設定完畢,正常退出。
) ELSE (
IF "%1"=="" (
rem 如沒有提供安裝目錄,提示之後退出
@echo 沒有提供 Java2SDK 的安裝目錄,不做任何設定,現在退出環境變量設定。
rem 如果提供非空的安裝目錄但沒有bin\java.exe,則指定的目錄為錯誤的目錄
@echo 非法的 Java2SDK 的安裝目錄,不做任何設定,現在退出環境變量設定。