BAT CMD 批次檔指令碼總結

來源:互聯網
上載者:User

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:網域系統管理員密碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.