Windows 批處理

第一章 批處理基礎

第一節 經常使用批處理內部命令簡介

批處理定義:顧名思義,批處理文件是將一系列命令按必定的順序集合爲一個可執行的文本文件,其擴展名爲 BAT 或者 CMD。這些命令統稱批處理命令。express

小知識:能夠在鍵盤上按下 Ctrl+C 組合鍵來強行終止一個批處理的執行過程。瞭解了大概意思後,咱們正式開始學習.先看一個簡單的例子!編程

@echo off
echo "歡迎來到很是 BAT!"
pause

​把上面的 3 條命令保存爲文件 test.bat 或者 test.cmd 而後執行,他就會在屏幕上顯示如下二行話:windows

歡迎來到很是 BAT!
請按任意鍵繼續. . .

這就是一個簡單批處理文件了,這個批處理文件一共就用了 2 條命令 "echo" 和"pause" 還有一個特殊符號"@"從上面這個簡單的批處理中,咱們能夠發現其實批處理就是運用一些含有特殊意義的符號和一些完成指定功能的命令組合而成,那麼在批處理中有多少這樣的特殊符號和功能命令呢?咱們如今就來仔細瞭解一下一些最經常使用的!網絡

批處理的常見命令(未列舉的命令還比較多,請查閱幫助信息)app

  1. REM 和 ::
  2. ECHO 和 @
  3. PAUSE
  4. ERRORLEVEL
  5. TITLE
  6. COLOR
  7. mode
  8. GOTO 和 :
  9. FIND
  10. START
  11. assoc 和 ftype
  12. pushd 和 popd
  13. CALL
  14. shift
  15. IF
  16. setlocal 與 變量延遲

介紹命令學習

一、REM 和 ::

REM 爲註釋命令,通常用來給程序加上註解,該命令後的內容不被執行,但能回顯。其次, :: 也能夠起到 rem 的註釋做用, 並且更簡潔有效; 但有兩點須要注意:測試

第一, 任何以冒號:開頭的字符行, 在批處理中都被視做標號, 而直接忽略其後的全部內容。有效標號:冒號後緊跟一個以字母數字開頭的字符串,goto 語句能夠識別。無效標號:冒號後緊跟一個非字母數字的一個特殊符號,goto 沒法識別的標號,能夠起到註釋做用,因此 :: 常被用做註釋符號,其實 :+ 也可起註釋做用。spa

第二, 與 rem 不一樣的是, :: 後的字符行在執行時不會回顯, 不管是否用 echo on 打開命令行回顯狀態, 由於命令解釋器不認爲他是一個有效的命令行, 就此點來看, rem 在某些場合下將比 :: 更爲適用; 另外, rem 能夠用於 config.sys 文件中。操作系統

二、ECHO 和 @

打開回顯或關閉回顯功能,或顯示消息。若是沒有任何參數, echo 命令將顯示當前回顯設置。@字符放在命令前將關閉該命令回顯,不管此時 echo 是否爲打開狀態。命令行

語法:

echo [{ on|off }] [message]

echo. 此用法將顯示一空行,至關於回車,很是有用。

執行 echo off 將關閉回顯,它後面的全部命令都不顯示命令自己,只顯示執行後的結果,除非執行 echo on 命令。

執行@echo off 不但關閉之後命令的回顯,連 echo off 命令自己也不顯示了。

一般以@echo off 做爲批處理程序的首行。

通常用 ECHO MESSAGE 來顯示一個特定的消息。

例:

@Echo off 
Echo hello
Pause

運行顯示:hello

三、PAUSE

中止系統命令的執行並顯示下面的內容。

例:

PAUSE

運行顯示:

請按任意鍵繼續. . .

要顯示其餘提示語,能夠這樣用:

Echo 其餘提示語 & pause > nul

四、errorlevel

程序返回碼

echo %errorlevel%

每一個命令運行結束,能夠用這個命令行格式查看返回碼判斷剛纔的命令是否執行成功。默認值爲 0,通常命令執行出錯會設 errorlevel 爲 1。

五、title

設置 cmd 窗口的標題,例如:

title 新標題

能夠看到 cmd 窗口的標題欄變了。

六、COLOR

設置默認的控制檯前景和背景顏色。語法爲:

COLOR [attr]

attr 指定控制檯輸出的顏色屬性。顏色屬性由兩個十六進制數字指定 -- 第一個爲背景,第二個則爲前景。每一個數字能夠爲如下任何值之一:

0 = 黑色  

1 = 藍色  

2 = 綠色  

3 = 湖藍色

4 = 紅色  

5 = 紫色  

6 = 黃色  

7 = 白色  

8 = 灰色

9 = 淡藍色

A = 淡綠色

B = 淡淺綠色

C = 淡紅色

D = 淡紫色

E = 淡黃色

F = 亮白色

若是沒有給定任何參數,該命令會將顏色還原到 CMD.EXE 啓動時的顏色。這個值來自當前控制檯窗口、/T 開關或DefaultColor 註冊表值。

若是用相同的前景和背景顏色來執行 COLOR 命令,COLOR 命令會將 ERRORLEVEL 設置爲 1。例如:

COLOR fc" 在亮白色上產生亮紅色

七、mode

配置系統設備。

串行口:     MODE COMm[:] [BAUD=b] [PARITY=p] [DATA=d] [STOP=s]

                         [to=on|off] [xon=on|off] [odsr=on|off]

                         [octs=on|off] [dtr=on|off|hs]

                         [rts=on|off|hs|tg] [idsr=on|off]

設備狀態:   MODE [device] [/STATUS]

打印重定向: MODE LPTn[:]=COMm[:]

選定代碼頁: MODE CON[:] CP SELECT=yyy

代碼頁狀態: MODE CON[:] CP [/STATUS]

顯示模式:   MODE CON[:] [COLS=c] [LINES=n]

擊鍵率:     MODE CON[:] [RATE=r DELAY=d]

例:

mode con cols=113 lines=15 & color 9f

此命令設置 DOS 窗口大小:15 行,113 列

八、GOTO 和 :

會點編程的朋友就會知道這GOTO是跳轉的意思。在批處理中容許以「:XXX」來構建一個標號,而後用 GOTO XXX 跳轉到標號:XXX 處,而後執行標號後的命令。

例:

if {%1}=={} goto noparms

if "%2"=="" goto noparms

標籤的名字能夠隨便起,可是最好是有意義的字符串,前加個冒號用來表示這個字符串是標籤,goto 命令就是根據這個冒號(:)來尋找下一步跳到到那裏。

例:

@echo off

:start

set /a var+=1

echo %var%

if %var% leq 3 GOTO start

pause

運行顯示:

1

2

3

4

九、find

在文件中搜索字符串。

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

/V 顯示全部未包含指定字符串的行。

/C 僅顯示包含字符串的行數。

/N 顯示行號。

/I 搜索字符串時忽略大小寫。

/OFF[LINE] 不要跳過具備脫機屬性集的文件。

"string" 指定要搜索的文字串,

[drive:][path]filename

指定要搜索的文件。

若是沒有指定路徑,FIND 將搜索鍵入的或者由另外一命令產生的文字。

Find 常和 type 命令結合使用

Type [drive:][path]filename | find "string" [>tmpfile] #挑選包含 string 的行

Type [drive:][path]filename | find /v "string" #剔除文件中包含 string 的行

Type [drive:][path]filename | find /c #顯示文件行數

以上用法將去除 find 命令自帶的提示語(文件名提示)

例:

@echo off

echo 111 >test.txt

echo 222 >>test.txt

find "111" test.txt

del test.txt

pause

運行顯示以下:

---------- TEST.TXT

111

請按任意鍵繼續. . .

例:

@echo off

echo 111 >test.txt

echo 222 >>test.txt

type test.txt|find "111"

del test.txt

pause

運行顯示以下:

111

請按任意鍵繼續. . .

十、start 命令

批處理中調用外部程序的命令(該外部程序在新窗口中運行,批處理程序繼續往下執行,不理會外部程序的運行情況),若是直接運行外部程序則必須等外部程序完成後才繼續執行剩下的指令。

例:start explorer d:\

調用圖形界面打開 D 盤

十一、assoc 和 ftype

文件關聯

assoc 設置'文件擴展名'關聯,關聯到'文件類型'

ftype 設置'文件類型'關聯,關聯到'執行程序和參數'

