程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> BAT CMD批處理文件腳本總結

BAT CMD批處理文件腳本總結

編輯:關於.NET

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: 把一個賬戶加入一個本地組,如加入管理員組:net localgroup administrators DomainName\UserName /add

(10). 機器重命名: netdomrenamecomputer 原機器名 /newname:修改後的機 器名 /UserD:user /PasswordD:password

(11). 加入域: net dom join 計算機名/domain:域名 /UserD:域管理員賬戶 /PasswordD:域管理員密碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved