1.綜述
(1)、 “.bat”: 這是微軟的第一個批次檔的尾碼名,在幾乎所有的Windows 作業系統內都能運行。
(2)、 “.cmd”: 是為Windows NT 設計的命令列指令碼, 為Cmd.exe shell而設計的, 對於COMMAND.COM不具有向後相容性。
(3)、目前所知道的.cmd 和 .bat檔案的區別是對ERRORLEVEL變數的改變:當Command Extensions (命令列擴充)處於enabled狀態時,哪怕是.cmd檔案中一個成功執行的命令都可以改變ERRORLEVEL的值,而在.bat 檔案中ERRORLEVEL 變數只有在遇到錯誤的時候才發生改變。
2.@echo off/echo on
(1). “echo” 用來在控制台上顯示資訊。
(2). “echo.” 用來顯示一空行。(注意:echo和右下角的點之間沒有空格,如果有空格就變成顯示句點了。)
(3). “echo off”: 在使用了這行命令之後,其他命令都只顯示命令的結果,而不顯示命令本身。
(4). “echo on”: 這是預設值,表示顯示所有的命令結果和命令列本身。
(5).“echo”: 當執行echo而不帶任何參數的時候,會顯示echo的開啟或關閉的狀態:“ECHO is on” 或者 “ECHO is off”。
(6). “@”:@ 符號表示不顯示本行的命令本身。如果只用echo off,雖然echo off後面的命令不顯示出來,只顯示命令的結果,但是echo off它自己確被顯示出來了,這就是使用@echo off的原因。
3.SETLOCAL/ENDLOCAL
(1). SETLOCAL用來控制批次檔中變數的可見度。就是進階語言常說的局部變數。凡是在SETLOCAL和ENDLOCAL之間的變數都是局部的,以免被其他指令檔改變變數的值,而沒有使用這個標示的都是Global visible(全域變數),很可能被其他檔案所改變。下面的例子很好的說明了這一點。
@echo off setlocal set version=1.0 echo the first version is %version% endlocal echo the second version is %version% ::The follow is global variable set version=2.0 echo the third version is %version% |
執行這個檔案,將輸出: the first version is 1.0 the second version is the third version is 2.0
第二個version是全域變數,但是沒有定義,所以是空值。再次執行: the first version is 1.0 the second version is 2.0 the third version is 2.0
|
@echo off setlocal set version=1.0 echo the first version is %version% endlocal echo the second version is %version% ::The follow is global variable set version=5.0 echo the third version is %version% |
執行第二個檔案: the first version is 1.0 the second version is 2.0 the third version is 5.0
再次執行: the first version is 1.0 the second version is 5.0 the third version is 5.0
|
由此可見變數的範圍在簡單的批次檔還是很謹慎,否則可以造成千變萬化的結果,這樣這個指令碼就很不穩定了。所以,變數範圍很重要,得注意。
(2). EnableDelayedExpansion. (參考百度:http://baike.baidu.com/view/2923132.htm )
代碼 |
結果 |
@echo off setlocal set var=test & echo show %var% endlocal |
show 當解析到%var%是,CMD還沒有執行完任何語句,所以系統並不認識這個變數,所以認為變數沒有定義,所以顯示空值。 |
@echo off Setlocal ENABLEDELAYEDEXPANSION set var=test & echo show !var! endlocal |
show test 使用了變數延遲擴充,並使用!var!,其實在執行的時候也不認識這個變數,但是這條語句執行完以後,仍然返回去賦值。這種事後處理,就是變數延遲擴充。 |
For語句看起來寫了很多行,其實認為是一條語句。所以如果在沒有使用變數延遲擴充的時候,在For語句裡的每一行,都只是記憶著系統所記憶的東西。而使用了變數延遲擴充之後,會執行完了整條語句,再“事後處理”給與賦值,然後才顯示到控制台。下面的例子很能說明問題。 |
@echo off setlocal :: count to 5 set _tst=0 FOR /l %%G in (1,1,5) Do (echo [%_tst%] & set /a _tst+=1) echo Total = %_tst% |
[0] [0] [0] [0] [0] Total = 5 |
@echo off setlocal :: count to 5 set _tst=0 FOR /l %%G in (1,1,5) Do (echo [!_tst!] & set /a _tst+=1) echo Total = !_tst! |
[0] [1] [2] [3] [4] Total = 5 |
|
|
|
在CMD裡面,系統使用“^”作為脫字元。使用變數延遲擴充ENABLEDELAYEDEXPANSION之後,脫字元^ 就可以一直產生作用,而不再局限於一個命令列。這樣對於處理包含HTML和XML格式的字元的時候,就方便多了。請看下面的例子。
@echo off
REM 這個檔案會建立World.txt到本地磁碟,檔案內容為Hello。
REM 也就是第二次啟動並執行時候,脫字元沒有發揮作用。
SETLOCAL
Set _html= Hello^>World.txt
Echo %_html%
ENDLOCAL
@echo off
REM 這個檔案會輸出Hello>World.txt,脫字元一直產生作用。
SETLOCAL EnableDelayedExpansion
Set _html= Hello^>World.txt
Echo !_html!
ENDLOCAL
@echo off
REM 使用變數延遲擴充來處理html語句。
SETLOCAL EnableDelayedExpansion
Set _html=html format: ^<title^>Hello world^</title^>
Echo !_html!
ENDLOCAL
(3). DISABLEEXTENSIONS.
值得注意的是,這裡的擴充不是副檔名,而是命令的擴充功能,比如 “/F” 參數就是For迴圈的命令擴充。
只有使用了命令擴充我們才能執行下面的語句。
FOR /F "DELIMS=" %%a IN (test.TXT) DO @echo %%a
否則我們要輸出一個檔案,只能使用Type test.txt了。命令擴充預設是開啟的。
4.Set
(1). SET 不帶任何參數: 將顯示目前使用者的所有系統內容變數。(set)
(2). SET 帶一個變數名: 嘗試搜尋並顯示以這個變數名開頭的環境變數。(set PROCESSOR就會顯示以PROCESSOR開始的變數)
(3). SET variable=string: 給一個變數賦值。
(4). SET “”: 使用一對空的雙引號,會顯示一個不帶參數的情況下沒顯示出來的變數。我這裡就顯示下面兩個奇怪的變數。
=C:=C:\Users\Lingli
=E:=E:\Powershell
使用cd %=C:%還真可以轉到C:\Users\Lingli目錄下。
(5). SET “var=”(or SET var=): 刪除一個變數。
(6). SET /A variable=expression: 使用算數運算子來給變數賦值。
() - 組合
! ~ - - 一元操作符
* / % - 算數運算子
+ - -算數運算子
<< >> - 邏輯位移
& - 位與
^ - 位異或
| - 位或
= *= /= %= += -= - 賦值
&= ^= |= <<= >>=
(7). SET /P variable=[提示字元]:提示使用者輸入並把輸入的值賦給variable。提示字元可以為空白。有時可以使用CHOICE來代替SET /P.
@echo off
setlocal
set /p version=Please enter the QQ version:
echo you will install QQ %version%
endlocal
(8). 有用的環境變數。
%CD% - 當前路徑名。
%DATE% - 當前日期。
%TIME% - 目前時間。
%RANDOM% - 顯示0 到32767之間的一個隨機數。你看CMD也是可以擷取隨機數的。
5.Choice
(1). 詳細文法:
CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text] 該命令可以提供使用者一個挑選清單,並使用ERRORLEVEL參數返回使用者選擇項的序號。第一項對於1,第二項對應 2,依次類推,如果使用者按CTRL+C退出而不選擇,就返回0。 |
/C choices /N /CS /T timeout /D choice /M text |
用字母列出所提供的選項,預設是"YN",即是和否。 隱藏挑選清單。如果使用這個選項,那麼提示的文字裡最後寫清楚以下。不推薦使用。 啟用大小寫敏感。預設是對大小寫不敏感。 選擇逾時設定。 逾時後的預設選項。 提示字元。最好把要選擇的問題將清楚。 |
(2). 例子:
@echo off
SETLOCAL
CHOICE /C ABC /M "選擇登陸使用者:A - 管理員;B 域使用者;C註冊使用者"
IF %errorlevel%==1 goto :Admin
IF %errorlevel%==2 goto :Domain
IF %errorlevel%==3 goto :Local
goto Exit
:Admin
echo 歡迎管理員
goto Exit
:Domain
echo 歡迎域使用者
goto Exit
:Local
echo 歡迎註冊使用者
goto Exit
:Exit
endlocal
6.Rem and Arguments.
(1). REM [comment]: 批次檔的注釋符,可以使用“::” 來代替REM。
(2). 參數。
%0對應檔案名稱本身,其他分別對應一個參數值,支援255個參數。
Test.cmd |
1 |
2 |
3 |
… |
n |
… |
255 |
%0 |
%1 |
%2 |
%3 |
… |
%n |
… |
%255 |
(3). 檔案名稱參數擴充。
當使用檔案名稱作參數的時候,可以使用如下檔案名稱擴充。下面的例子擴充%1,其實對所有的參數都可以進行類似的擴充。
%~f1 - 擴充%1 為帶路徑的全名。
%~d1 - 只顯示磁碟名稱。
%~p1 - 只顯示檔案路徑。
%~n1 - 只顯示檔案名稱,不包括尾碼名,也不包括路徑。
%~x1 - 只顯示尾碼名。
%~s1 - 變成短檔案名稱,將包含“~”符號。
%~1 - 有時候檔案名稱包含空格是,會對檔案名稱加雙引號。這個功能是去掉雙引號。
%~a1 - 顯示檔案的屬性。
%~t1 - 顯示檔案的修改時間。
%~z1 - 顯示檔案的大小。
上面的擴充是可以組合的:
%~dp1 - 擴充%1 為磁碟名稱和路徑名。
%~nx2 - 擴充%2 為檔案名稱和檔案尾碼名。
::Test.bat
::Example: test.bat test.bat
@echo off
setlocal
set fn=%~f1
echo %fn%
endlocal
7.IF 語句
(1). 詳細文法:
File syntax
IF [NOT] EXIST filename command
IF [NOT] EXIST filename (command) ELSE (command)
String syntax
IF [/I] [NOT] item1==item2 command
IF [/I] item1 compare-op item2 command
IF [/I] item1 compare-op item2 (command) ELSE (command)
Error Check Syntax
IF [NOT] DEFINED variable command
IF [NOT] ERRORLEVEL number command
IF CMDEXTVERSION number command
Key
/I : 比較時不考慮檔案名稱大小寫,即大小寫不敏感。
compare-op : 邏輯比較
EQU : equal 等於
NEQ : not equal 不等於
LSS : less than 小於
LEQ : less than or equal小於或等於
GTR : greater than 大於
GEQ : greater than or equal大於或等於
(2). 例子(可以看出If語句也是一條語句)
IF EXIST filename (del filename) ELSE ( echo The file was not found.)
IF EXIST filename (
del filename
) ELSE (
echo The file was not found.
)
8.For 迴圈
(1). 詳細文法:
FOR-Files
FOR %%parameter IN (set) DO command
FOR-Files-Rooted at Path
FOR /R [[drive:]path] %%parameter IN (set) DO command
FOR-Folders
FOR /D %%parameter IN (folder_set) DO command
FOR-List of numbers
FOR /L %%parameter IN (start,step,end) DO command
FOR-File contents
FOR /F ["options"] %%parameter IN (filenameset) DO command
FOR /F ["options"] %%parameter IN ("Text string to process") DO command
FOR-Command Results
FOR /F ["options"] %%parameter IN ('command to process') DO command
eol=c - 行首注釋符。如果有這個注釋符,這一行不做處理。
skip=n - 制定前n行跳過,不處理
delims=xxx - 分隔字元集合。預設分隔符號是空格和Tab。
tokens=x,y,m-n - 選擇哪一塊用於迴圈操作。
usebackq - 當檔案名稱有空格需要使用雙引號時,使用usebackq把雙引號內的東西當檔案處理,否則當字串處理。
注意:
在批次檔中,參數使用%%parameter,而當你拿到命令列使用的時候,使用%parameter,就是一個百分比符號的區別。同時變數名區分大小寫,所以%g和G是不相同的。
(set) 說明是檔案集合,一個檔案或多個檔案,還可以對檔案名稱使用萬用字元。
(2). 例子:
@echo off
setlocal
for %%G in (*.bat *.txt) do echo %%G
endlocal
9.net.
(1). 管理服務: Net start, stop, pause, continue [service]。
(2). 串連到一個共用檔案:Net use。
NET USE [磁碟名:] \\共用名稱[\子目錄名] [密碼] [/USER:[網域名稱\]使用者名稱]
NET USE磁碟名:]: /delete
(3). Net share: 顯示本地的所有共用,包括隱藏的共用。
(4). Net share ShareName: 顯示共用的相關資訊。
(5). 建立一個本地共用: NET SHARE sharename=drive:path /REMARK:"text" [/CACHE:Manual | Automatic | No ]
(6). 修改使用者數量限制和標示。
NET SHARE sharename /USERS:number /REMARK:"text"
NET SHARE sharename /UNLIMITED /REMARK:"text"
(7). 刪除共用: NET SHARE {sharename | devicename | drive:path} /DELETE
(8). Net view \\電腦名稱: 列出遠程機器的所有共用。
(9). Net localgroup: 把一個賬戶加入一個本機群組,如加入Administrator 群組:net localgroup administrators DomainName\UserName /add
(10). 機器重新命名: netdomrenamecomputer 原機器名 /newname:修改後的機器名 /UserD:user /PasswordD:password
(11). 加入域: net dom join 電腦名稱/domain:網域名稱 /UserD:網域系統管理員賬戶 /PasswordD:網域系統管理員密碼