當你雙擊一個.txt 文件時,windows 並非根據.txt 直接判斷用 notepad.exe 打開。而是先判斷.txt 屬於 txtfile '文件類型',再調用 txtfile 關聯的命令行 txtfile=%SystemRoot%\system32\NOTEPAD.EXE %1。能夠在"文件夾選項"→"文件類型"裏修改這 2 種關聯。

assoc         #顯示全部'文件擴展名'關聯

assoc .txt    #顯示.txt 表明的'文件類型',結果顯示 .txt=txtfile

assoc .doc    #顯示.doc 表明的'文件類型',結果顯示 .doc=Word.Document.8

assoc .exe    #顯示.exe 表明的'文件類型',結果顯示 .exe=exefile

ftype         #顯示全部'文件類型'關聯

ftype exefile #顯示 exefile 類型關聯的命令行,結果顯示 exefile="%1" %*

assoc .txt=Word.Document.8

設置.txt 爲 word 類型的文檔,能夠看到.txt 文件的圖標都變了

assoc .txt=txtfile

恢復.txt 的正確關聯

ftype exefile="%1" %*

恢復 exefile 的正確關聯

若是該關聯已經被破壞,能夠運行command.com,再輸入這條命令。

十二、pushd 和 popd

切換當前目錄

@echo off

c: & cd\ & md mp3  #在 C:\ 創建 mp3 文件夾

md d:\mp4          #在 D:\ 創建 mp4 文件夾

cd /d d:\mp4       #更改當前目錄爲 d:\mp4

pushd c:\mp3       #保存當前目錄,並切換當前目錄爲 c:\mp3

popd               #恢復當前目錄爲剛纔保存的 d:\mp4

通常用處不大,在當前目錄名不肯定時,會有點幫助。(dos 編程中頗有用)

1三、CALL

在批處理執行過程當中調用另外一個批處理,當另外一個批處理執行完後,再繼續執行原來的批處理。

CALL [drive:][path]filename [batch-parameters]

調用的其它批處理程序。filename 參數必須具備 .bat 或 .cmd 擴展名。

CALL :label arguments

調用本文件內命令段,至關於子程序。被調用的命令段以標籤:label 開頭,而且以命令 goto :eof 結尾。

另外,批腳本文本參數參照(%0、%一、等等)已以下改變:

批腳本里的 %* 指出全部的參數(如 %1 %2 %3 %4 %5 ...)

批參數(%n)的替代已被加強。您可使用如下語法:

