轉自http://www.cnblogs.com/linglizeng/archive/2010/01/29/Bat-CMD-ChineseVerion.html
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,其實對所有的參數都可以進行類似的擴展。 上面的擴展是可以組合的: %~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: 把一個賬戶加入一個本地組,如加入管理員組:net localgroup administrators DomainName\UserName /add
10. 機器重命名: netdom renamecomputer 原機器名 /newname:修改後的機器名 /UserD:user /PasswordD:password
11. 加入域: net dom join 計算機名/domain:域名 /UserD:域管理員賬戶 /PasswordD:域管理員密碼