%~1  - 刪除引號("),擴充 %1

%~f1 - 將 %1 擴充到一個徹底合格的路徑名

%~d1 - 僅將 %1 擴充到一個驅動器號

%~p1 - 僅將 %1 擴充到一個路徑

%~n1 - 僅將 %1 擴充到一個文件名

%~x1 - 僅將 %1 擴充到一個文件擴展名

%~s1 - 擴充的路徑指含有短名

%~a1 - 將 %1 擴充到文件屬性

%~t1 - 將 %1 擴充到文件的日期/時間

%~z1 - 將 %1 擴充到文件的大小

%~$PATH: 1 - 查找列在 PATH 環境變量的目錄,並將 %1擴充到找到的第一個徹底合格的名稱。若是環境變量名未被定義,或者沒有找到文件,此組合鍵會擴充到空字符串

能夠組合修定符來取得多重結果:

%~dp1 - 將 %1 擴展到驅動器號和路徑

%~nx1 - 將 %1 擴展到文件名和擴展名

%~dp$PATH:1 - 在列在 PATH 環境變量中的目錄裏查找 %1,並擴展到找到的第一個文件的驅動器號和路徑。

%~ftza1 - 將 %1 擴展到相似 DIR 的輸出行。

在上面的例子中,%1 和 PATH 能夠被其餘有效數值替換。

%~ 語法被一個有效參數號碼終止。%~ 修定符不能用在 %* 上。

注意:參數擴充時不理會參數所表明的文件是否真實存在,均以當前目錄進行擴展。

要理解上面的知識,下面的例子很關鍵。例:

@echo off 
Echo 產生一個臨時文件 > tmp.txt
Rem 下行先保存當前目錄,再將 c:\windows 設爲當前目錄
pushd c:\windows
Call :sub tmp.txt
Rem 下行恢復前次的當前目錄
Popd
Call :sub tmp.txt
pause
Del tmp.txt
:sub
Echo 刪除引號: %~1
Echo 擴充到路徑: %~f1
Echo 擴充到一個驅動器號: %~d1
Echo 擴充到一個路徑: %~p1
Echo 擴充到一個文件名: %~n1
Echo 擴充到一個文件擴展名: %~x1
Echo 擴充的路徑指含有短名: %~s1
Echo 擴充到文件屬性: %~a1
Echo 擴充到文件的日期/時間: %~t1
Echo 擴充到文件的大小: %~z1
Echo 擴展到驅動器號和路徑:%~dp1
Echo 擴展到文件名和擴展名:%~nx1
Echo 擴展到相似 DIR 的輸出行:%~ftza1
Echo.
Goto :eof

1四、shift

更改批處理文件中可替換參數的位置。

SHIFT [/n]

若是命令擴展名被啓用,SHIFT 命令支持/n 命令行開關;該命令行開關告訴命令從第 n 個參數開始移位;n 介於零和八之間。例如:

SHIFT /2

會將 %3 移位到 %2,將 %4 移位到 %3,等等;而且不影響 %0 和 %1。

1五、IF

IF 條件判斷語句,語法格式以下:

IF [NOT] ERRORLEVEL number command

IF [NOT] string1==string2 command

IF [NOT] EXIST filename command

下面逐一介紹,更詳細的分析請看後面章節。

(1) IF [NOT] ERRORLEVEL number command

IF ERRORLEVEL 這個句子必須放在某一個命令的後面,執行命令後由 IF ERRORLEVEL 來判斷命令的返回值。

Number 的數字取值範圍 0~255,判斷時值的排列順序應該由大到小。返回的值大於等於指定的值時,條件成立

例:

@echo off

dir c:

rem 退出代碼爲>=1 就跳至標題 1 處執行,>=0 就跳至標題 0 處執行

IF ERRORLEVEL 1 goto 1

IF ERRORLEVEL 0 goto 0

Rem 上面的兩行不可交換位置,不然失敗了也顯示成功。

:0

echo 命令執行成功!

Rem 程序執行完畢跳至標題 exit 處退出

goto exit

:1

echo 命令執行失敗!

Rem 程序執行完畢跳至標題 exit 處退出

goto exit

:exit

pause

運行顯示:

命令執行成功!

(2) IF [NOT] string1==string2 command

string1 和 string2 都爲字符的數據,比較區分大小寫。條件相等後即執行後面的 command

檢測當前變量的值作出判斷,爲了防止字符串中含有空格,可用如下格式

if [NOT] {string1}=={string2} command

if [NOT] [string1]==[string2] command

if [NOT] 「string1」==「string2」 command

這種寫法實際上將括號或引號當成字符串的一部分了,只要等號左右兩邊一致就好了,好比

下面的寫法就不行:

if {string1}==[string2] command

(3) IF [NOT] EXIST filename command

EXIST filename 爲文件或目錄存在的意思

echo off

IF EXIST autoexec.bat echo 文件存在!

IF not EXIST autoexec.bat echo 文件不存在!

這個批處理你們能夠放在 C 盤和 D 盤分別執行,看看效果

1六、setlocal 與 變量延遲

咱們先引入一個例子。

例 1:

@echo off

set a=4

set a=5 & echo %a%

pause

結果:4

爲何是 4 而不是 5 呢?在 echo 以前明明已經把變量 a 的值改爲 5 了?讓咱們先了解一下批處理運行命令的機制:

批處理讀取命令時是按行讀取的(另外,例如 for 命令等,其後用一對圓括號閉合的全部語句也看成一行),在處理以前要完成必要的預處理工做,這其中就包括對該行命令中的變量賦值。咱們如今分析一下例 1,批處理在運行到這句「set a=5 & echo %a%」以前,先把這一句整句讀取並作了預處理——對變量a 賦了值,那麼%a%固然就是 4 了!而爲了可以感知環境變量的動態變化,批處理設計了變量延遲。簡單來講,在讀取了一條完整的語句以後,不當即對該行的變量賦值,而會在某個單條語句執行以前再進行賦值,也就是說「延遲」了對變量的賦值。

那麼如何開啓變量延遲呢?變量延遲又須要注意什麼呢?舉個例子說明一下:

例 2:

@echo off

setlocal enabledelayedexpansion

set a=4

set a=5 & echo !a!

pause

結果:5

解說:啓動了變量延遲,獲得了正確答案。變量延遲的啓動語句是「setlocal enabledelayedexpansion」,而且變量要用一對歎號「!!」括起來。分析一下例 2,首先「setlocal enabledelayedexpansion」開啓變量延遲,而後「set a=4」先給變量 a 賦值爲4,「set a=5 & echo !a!」這句是給變量 a 賦值爲 5 並輸出(因爲啓動了變量延遲,因此批處理可以感知到動態變化,即不是先給該行變量賦值,而是在運行過程當中給變量賦值,所以此時 a 的值就是 5 了)。

再舉一個例子鞏固一下。

例 3:

@echo off

setlocal enabledelayedexpansion

for /l %%i in (1,1,5) do (

set a=%%i

echo !a!

)

pause

結果:

1

2

3

4

5

解說:本例開啓了變量延遲並用「!!」將變量擴起來,所以獲得咱們預期的結果。若是不用變量延遲會出現什麼結果呢?結果是這樣的:

ECHO 處於關閉狀態。

ECHO 處於關閉狀態。

ECHO 處於關閉狀態。

ECHO 處於關閉狀態。

ECHO 處於關閉狀態。

就是說,沒有感知到 for 語句中的動態變化。

第二節 經常使用特殊符號

  1. @ 命令行回顯屏蔽符
  2. % 批處理變量引導符
  3. > 重定向符
  4. >> 重定向符
  5. <、>&、<& 重定向符
  6. | 命令管道符
  7. ^ 轉義字符
  8. & 組合命令
  9. && 組合命令
  10. || 組合命令
  11. "" 字符串界定符
  12. , 逗號
  13. ; 分號
  14. () 括號
  15. ! 感嘆號
  16. 批處理中可能會見到的其它特殊標記符:
    • CR(0D) 命令行結束符
    • Escape(1B) ANSI 轉義字符引導符
    • Space(20) 經常使用的參數界定符
    • Tab(09) ; = 不經常使用的參數界定符
    • + COPY 命令文件鏈接符
    • * ? 文件通配符
    • / 參數開關引導符
    • : 批處理標籤引導符

一、@ 命令行回顯屏蔽符

這個字符在批處理中的意思是關閉當前行的回顯。咱們從前面知道 ECHO OFF 能夠關閉掉整個批處理命令的回顯,但不能關掉 ECHO OFF 這個命令,如今咱們在 ECHO OFF 這個命令前加個@,就能夠達到全部命令均不回顯的要求。

二、% 批處理變量引導符

這個百分號嚴格來講是算不上命令的,它只是批處理中的參數而已(多個%一塊兒使用的狀況除外,之後還將詳細介紹)。

引用變量用%var%,調用程序外部參數用%1 至%9 等等

%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*爲命令行傳遞給批處理的參數

%0 批處理文件自己,包括完整的路徑和擴展名

%1 第一個參數

%9 第九個參數

%* 從第一個參數開始的全部參數

參數%0 具備特殊的功能,能夠調用批處理自身,以達到批處理自己循環的目的,也能夠複製文件自身等等。

例:最簡單的複製文件自身的方法

copy %0 d:\wind.bat

%0 這個有點特殊,有幾層意思,先講%1-%9 的意思.

%1 返回批處理的第一個參數

%2 返回批處理的第二個參數

%3-%9 依此推類

返回批處理參數?到底怎麼個返回法?

咱們看這個例子,把下面的代碼保存爲 test.BAT 而後放到 C 盤下

@echo off

echo %1 %2 %3 %4

echo %1

echo %2

echo %3

echo %4

進入 CMD,輸入 cd c:\

而後輸入 test.bat 我是第一個參數 我是第二個參數 我是第三個參數 我是第四個參數

注意中間的空格,咱們會看到這樣的結果:

我是第一個參數 我是第二個參數 我是第三個參數 我是第四個參數

我是第一個參數

我是第二個參數

我是第三個參數

我是第四個參數

對比下代碼,%1 就是」我是第一個參數」 %2 就是」我是第二個參數」

這些%1 和%9 可讓批處理也能帶參數運行,大大提升批處理功能!

還有一個%* 他只是返回參數而已,不過他是一次返回所有參數的值,不用再一個個的輸入%1 %2 來肯定

例子

@echo off

echo %*

一樣保存爲 test.bat 放到 C 盤

進入 CMD,輸入 cd c:\

而後輸入 test.bat 我是第一個參數 我是第二個參數 我是第三個參數 我是第四個參數

能夠看到他一次把所有參數都顯示出來了。

好如今開始講那個比較特殊的%0

%0 這個不是返回參數的值了,他有兩層意思!

第一層意思:返回批處理所在絕對路徑

例子:

@echo off

echo %0

pause

保存爲 test.BAT 放在桌面運行,會顯示以下結果

"C:\Documents and Settings\Administrator\桌面\test.bat"

他把當前批處理執行的所在路經打印出來了,這就是返回批處理所在絕對路徑的意思

第二層意思:無限循環執行 BAT

例子:

@echo off

net user

%0

保存爲 BAT 執行,他就會無限循環執行 net user 這條命令,直到你手動中止。其實%0 就是第一參數%1 前面那個參數,固然就是批處理文件名(包括路徑)。

三、> 重定向符

輸出重定向命令

這個字符的意思是傳遞而且覆蓋,他所起的做用是將運行的結果傳遞到後面的範圍(後邊能夠是文件,也能夠是默認的系統控制檯)。

在 NT 系列命令行中,重定向的做用範圍由整個命令行轉變爲單個命令語句,受到了命令分隔符&,&&,||和語句塊的制約限制。

好比:

使用命令:echo hello >1.txt 將創建文件 1.txt,內容爲"hello "(注意行尾有一空格)

使用命令:echo hello>1.txt 將創建文件 1.txt,內容爲"hello"(注意行尾沒有空格)

四、>> 重定向符

輸出重定向命令

這個符號的做用和>有點相似,但他們的區別是>>是傳遞並在文件的末尾追加,而>是覆蓋。

用法同上

一樣拿 1.txt 作例子

使用命令:

echo hello > 1.txt

echo world >>1.txt

這時候 1.txt 內容以下:

hello

world

五、<、>&、<& 重定向符

這三個命令也是管道命令,但它們通常不經常使用,你只須要知道一下就能夠了,固然若是想仔細研究的話,能夠本身查一下資料。(本人已查過,網上也查不到相關資料)

<,輸入重定向命令,從文件中讀入命令輸入,而不是從鍵盤中讀入。

@echo off

echo 2005-05-01>temp.txt

date <temp.txt

del temp.txt

這樣就能夠不等待輸入直接修改當前日期

>&,將一個句柄的輸出寫入到另外一個句柄的輸入中。

<&,恰好和>&相反,從一個句柄讀取輸入並將其寫入到另外一個句柄輸出中。

經常使用句柄:0、一、2,未定義句柄:3—9

1>nul 表示禁止輸出正確的信息

2>nul 表示禁止輸出錯誤信息。

其中的 1 與 2 都是表明某個數據流輸入輸出的地址(NT CMD 稱之爲句柄,MSDOS 稱之爲設備)。

句柄 0:標準輸入 stdin,鍵盤輸入

句柄 1:標準輸出 stdout,輸出到命令提示符窗口(console,代碼爲 CON)

句柄 2:標準錯誤 stderr,輸出到命令提示符窗口(console,代碼爲 CON)

其中的 stdin 可被<重定向,stdout 可被>、>>重定向,而 stderr 在 DOS 下不可直接重定向,只有經過 ctty 或其它命令將系統控制權轉交給其它設備的方式,來間接完成。

六、| 命令管道符

格式:第一條命令 | 第二條命令 [| 第三條命令...]

將第一條命令的結果做爲第二條命令的參數來使用。 例如在不使 format 的自動格式化參數時,我是這樣來自動格式化 A 盤的

echo y|format a: /s /q /v:system

用過 format 的都知道,再格盤時要輸入 y 來確認是否格盤,這個命令前加上 echo y 並用|字符來將 echo y 的結果傳給 format 命令,從而達到自動輸入 y 的目的(這條命令有危害性,測試時請慎重)

七、^ 轉義字符

^是對特殊符號<,>,&的前導字符,在命令中他將以上 3 個符號的特殊功能去掉,僅僅只把他們當成符號而不使用他們的特殊意義。

好比

echo test ^>1.txt

結果則是:test > 1.txt

他沒有追加在 1.txt 裏,只是顯示了出來。

另外,此轉義字符還能夠用做續行符號。

舉個簡單的例子:

@echo off

echo 英雄^

是^

好^

男人

pause

不用多說,本身試一下就明白了。

&、&&、||爲組合命令,顧名思義,就是能夠把多個命令組合起來當一個命令來執行。這在批處理腳本里是容許的,並且用的很是普遍。由於批處理認行不認命令數目。

八、& 組合命令

語法:第一條命令 & 第二條命令 [& 第三條命令...]

命令按照從前日後的順序依次執行命令,而無論每一條命令執行執行成功與否。

好比:

dir z:\ & dir y:\ & dir c:\

以上命令會連續顯示 z,y,c 盤的內容,不理會該盤是否存在。

九、&& 組合命令

語法:第一條命令 && 第二條命令 [&& 第三條命令...]

這個命令和上邊的相似按照從前日後的順序依次執行命令,但當一條命令失敗時,後邊的命令也不會執行。

dir z:\ && dir y:\ && dir c:\

十、|| 組合命令

語法:第一條命令 || 第二條命令 [|| 第三條命令...]

這個命令和上邊的相似按照從前日後的順序依次執行命令,但當一條命令失敗後才執行後面的命令,當碰到執行正確的命令後將不執行後面的命令,若是沒有出現正確的命令則一直執行完全部命令。

提示:組合命令和重定向命令一塊兒使用必須注意優先級。管道命令的優先級高於重定向命令,重定向命令的優先級高於組合命令。

問題:把 C 盤和 D 盤的文件和文件夾列出到 a.txt 文件中。你將如何來搞定這道題?

看例:

dir c:\ && dir d:\ > a.txt

仔細研究一下這句執行後的結果,看看是否能達到題目的要求!錯了!這樣執行後 a.txt 裏只有 D 盤的信息!爲何?就由於這裏&&命令和>命令不能同時出現一個句子裏(批處理把一行當作一個句子)!組合命令&&的優先級沒有重定向命令>的優先級高!因此這句在執行時將本行分紅這兩部分:dir c:\和 dir d:\ > a.txt,而並非如你想的這兩部分:dir c:\ && dir d:\ 和> a.txt。要使用組合命令&&達到題目的要求,必須得這麼寫:

dir c:\ > a.txt && dir d:\ >> a.txt

這樣,依據優先級高低,DOS 將把這句話分紅如下兩部分:dir c:\ > a.txt 和 dir d:\ >> a.txt。

固然這裏還能夠利用&命令:

dir c:\ > a.txt & dir d:\ >> a.txt

十一、"" 字符串界定符

雙引號容許在字符串中包含空格,進入一個特殊目錄能夠用以下方法

cd "program files"

cd progra~1

cd pro*

以上三種方法均可以進入 program files 這個目錄

十二、, 逗號

逗號至關於空格,好比」dir,c:\」至關於」」"

1三、; 分號

分號,當命令相同時,能夠將不一樣目標用;來隔離,但執行效果不變,如執行過程當中發生錯誤,則只返回錯誤報告,但程序仍會執行。好比:

dir c:\;d:\;e:\

以上命令至關於

dir c:\

dir d:\

dir e:\

1四、() 括號

小括號在批處理編程中有特殊的做用,左右括號必須成對使用,括號中能夠包括多行命令,這些命令將被當作一個總體,視爲一條命令行。

括號在 for 語句和 if 語句中常見,用來嵌套使用循環或條件語句,其實括號()也能夠單獨使用,請看例子。

例:

命令:echo 1 & echo 2 & echo 3

能夠寫成:

(

echo 1

echo 2

echo 3

)

上面兩種寫法效果同樣,這兩種寫法都被視爲是一條命令行。

注意:這種多條命令被視爲一條命令行時,若是其中有變量,就涉及到變量延遲的問題。

1五、! 感嘆號

沒啥說的,在變量延遲問題中,用來表示變量,即%var%應該表示爲!var!,請看前面的 setlocal命令介紹。

第二章 for 命令詳解

講 FOR 以前,先告訴各位新手朋友,若是你有什麼命令不懂,直接在 CMD 下面輸入name /? 這樣的格式來看系統給出的幫助文件,好比 for /? 就會把 FOR 命令的幫助所有顯示出來!

FOR 這條命令基本上都被用來處理文本,咱們此次除了要說處理文本的做用外還要講他的其餘一些好用的功能!

看看他的基本格式(這裏我引用的是批處理文件中的格式,直接在命令行輸入只須要一個%號)

FOR 參數 %%變量名 IN (相關文件或命令) DO 執行的命令

參數:FOR 有 4 個參數 /d /l /r /f 他們的做用我在下面用例子解釋

%%變量名 :這個變量名能夠是單個的小寫 a-z 或者大寫 A-Z,他們區分大小寫哦~, FOR 會把每一個讀取到的值給他!

相關文件或命令:FOR 要讀取其中的元素而後賦值給變量。

執行的命令:對每一個變量的值要執行什麼操做就寫在這。

看不懂個人這些說明,能夠在 CMD 輸入 for /?看系統提供的幫助! 如今開始講每一個參數的意思。

1、參數 /d

FOR /D %variable IN (set) DO command [command-parameters]

若是集中包含通配符,則指定與目錄名匹配,而不與文件名匹配。

若是 Set (也就是我上面寫的 "相關文件或命令") 包含通配符(* 和 ?),將對與 Set 相匹配的每一個目錄(而不是指定目錄中的文件組)執行指定的 Command。

這個參數主要用於目錄搜索,不會搜索文件,看這樣的例子

@echo off

for /d %i in (c:\*) do echo %i

pause

運行會把 C 盤根目錄下的所有目錄名字打印出來,而文件名字一個也不顯示!

再看一個例子,好比咱們要把當前路徑下文件夾的名字只有 1~3 個字母的打印出來

@echo off

for /d %i in (???) do echo %i

pause

這樣的話,若是你當前目錄下有目錄名字只有 1~3 個字母的,就會顯示出來,沒有就不顯示了。這裏解釋下*號和?號的做用,*號表示匹配 N 個字符,而?號表示匹配一個字符。

@echo off

for /d %i in (window?) do @echo %i

pause

保存到 C 盤下執行,會顯示什麼呢?本身看吧! 顯示:windows。/D 參數只能顯示當前目錄下的目錄名字,這個你們要注意!

2、參數 /R

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

檢查以 [drive:]path 爲根的目錄樹,指向每一個目錄中的FOR 語句。若是在 /R 後沒有指定目錄,則使用當前目錄。若是集僅爲一個單點(.)字符,則枚舉該目錄樹。

遞歸

上面咱們知道,/D 只能顯示當前路徑下的目錄名字,那麼如今這個/R 也是和目錄有關,他能夠把當前或者你指定路徑下的文件名字所有讀取,注意是文件名字,有什麼用看例子!

請注意 2 點:

一、set 中的文件名若是含有通配符(?或*),則列舉/R 參數指定的目錄及其下面的全部子目錄中與 set 相符合的全部文件,沒有相符文件的目錄則不列舉。

二、相反,若是 set 中爲具體文件名,不含通配符,則枚舉該目錄樹(即列舉該目錄及其下面的全部子目錄),而無論 set 中的指定文件是否存在。這與前面所說的單點(.)枚舉目錄樹是一個道理,單點表明當前目錄,也可視爲一個文件。

例:

@echo off

for /r c:\ %i in (*.exe) do echo %i

pause

我們把這個 BAT 保存到 D 盤隨便哪裏而後執行,我會就會看到,他把 C 盤根目錄,和每一個目錄的子目錄下面所有的 EXE 文件都列出來了!!!!

例:

@echo off

for /r %i in (*.exe) do @echo %i

pause

參數不同了吧!這個命令前面沒加那個 C:\也就是搜索路徑,這樣他就會以當前目錄爲搜索路徑,好比你這個 BAT 你把他放在 d:\test 目錄下執行,那麼他就會把 D:\test 目錄和他下面的子目錄的所有 EXE 文件列出來!!!

例:

@echo off

for /r c:\ %i in (boot.ini) do echo %i

pause

運行本例發現枚舉了 c 盤全部目錄,爲了只列舉 boot.ini 存在的目錄,可改爲下面這樣:

@echo off

for /r c:\ %i in (boot.ini) do if exist %i echo %i

pause

用這條命令搜索文件真不錯。。。。。。

3、參數 /L

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)。

使用迭代變量設置起始值 (Start#),而後逐步執行一組範圍的值,直到該值超過所設置的終止值 (End#)。/L 將經過對 Start# 與 End# 進行比較來執行迭代變量。若是 Start# 小於End#,就會執行該命令。若是迭代變量超過 End#,則命令解釋程序退出此循環。還可使用負的 Step# 以遞減數值的方式逐步執行此範圍內的值。例如,(1,1,5) 生成序列 1 2 3 4 5,而 (5,-1,1) 則生成序列 (5 4 3 2 1)。

舉個例子:

@echo off

for /l %i in (1,1,5) do @echo %i

pause

保存執行看效果,他會打印從 1 2 3 4 5 這樣 5 個數字。

(1,1,5)這個參數也就是表示從 1 開始每次加 1 直到 5 終止!

看這個例子:

@echo off

for /l %i in (1,1,5) do start cmd

pause

執行後是否是嚇了一跳,怎麼多了 5 個 CMD 窗口,呵呵!若是把那個 (1,1,5)改爲 (1,1,65535)會有什麼結果,我先告訴你們,會打開 65535 個 CMD 窗口....這麼多你不死機算你強!

固然咱們也能夠把那個 start cmd 改爲 md %i 這樣就會創建指定個目錄了!!!名字爲 1-65535

看完這個被我賦予破壞性質的參數後,咱們來看最後一個參數。

4、參數 /F

迭代及文件解析

使用文件解析來處理命令輸出、字符串及文件內容。使用迭代變量定義要檢查的內容或字符串,並使用各類 options 進一步修改解析方式。使用 options 指定哪些令牌應該做爲迭代變量傳遞。請注意:在沒有使用令牌選項時,/F 將只檢查第一個令牌。

文件解析過程包括讀取輸出、字符串或文件內容,將其分紅獨立的文本行以及再將每行解析成零個或更多個令牌。而後經過設置爲令牌的迭代變量值,調用 for 循環。默認狀況下,/F傳遞每一個文件每一行的第一個空白分隔符號。跳過空行。

詳細的幫助格式爲:

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]

FOR /F ["options"] %variable IN ("string") DO command [command-parameters]

FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

帶引號的字符串"options"包括一個或多個

指定不一樣解析選項的關鍵字。這些關鍵字爲:

eol=c          - 指一個行註釋字符的結尾(就一個)

skip=n         - 指在文件開始時忽略的行數。

delims=xxx     - 指分隔符集。這個替換了空格和跳格鍵的默認分隔符集。

tokens=x,y,m-n - 指每行的哪個符號被傳遞到每一個迭代的 for 自己。這會致使額外變量名稱的分配。m-n格式爲一個範圍。經過 nth 符號指定 mth。若是符號字符串中的最後一個字符星號,那麼額外的變量將在最後一個符號解析以後分配並接受行的保留文本。

usebackq       - 使用後引號(鍵盤上數字 1 左面的那個鍵`)。未使用參數 usebackq 時:file-set 表示文件,但不能含有空格雙引號表示字符串,即"string"單引號表示執行命令,即'command'。使用參數 usebackq 時:file-set 和"file-set"都表示文件當文件路徑或名稱中有空格時,就能夠用雙引號括起來單引號表示字符串,即'string'後引號表示命令執行,即`command`以上是用 for /?命令得到的幫助信息,直接複製過來的。

For 命令例 1:****************************************

@echo off

rem 首先創建臨時文件 test.txt

echo ;註釋行,這是臨時文件,用完刪除 >test.txt

echo 11 段 12 段 13 段 14 段 15 段 16 段 >>test.txt

echo 21 段,22 段,23 段,24 段,25 段,26 段 >>test.txt

echo 31 段-32 段-33 段-34 段-35 段-36 段 >>test.txt

FOR /F "eol=; tokens=1,3,* delims=,- " %%i in (test.txt) do echo %%i %%j %%k

Pause

Del test.txt

運行顯示結果:

11 段 13 段 14 段 15 段 16 段

21 段 23 段 24 段,25 段,26 段

31 段 33 段 34 段-35 段-36 段

請按任意鍵繼續. . .

爲何會這樣? 我來解釋:

eol=; 分號開頭的行爲註釋行

tokens=1,3* 將每行第 1 段,第 3 段和剩餘字段分別賦予變量%%i,%%j,%%k

delims=,- (減號後有一空格)以逗號減號和空格爲分隔符,空格必須放在最後

For 命令例 2:****************************************

@echo off

FOR /F "eol= delims=" %%i in (test.txt) do echo %%i

Pause

運行將顯示 test.txt 所有內容,包括註釋行,不解釋了哈。

For 命令例 3:****************************************

另外/F 參數還能夠以輸出命令的結果看這個例子

@echo off

FOR /F "delims=" %%i in ('net user') do @echo %%i

pause

這樣你本機所有賬號名字就出來了把擴號內的內容用兩個單引號引發來就表示那個當命令執行,FOR 會返回命令的每行結果,加那個"delims=" 是爲了讓含有空格的行能整行顯示出來,不加就只顯示空格左邊一列!

第三章 FOR 命令中的變量

FOR 命令中有一些變量,他們的用法許多新手朋友還不太瞭解,今天給你們講解他們的用法!

先把 FOR 的變量所有列出來:

~I - 刪除任何引號("),擴展 %I

%~fI - 將 %I 擴展到一個徹底合格的路徑名

%~dI - 僅將 %I 擴展到一個驅動器號

%~pI - 僅將 %I 擴展到一個路徑

%~nI - 僅將 %I 擴展到一個文件名

%~xI - 僅將 %I 擴展到一個文件擴展名

%~sI - 擴展的路徑只含有短名

%~aI - 將 %I 擴展到文件的文件屬性

%~tI - 將 %I 擴展到文件的日期/時間

%~zI - 將 %I 擴展到文件的大小

%~$PATH:I - 查找列在路徑環境變量的目錄,並將 %I 擴展到找到的第一個徹底合格的名稱。若是環境變量名未被定義,或者沒有找到文件,此組合鍵會擴展到空字符串

咱們能夠看到每行都有一個大寫字母"I",這個 I 其實就是咱們在 FOR 帶入的變量,咱們 FOR語句代入的變量名是什麼,這裏就寫什麼。

好比:FOR /F %%z IN ('set') DO @echo %%z

這裏咱們代入的變量名是 z 那麼咱們就要把那個 I 改爲 z,例如%~fI 改成%~fz,至於前面的%~p 這樣的內容就是語法了!

1、 ~I

刪除任何引號("),擴展 %I

這個變量的做用就如他的說明,刪除引號!

咱們來看這個例子:

首先創建臨時文件temp.txt,內容以下

"1111

"2222"

3333"

"4444"44

"55"55"55

可創建個 BAT 文件代碼以下:

@echo off

echo ^"1111>temp.txt

echo "2222">>temp.txt

echo 3333^">>temp.txt

echo "4444"44>>temp.txt

echo ^"55"55"55>>temp.txt

rem 上面創建臨時文件,注意不成對的引號要加轉義字符^,重定向符號前不要留空格

FOR /F "delims=" %%i IN (temp.txt) DO echo %%~i

pause

del temp.txt

執行後,咱們看 CMD 的回顯以下:

1111 #字符串前的引號被刪除了

2222 #字符串首尾的引號都被刪除了

3333" #字符串前無引號,後面的引號保留

4444"44 #字符串前面的引號刪除了,而中間的引號保留

55"55"55 #字符串前面的引號刪除了,而中間的引號保留

請按任意鍵繼續. . .

和以前 temp.txt 中的內容對比一下,咱們會發現第 一、二、5 行的引號都消失了,這就是刪除引號~i 的做用了!

刪除引號規則以下:

一、若字符串首尾同時存在引號,則刪除首尾的引號;

二、若字符串尾不存在引號,則刪除字符串首的引號;

三、若是字符串中間存在引號,或者只在尾部存在引號,則不刪除。

2、 %~fI

將 %I 擴展到一個徹底合格的路徑名

看例子:

把代碼保存放在隨便哪一個地方,我這裏就放桌面吧.

FOR /F "delims==" %i IN ('dir /b') DO @echo %~fi

pause

執行後顯示內容以下

C:\Documents and Settings\Administrator\桌面\test.bat

C:\Documents and Settings\Administrator\桌面\test.vbs

當我把代碼中的 %~fi 直接改爲%i

FOR /F "delims==" %i IN ('dir /b') DO @echo %i

pause

執行後就會顯示如下內容:

test.bat

test.vbs

經過對比,咱們很容易就看出沒有路徑了,這就是"將 %I 擴展到一個徹底合格的路徑名"的做用。也就是若是%i變量的內容是一個文件名的話,他就會把這個文件所在的絕對路徑打印出來,而不僅單單打印一個文件名。

3、 %~dI

僅將 %I 擴展到一個驅動器號,看例子:

代碼以下,我仍是放到桌面執行!

FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~di

pause

執行後我 CMD 裏顯示以下

C:

C:

我桌面就兩個文件 test.bat,test.vbs,%%~di 做用是,若是變量%%i的內容是一個文件或者目錄名,他就會把他這文件或者目錄所在的盤符號打印出來!

4、 %~pI

僅將 %I 擴展到一個路徑。這個用法和上面同樣,他只打印路徑不打印文件名字

FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~pi

pause

5、 %~nI

僅將 %I 擴展到文件名,例如:

FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ni

pause

6、 %~xI

僅將 %I 擴展到一個文件擴展名,只打印文件的擴展名:

FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~xi

pause

7、 %~sI

擴展的路徑只含有短名,打印絕對短文件名(例如:program files的絕對短文件名爲pro~1)

FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~si

pause

8、 %~aI

將 %I 擴展到文件的文件屬性,打印文件的屬性

FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ai

pause

9、 %~tI

將 %I 擴展到文件的日期/時間,打印文件創建的日期

FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ti

pause

10、 %~zI

將 %I 擴展到文件的大小,打印文件的大小

FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~zi

pause

上面例子中的"delims=="能夠改成"delims=",即不要分隔符。

11、 %~$PATH:I

查找列在路徑環境變量的目錄,並將 %I 擴展到找到的第一個徹底合格的名稱。若是環境變量名未被定義,或者沒有找到文件,此組合鍵會擴展到空字符串。

@echo off

FOR /F "delims=" %%i IN (「notepad.exe」) DO echo %%~$PATH:i

pause

而後把這些代碼保存爲批處理,放在桌面。

上面代碼顯示結果爲 C:\WINDOWS\system32\notepad.exe

他的意思就在 PATH 變量裏指定的路徑裏搜索 notepad.exe 文件,若是有 notepad.exe 則會把他所在絕對路徑打印出來,沒有就打印一個錯誤!

好了,FOR 的的變量就介紹到這了!

第四章 批處理中的變量

批處理中的變量,我把他分爲兩類,分別爲"系統變量"和"自定義變量"。咱們如今來詳解這兩個變量!

1、系統變量

他們的值由系統將其根據事先定義的條件自動賦值,也就是這些變量系統已經給他們定義了值,不須要咱們來給他賦值,咱們只須要調用而以! 我把他們所有列出來!

%ALLUSERSPROFILE% 本地 返回「全部用戶」配置文件的位置。
%APPDATA% 本地 返回默認狀況下應用程序存儲數據的位置。
%CD% 本地 返回當前目錄字符串。
%CMDCMDLINE% 本地 返回用來啓動當前的 Cmd.exe 的準確命令行。
%CMDEXTVERSION% 系統 返回當前的「命令處理程序擴展」的版本號。
%COMPUTERNAME% 系統 返回計算機的名稱。
%COMSPEC% 系統 返回命令行解釋器可執行程序的準確路徑。
%DATE% 系統 返回當前日期。使用與 date /t 命令相同的格式。由 Cmd.exe 生成。有關date 命令的詳細信息,請參閱 Date。
%ERRORLEVEL% 系統 返回上一條命令的錯誤代碼。一般用非零值表示錯誤。
%HOMEDRIVE% 系統 返回鏈接到用戶主目錄的本地工做站驅動器號。基於主目錄值而設置。用戶主目錄是在「本地用戶和組」中指定的。
%HOMEPATH% 系統 返回用戶主目錄的完整路徑。基於主目錄值而設置。用戶主目錄是在「本地用戶和組」中指定的。
%HOMESHARE% 系統 返回用戶的共享主目錄的網絡路徑。基於主目錄值而設置。用戶主目錄是在「本地用戶和組」中指定的。
%LOGONSERVER% 本地 返回驗證當前登陸會話的域控制器的名稱。
%NUMBER_OF_PROCESSORS% 系統 指定安裝在計算機上的處理器的數目。
%OS% 系統 返回操做系統名稱。Windows 2000 顯示其操做系統爲 Windows_NT。
%PATH% 系統 指定可執行文件的搜索路徑。
%PATHEXT% 系統 返回操做系統認爲可執行的文件擴展名的列表。
%PROCESSOR_ARCHITECTURE% 系統 返回處理器的芯片體系結構。值:x86 或 IA64基於Itanium
%PROCESSOR_IDENTFIER% 系統 返回處理器說明。
%PROCESSOR_LEVEL% 系統 返回計算機上安裝的處理器的型號。
%PROCESSOR_REVISION% 系統 返回處理器的版本號。
%PROMPT% 本地 返回當前解釋程序的命令提示符設置。由 Cmd.exe 生成。
%RANDOM% 系統 返回 0 到 32767 之間的任意十進制數字。由 Cmd.exe 生成。
%SYSTEMDRIVE% 系統 返回包含 Windows server operating system 根目錄(即系統根目錄)的驅動器。
%SYSTEMROOT% 系統 返回 Windows server operating system 根目錄的位置。
%TEMP%/%TMP% 系統/用戶 返回對當前登陸用戶可用的應用程序所使用的默認臨時目錄。有些應用程序須要 TEMP,而其餘應用程序則須要 TMP。
%TIME% 系統 返回當前時間。使用與 time /t 命令相同的格式。由 Cmd.exe 生成。有關time 命令的詳細信息,請參閱 Time。
%USERDOMAIN% 本地 返回包含用戶賬戶的域的名稱。
%USERNAME% 本地 返回當前登陸的用戶的名稱。
%USERPROFILE% 本地 返回當前用戶的配置文件的位置。
%WINDIR% 系統 返回操做系統目錄的位置。

這麼多系統變量,咱們如何知道他的值是什麼呢? 在 CMD 裏輸入 echo %WINDIR%,這樣就能顯示一個變量的值了!

舉個實際例子,好比咱們要複製文件到當前賬號的啓動目錄裏就能夠這樣

copy d:\1.bat "%USERPROFILE%\「開始」菜單\程序\啓動\"

%USERNAME% 本地 返回當前登陸的用戶的名稱。 注意有空格的目錄要用引號引發來。

另外還有一些系統變量表明一個意思或者一個操做! 他們分別是%0 %1 %2 %3 %4 %5 ......一直到%9 還有一個%* ,詳見第一章第二節。

另外還有一些變量,他們也表示一些功能,FOR 命令中的那些就是,FOR 變量已經說過,就不講了。

2、自定義變量

顧名思義,自定義變量就是由咱們來給他賦予值的變量

要使用自定義變量就得使用 set 命令了,看例子.

@echo off

set var=我是值

echo %var%

pause

保存爲 BAT 執行,咱們會看到 CMD 裏返回一個 "我是值"。var 爲變量名,=號右變的是要給變量的值。

這就是最簡單的一種設置變量的方法了。若是咱們想讓用戶手工輸入變量的值,而不是在代碼裏指定,能夠用用 set 命令的/p 參數

例子:

@echo off

set /p var=請輸入變量的值

echo %var%

pause

var 變量名 =號右邊的是提示語,不是變量的值

變量的值由咱們運行後本身用鍵盤輸入!

第五章 set 命令詳解

在上一章中我簡單的介紹了一下 SET 設置自定義變量的做用,如今我來具體講一下 set 的其餘功能。

1、用 set 命令設置自定義變量

顯示、設置或刪除 cmd.exe 環境變量。

SET [variable=[string]]

variable 指定環境變量名。

string 指定要指派給變量的一系列字符串。

要顯示當前環境變量,鍵入不帶參數的 SET。

SET 命令不容許變量名含有等號。

例子:

@echo off

set var=我是值

echo %var%

pause

請看 「set var=我是值 「,這就是 BAT 直接在批處理中設置變量的方法。set 是命令,var 是變量名,等號右邊的"我是值"是變量的值。咱們要在批處理中引用這個變量就把 var 變量名用兩個%(百分號)擴起來,如%var%。

SET 還能夠提供一個交互界面,讓用戶本身輸入變量的值,而後咱們在來根據這個值來作相應操做,如今我就來講說 SET 的這種語法,只須要加一個"/P"參數就能夠了!

SET /P variable=[promptString]

例子:

@echo off

set /p var=請輸入變量的值:

echo 您輸入了 %var% ~_~

pause

set /p 是命令語法 var 是變量名 =號右邊的"請輸入變量的值: ",這個是提示語,不是變量的值了!

運行後,咱們在提示語後面直接輸入 1,就會顯示一行:您輸入了 1 ~_~。

好了,先回顧到這,如今講 SET 其餘功能。

使用 set /?查看 SET 的幫助咱們發現 SET 除了我上面講的

SET [variable=[string]]

SET /P variable=[promptString]

這兩種語法外,還有以下幾種語法:

SET /A expression

環境變量替換已以下加強:

%PATH:str1=str2%

%PATH:~10,5%

%PATH:~-10%

%PATH:~0,-2%

這機種語法有什麼用處呢?下面咱們來一個個講解他們!

2、用 set 命令進行整數運算

語法:SET /A expression

/A 命令行開關指定等號右邊的字符串爲被評估的數字表達式。該表達式評估器很簡單並以遞減的優先權順序支持下列操做:

() 分組
! ~ 一元運算符
* / % 算術運算符
+ - 算術運算符
<< >> 二進制邏輯移位
& 二進制按位「與」
^ 二進制按位「異」
| 二進制按位「或」
= *= /= %= += = 算術賦值
&= ^= |= <<= >>= 二進制運算賦值
, 表達式分隔符

簡單解釋一下:

set 的/A 參數就是讓 SET 能夠支持數學符號進行加減等一些數學運算!

如今開始舉例子介紹這些數學符號的用法:

例:

@echo off

set /p input=請輸入計算表達式:

set /a var=%input%

echo 計算結果:%input%=%var%

pause

請看下面幾個運算過程:

注意:DOS 的算術運算只能精確到 32 位整數,有效值範圍是-2147483647 至 2147483647,超出該數值範圍時計算出錯。

請輸入計算表達式:1+9+20+30-10

計算結果:1+9+20+30-10=50

請按任意鍵繼續. . .

請輸入計算表達式:10/3

計算結果:10/3=3 #DOS 計算精確到整數,小數舍了。

請按任意鍵繼續. . .

請輸入計算表達式:-100+62

計算結果:-100+62=-38

請按任意鍵繼續. . .

請輸入計算表達式:100%3 #求餘數

計算結果:100%3=1

請按任意鍵繼續. . .

請輸入計算表達式:(25+75)*2/(15+5)

計算結果:(25+75)*2/(15+5)=10

請按任意鍵繼續. . .

請輸入計算表達式:1234567890*9876543210

無效數字。數字精確度限爲 32 位。

計算結果:1234567890*9876543210=

請按任意鍵繼續. . .

運行 set /a a=1+1,b=2+1,c=3+1 後會顯示一個 4,但咱們用echo %a% %b% %c%後看結果,會發現其餘數學運算也有效果,這就是"逗"號的做用!

有時候咱們須要直接在原變量進行加減操做就能夠用這種語法

set /a var+=1

對應原始語法就是

set /a var = %var% + 1

都是同樣的結果,在原變量的值上在進行數學運算,不過這樣寫簡單一點

再來一個:

set /a var*=2

其餘都這麼用,只要幫助裏有這個語法!

另外還有一些用邏輯或取餘操做符,這些符號按照上面的使用方法會報錯的。好比咱們在 CMD 裏輸入

set /a var=1 & 1

他並不會顯示爲 1,而是報錯,爲何?對於這樣的"邏輯或取餘操做符",咱們須要把他們用雙引號引發來,也能夠用轉義字

符^,看例子

set /a var= 1 "&" 1 這樣結果就顯示出來了,其餘邏輯或取餘操做符用法

set /a var= 1 "+" 1 異運算

set /a var= 1 "%" 1 取模運算

set /a var= 3 "<<" 2 左移位運算, 3 的二進制爲 11,左移 2 位爲 1100,換成十進制就是 12,自行驗證

set /a var= 4 ">>" 2 右移位運算,4 的二進制爲 100,右移動 2 位爲 1,結果爲 1

補充:凡是按位計算均需換算成二進制,下面行中的符號均針對二進制

這些符號也能夠用&= ^= |= <<= >>= 這樣的簡單用法以下,注意引號。

set /a var"&=" 1

等於

set /a var = %var% "&" 1

思考題:求 2 的 n 次方

答案:

@echo off

set /p n=請輸入 2 的幾回方:

set /a num=1^<^<n

echo %num%

pause

3、用 set 命令進行字符串處理

一、字符串替換

好了,符號說到這,如今說%PATH:str1=str2%

上面語法的意思就是:將字符串變量%PATH%中的 str1 替換爲 str2

這個是替換變量值的內容,看例子

@echo off 
set a= bbs. verybat. cn
echo 替換前的值: "%a%"
set var=%a: =%
echo 替換後的值: "%var%"
pause

 

運行顯示:

替換前的值: " bbs. verybat. cn"

替換後的值: "bbs.verybat.cn"

對比一下,咱們發現他把變量%a%的空格給替換掉了,從這個例子,咱們就能夠發現%PATH:str1=str2%這個操做就是把變量%PATH%的裏的 str1 所有用 str2 替換。

這就是 set 的替換字符的很好的功能! 替換功能先講到這,下面講字符串截取功能。

二、字符串截取(切片)

**********************************************

截取功能統一語法格式爲:%a:~[m[,n]]%

**********************************************

方括號表示可選,%爲變量標識符,a 爲變量名,不可少,冒號用於分隔變量名和說明部分,符號~能夠簡單理解爲「偏移」便可,m 爲偏移量(缺省爲 0),n 爲截取長度(缺省爲所有)

%PATH:~10,5% 這個什麼意思,看例子:

截取功能例子 1:

@echo off

set a=bbs.verybat.cn

set var=%a:~1,2%

echo %var%

pause

執行後,咱們會發現只顯示了"bs"兩個字母。set 是命令,var 是變量值,a 要進行字符操做的變量,"1"是從變量"a"第幾位開始顯示,"2"表示顯示幾位。合起來就是把變量 a 的值從第 2 位(偏移量 1)開始,把 2 個字符賦予給變量 var。

其餘兩種語法

%PATH:~-10%

%PATH:~0,-2%

他們也是顯示指定變量指定幾位的值的意思

%PATH:~-10% 看例子

截取功能例子 2:

@echo off

set a=bbs.verybat.cn

set var=%a:~-3%

echo %var%

pause

運行結果:.cn

這個就是把變量 a 倒數 3 位的值給變量 VAR

固然咱們也能夠改爲這樣

截取功能例子 3:

@echo off

set a=bbs.verybat.cn

set var=%a:~3%

echo %var%

pause

運行顯示:.verybat.cn

這個就是把變量 a 的從第 3 位開始後面所有的值給變量 VAR

%PATH:~0,-2% 例子

截取功能例子 4:

@echo off

set a=bbs.verybat.cn

set var=%a:~0,-3%

echo %var%

pause

執行後,咱們發現顯示的是"bbs.verybat",少了".cn"。從結果分析,很容易分析出,這是把變量 a 的值從 0 位開始,

到倒數第三位之間的值所有賦予給 var。

若是改爲這樣

截取功能例子 5:

@echo off

set a=bbs.verybat.cn

set var=%a:~2,-3%

echo %var%

pause

運行顯示:s.verybat

那麼他就是顯示從第 3 位(偏移量 2)開始減去倒數三位字符的值,並賦予給變量 var

思考題目:輸入任意字符串,求字符串的長度

參考答案:

@echo off

set /p str=請輸入任意長度的字符串:

echo 你輸入了字符串:"%str%"

if not defined str (pause & goto :eof)

set num=0

:len

set /a num+=1

set str=%str:~1%

if defined str goto len

echo 字符串長度爲:%num%

pause

好了 set 的一些用法,就介紹到這了。

第六章 if 命令講解

在 CMD 使用 IF /?打開 IF 的系統幫助(本身看我就不所有列出來了),咱們會發現 IF 有 3 種基本的用法!

IF [NOT] ERRORLEVEL number command

IF [NOT] string1==string2 command

IF [NOT] EXIST filename command 

ERRORLEVEL number 若是最後運行的程序返回一個大於等於指定數字的整數,條件爲 true。

string1==string2 若是指定的文字字符串匹配,指定條件爲 true。

EXIST filename 若是指定的文件名存在,指定條件爲 true。

command 若是符合條件,指定要執行的命令。

ELSE 子句必須在 IF 以後出如今同一行上。例如:

IF EXIST filename (

del filename

) ELSE (

echo filename missing

)

第一種用法:IF [NOT] ERRORLEVEL number command

這個用法的基本作用是判斷上一條命令執行結果的代碼,以決定下一個步驟.

通常上一條命令的執行結果代碼只有兩結果,"成功"用 0 表示 "失敗"用 1 表示.

舉個例子:

@echo off

net user

IF %ERRORLEVEL% == 0 echo net user 執行成功了!

pause

這是個簡單判斷上條命令是否執行成功。

IF %ERRORLEVEL% == 0 echo net user 執行成功了!

代碼改寫成:

IF ERRORLEVEL 0 echo net user 執行成功了!

用這種語法,無論你的上面的命令是否執行成功,他都會認爲命令成功了。當使用 if errorlevel 0 的句式時,它的含義是:若是錯誤碼的值大於或等於0的時候,將執行某個操做;當使用if %errorlevel%==0……的句式時,它的含義是:若是錯誤碼的值等於0的時候,將執行某操做。

%ERRORLEVEL%這是個系統變量,返回上條命令的執行結果代碼! "成功"用 0 表示 "失敗"用 1 表示。 這只是通常的狀況,實際上,errorlevel 返回值能夠在 0~255 之間,好比,xcopy 默認的errorlevel 值就有 5 個,分別表示 5 種執行狀態:

0 文件複製沒有錯誤。

1 if errorlevel 2 echo。

2 用戶按 CTRL+C 終止了 xcopy。

4 出現了初始化錯誤。沒有足夠的內存或磁盤空間,或命令行上輸入了無效的驅動器名稱或語法。

5 出現了磁盤寫入錯誤。

要判斷上面 xcopy 命令的 5 種退出狀況,應寫成:

if errorlevel 5 echo 出現了磁盤寫入錯誤

if errorlevel 4 echo 出現了初始化錯誤

if errorlevel 2 echo 用戶按 CTRL+C 終止了 xcopy

if errorlevel 1 echo if errorlevel 2 echo

if errorlevel 0 echo 文件複製沒有錯誤。

才能正確執行。

補充完畢。

再舉幾個例子給新手理解

@echo off

net usertest

IF %ERRORLEVEL% == 1 echo net user 執行失敗了!

pause

這個是判斷上一條命令是否執行失敗的

@echo off

set /p var=隨便輸入個命令:

%var%

if %ERRORLEVEL% == 0 goto yes

goto no

:yes

echo !var! 執行成功了

pause

exit

:no

echo 基本上執行失敗了..

pause

這個是根據你輸入的命令,自動判斷是成功仍是失敗了!

再來一個簡化版的

@echo off

set /p var=隨便輸入個命令:

%var%

if %ERRORLEVEL% == 0 (echo %var%執行成功了) ELSE echo %var%執行失敗了!

pause

else 後面寫上執行失敗後的操做!

固然我門還能夠把 if else 這樣的語句分紅幾行寫出來,使他看上去好看點...

@echo off

set /p var=隨便輸入個命令:

%var%

if %ERRORLEVEL% == 0 (

echo !var! 執行成功了

) ELSE (

echo 基本上執行失敗了..

)

pause

第二種用法: IF [NOT] string1==string2 command

這個呢就是用來比較變量或者字符的值是否是相等的.

例子

@echo off

set /p var=請輸入第一個比較字符:

set /p var2=請輸入第二個比較字符:

if %var% == %var2% (echo 咱們相等) ELSE echo 咱們不相等

pause

上面這個例子能夠判斷你輸入的值是否是相等,可是你若是輸入相同的字符,可是若是其中一個後面打了一個空格,這個例子仍是會認爲相等,如何讓有空格的輸入不相等呢?咱們在比較字符上加個雙引號就能夠了.

@echo off

set /p var=請輸入第一個比較字符:

set /p var2=請輸入第二個比較字符(多輸入個空格試試):

if "%var%" == "%var2%" (echo 咱們相等) ELSE echo 咱們不相等

pause

第三種用法:IF [NOT] EXIST filename command

這個就是判斷某個文件或者文件夾是否存在的語法

例子

@echo off

if exist "c:\test" (echo 存在文件) ELSE echo 不存在文件

pause

判斷的文件路徑加引號是爲了防止路徑有空格,若是路徑有空格加個雙引號就不會出現判斷出錯了!

另外咱們看到每條 IF 用法後都有個[NOT]語句,這啥意思?其餘加上他的話,就表示判斷咱們的條件不成立時,沒加他是判斷條件成立時,好比上面這個例子

@echo off

if not exist "c:\test" (echo 不存在文件) ELSE echo 存在文件

pause

第四種用法:IF 加強的用法

IF [/I] string1 compare-op string2 command

IF CMDEXTVERSION number command

IF DEFINED variable command

首先簡單介紹一下後面兩個用法。CMDEXTVERSION 條件的做用跟 ERRORLEVEL 的同樣,除了它是在跟與命令擴展名有關聯的內部版本號比較。第一個版本是 1。每次對命令擴展名有至關大的加強時,版本號會增長一個。命令擴展名被停用時,CMDEXTVERSION 條件不是真的。

DEFINED 條件的做用跟 EXISTS 的同樣,除了它的操做對象是一個變量。若是已定義變量,返回的結果是 true。

IF [/I] string1 compare-op string2 command

這個語句在判斷字符時不區分字符的大小寫。

@echo off

if a == A (echo 咱們相等) ELSE echo 咱們不相等

pause

執行後會顯示:咱們不相等

@echo off

if /i a == A (echo 咱們相等) ELSE echo 咱們不相等

pause

加上/I 不區分大小寫就相等了!

最後面還有一些用來判斷數字的符號

EQU - 等於

NEQ - 不等於

LSS - 小於

LEQ - 小於或等於

GTR - 大於

GEQ - 大於或等於

我就舉一個例子,你們都懂數學...不講多了

@echo off

set /p var=請輸入一個數字:

if %var% LEQ 4 (echo 我小於等於 4) ELSE echo 我不小於等於 4

pause

4、子程序

在批處理程序中能夠調用外部可運行程序,好比 exe 程序,也可調用其餘批處理程序,這些也能夠看做子程序,可是不夠方便,若是被調用的程序不少,就顯得不夠簡明瞭,很繁瑣。

在 windowsXP 中,批處理能夠調用本程序中的一個程序段,至關於子程序,這些子程序通常放在主程序後面。

子程序調用格式:

CALL :label arguments

子程序語法:

:label

command1

command2

...

commandn

goto :eof

傳至子程序的參數在 call 語句中指定,在子程序中用%一、%2 至%9 的形式調用,而子程序返回主程序的數據只需在調用結束後直接引用就能夠了,固然也能夠指定返回變量,請看下面的例子。

子程序例 1:

@echo off

call :sub return 你好

echo 子程序返回值:%return%

pause

:sub

set %1=%2

goto :eof

運行結果:你好

子程序例 2:設計一個求多個整數相加的子程序

@echo off

set sum=0

call :sub sum 10 20 35

echo 數據求和結果:%sum%

pause

:sub

rem 參數 1 爲返回變量名稱

set /a %1=%1+%2

shift /2

if not "%2"=="" goto sub

goto :eof

運行結果:65

9、時間延遲

什麼是時間延遲?顧名思義,就是執行一條命令後延遲一段時間再進行下一條命令。

一、利用 ping 命令延時

例:

@echo off

echo 延時前!

ping /n 3 127.0.0.1 >nul

echo 延時後!

pause

解說:用到了 ping 命令的「/n」參數,表示要發送多少次請求到指定的 ip 。本例中要發送 3次請求到本機的 ip(127.0.0.1)。127.0.0.1 可簡寫爲 127.1。「>nul」就是屏蔽掉 ping 命令所顯示的內容。

二、利用 for 命令延時

例:

@echo off

echo 延時前!

for /l %%i in (1,1,5000) do echo %%i>nul

echo 延時後!

pause

解說:原理很簡單,就是利用一個計次循環並屏蔽它所顯示的內容來達到延時的目的。

路徑中的通配符

? 表明0-9中的一個數字或26個字母中的一個字母

* 表明任意字符(包括零字符)

相關文章
相關標籤/搜索