1. 程式人生 > >批處理特殊符號 萬用字元與轉義符

批處理特殊符號 萬用字元與轉義符

常用特殊符號


1、@命令列回顯遮蔽符
2、%批處理變數引導符
3、> 重定向符
4、>>重定向符
5、<、>、<& 重定向符
6、|命令管道符
7、^轉義字元
8、組合命令
9、& 組合命令
10、||組合命令
11、\"\"字串界定符
12、, 逗號
13、; 分號
14、() 括號
15、! 感嘆號

萬用字元(?和*)

常用來代替未具體指明的檔案和資料。

?代表單個字元。

* 代表全部字元。

轉義符  


用在特殊符號之前,取消特殊字元的作用.
比如:
echo 非常^&批處理 
連字元&在此命令中只當作一個字元顯示到螢幕中
如果不加^ 那麼"批處理"將被當作命令執行

| (管道)傳遞符
當然是傳遞作用,將前面一條命令的執行結果傳遞給後面一條命令繼續執行.
比如:
echo 0123456 | find "123" 
將0123456 傳遞給find 查詢 123

|| 連線符
當前面的命令沒有成功執行 則執行後面的命令 可以作判斷選擇用.
比如:
echo 0123456 | find "789" || echo 字元中沒有789
此命令的意思是在0123456中查詢字元789,如果沒有找到則繼續執行後面的命令,
即在螢幕中顯示"字元中沒有789",如果找到了,也就是如果前面是0123456789的話則停止繼續執行||後面的命令,而是在螢幕中直接顯示"0123456789".

&&  連線符
當前面的命令成功執行 再執行後面的命令
比如:
echo 0123456 | find "123" && echo 字元中含有123
這個命令跟||剛好相反.

& 連線符
無論前面的命令是否成功執行 都執行後面的
比如:
echo 0123456 | find "789" & echo 字元中含有123
雖然沒有成功到789 但還是會執行echo 命令

> 定向符
將輸出的內容重定向到指定(文字中)
比如
echo 123456789>1.txt
輸出字串到1.txt中
如果是 >nul 則是輸出到空裝置中 起遮蔽螢幕輸出的作用
比如
pause>nul  將命令的提示遮蔽掉

>> 定向符(追加)
將輸出內容寫入指定(文字中)
注意,">"將覆蓋文字中原有內容
           ">>" 則是在文字的最後新增內容,
比如
echo 123>1.txt
echo 456>>1.txt
文字中有兩行 分別是 123和456
如果echo 456>1.txt
那麼 原有文字中的123將會替換成456

< 輸入定向符
從指定的(文字)輸入內容
一般用於set /p
比如 
echo 456>1.txt
set /p wind=<1.txt
這樣 1.txt第一行內容就被賦值給wind了
本來set /p 這個命令是用來設定給使用者輸入字元的,但是=後用<1.txt,
意思是從1.txt檔案中讀取資訊給SET /P ,而不需要使用者輸入.


--------------------------------------------------------------------------------------------------------------------------------------------------------

較詳細的一篇

這是一篇針對批處理中常用符號的詳細解釋,每個符號都有解釋及相應的舉例,希望通過比較系統的講述,能讓新手儘快入門。

  在這篇帖子中,我對常用符號的講解做如下限定:
  1、收集批處理中經常用到的符號;
  2、每個常用符號,只講述最常用的功能;深入的用法留待將來介紹;
  這樣限定的原因,一是讓新手系統地接觸最常用符號的常用功能,不至於一開始就陷入技術細節中難以自拔;二是有些符號的用法非常罕見,沒有特定的需求可以忽略掉,比如控制代碼複製符號;三是有些高深的內容本人也沒有完全消化,只解說一鱗半爪難免會誤人子弟,比如 set /a 中的^、!等符號;



  如有遺漏或謬誤,請大家及時跟帖,幫忙修正。
————————————————————————————————————————————

1、@
  一般在它之後緊跟一條命令或一條語句,則此命令或語句本身在執行的時候不會顯示在螢幕上。請把下面的程式碼儲存為test.cmd檔案,然後執行,比較一下兩條echo語句在螢幕上的輸出差異:

  1. echo a
  2. @pause
  3. @echo b
  4. @pause
複製程式碼 執行結果如下:
C:\Documents and Settings\JM\桌面>echo a
a
請按任意鍵繼續...
b
請按任意鍵繼續...


2、%、%%
  百分號用在不同的場合,有不同的含義:

  ① 當百分號成對出現,並且其間包含非特殊字元時,一般做變數引用處理,比如:%var%、%str%。把以下程式碼儲存為批處理檔案,執行後觀察螢幕顯示結果:
  1. @echo off
  2. set str=abc
  3. echo 變數 str 的值是: %str%
  4. pause
複製程式碼 在螢幕上將顯示這樣的結果:
變數 str 的值是: abc
按任意鍵繼續...

  另外,百分號作為變數引用還有一種特殊形式,那就是對形式引數的引用,此時,單個百分號後面緊跟0~9這10個數字,如%0、%1,請看演示程式碼:
  1. @echo off
  2. if defined str goto next
  3. set str=
  4. set /p str=請把檔案拉到本視窗後回車:
  5. call "%~0" %str%
  6. pause
  7. exit
  8. :next
  9. cls
  10. echo 本批處理檔案完整路徑為:"%~0"
  11. echo 拖到本視窗的檔案完整路徑為:"%~1"
  12. goto :eof
複製程式碼 ② 出現在 set /a 語句中時,表示兩數相除取餘數,也就是所謂的模運算,它在命令列視窗和批處理檔案中的寫法略有差異:在命令列視窗中,只需要單個的%,在批處理檔案中,需要連續兩個百分號,寫成%%。
  例如:在命令列視窗中,執行 set /a num=4%2 ,則結果將顯示0,因為4除以2的餘數為0;如果儲存為批處理檔案,則此語句將略有改變:
  1. @echo off
  2. set /a num=4%%2
  3. echo 4除以2的餘數為 %num%
  4. pause
複製程式碼 ③ 轉義符號:如果要顯示%本身時,需要在前面用%來轉義。例如:
  1. @echo off
  2. echo 一個百分號:%%
  3. echo 兩個百分號:%%%%
  4. echo 三個百分號:%%%%%%
  5. pause
複製程式碼 3、:、::
  ① 以:打頭的單個的:表示該行是一個標籤,它之後的內容是一個標籤段,如:test,則表示:test之下的內容是標籤段,而test是這個標籤段的名,可以用 goto test 、goto :test 跳轉到該標籤段或用 call :test 呼叫該子過程;而連續兩個冒號打頭表示該行內容為註釋內容,實際上,:: 是個無效的標籤名,:加上空格同樣可以起到註釋的作用,此時,::的功能和註釋命令rem相同;但是,rem 註釋語句中的某些命令符號如重定向符號和管道符號還是會執行,而如果用::來註釋的時候,與::同處一行的所有命令或符號直接被命令直譯器忽略掉,無形中提高了註釋的相容性和整個程式的執行效率,並且在眾多的命令語句中更顯得醒目,所以,註釋語句推薦使用::的格式。
  ② 在 set 語句中:和~同時使用時,起到擷取字串的功能。假設 set str=abcde,那麼,set var=%str:~0,1% 表示擷取字串abcde的第一個字元;和=同時使用時,起到替換字串的功能。假設:set str=abc:de,那麼,set var=%str:a=1% 則表示把字串abc:de中的a替換為1,set var=%str::=2% 則表示把字串abc:de中的:替換為2;

4、~
  ① 用在 set 語句中,和:同時使用時,起到擷取字串的功能,請參考上一條的解釋;
  ② 用在 set /a 語句中時,它是一元運算子號,表示將運算元字按位取反,例如,set /a num=~1的執行結果是-2,set /a num=~0的結果是-1
  ③ 用在for語句中,表示增強for的功能,能夠提取到更多的資訊。例如:在批處理檔案的for語句中:%%~i表示去掉第一對外側引號,%%~zi表示獲取檔案的大小(以位元組為單位),%%~ni表示獲取檔名,%%~xi表示獲取副檔名(帶點號)……它們可以組合使用,如%%~nxi表示獲取檔名和字尾名。

5、>、>>
  一般而言,>表示用新內容覆蓋原檔案內容,>>表示向原檔案追加內容,此時,它們以重定向符號的身份出現;如果用在 set /a 語句中,則>表示分組,>>表示邏輯移位;

6、|
  一般而言,它以管道符號的身份出現,表示把在它之前的命令或語句的執行結果作為在它之後的命令或語句的處理物件,簡而言之,就是把它之前的輸出作為它之後的輸入,例如:echo abcd|findstr "b",表示把echo abcd的執行結果,作為findstr "b" 的執行物件,也就是在字串abcd中查詢b字元;如果test.txt中有abcd字串,則該語句與 findstr "b" test.txt 具有同樣的效果;

7、^
  一般而言,^以轉義字元的身份出現。因為在cmd環境中,有些字元具備特殊功能,如>、>>表示重定向,|表示管道,&、&&、||表示語句連線……它們都有特定的功能,如果需要把它們作為字元輸出的話,echo >、echo | ……之類的寫法就會出錯——cmd直譯器會把它們作為具有特殊功能的字元對待,而不會作為普通字元處理,這個時候,就需要對這些特殊字元做轉義處理:在每個特殊字元前加上轉義字元^,因此,要輸出這些特殊字元,就需要用 echo ^>、echo ^|、echo ^|^|、echo ^^……之類的格式來處理;

8、&
  一般而言,&表示兩條命令或語句同時執行的意思。如 echo a&echo b,將在螢幕上同時顯示a和b字元。當幾條語句含義近似或作用相同且沒有先後的順序之別時,啟用&符號連線這些語句將會增加程式的可讀性;

9、&&、||
  這是一對含義截然相反的命令符,&&表示如果它之前的語句成功執行,將執行它之後的語句,而||則表示如果它之前的語句執行失敗,將執行它之後的語句;在某些場合,它們能替代 if……else…… 語句;例如:
  1. @echo off
  2. md test&&echo 成功建立資料夾test||echo 建立資料夾test失敗
  3. pause
複製程式碼 效果等同於如下程式碼:
  1. @echo off
  2. md test
  3. if "%errorlevel%"=="0" (echo 成功建立資料夾test) else echo 建立資料夾test失敗
  4. pause
複製程式碼 10、()
  小括號對經常出現在for語句和if語句中,還有一些特定場合;在for和if語句中屬於語句格式的要求,例如:
  ① for %%i in (語句1) do (語句2):在這條語句中,語句1必須用括號對包圍,而語句2的括號對則可視情況予以拋棄或保留:如果語句2是單條語句或用&、&&、||等連線符號連線的多條語句,括號對可以拋棄,如果語句2是有邏輯先後關係的多條語句集合,則必須保留括號對,並且,多條語句必須斷行書寫;例如:
  1. @echo off
  2. for %%i in (a b c) do echo %%i&echo --------
  3. pause
複製程式碼 也可以改寫為:
  1. @echo off
  2. for %%i in (a b c) do (
  3.     echo %%i
  4.     &echo --------
  5. )
  6. pause
複製程式碼 ② if 條件 (語句1) else (語句2):如果沒有else部分,則語句1的括號對可有可無;如果有else部分,則語句1中的括號對必須保留,此時,語句2中的括號對保留與否,和上一點類似。例如:
  1. @echo off
  2. if exist test.txt echo 當前目錄下有test.txt
  3. pause
複製程式碼
  1. @echo off
  2. if exist test.txt (echo 當前目錄下有test.txt) else echo 當前目錄下沒有test.txt
  3. pause
複製程式碼
  1. @echo off
  2. if exist test.txt (echo 當前目錄下有test.txt) else (
  3.     echo 當前目錄下沒有test.txt
  4.     pause
  5.     cls
  6.     echo 即將建立test.txt檔案
  7.     cd.>test.txt&&echo 成功建立test.txt
  8. )
  9. pause
複製程式碼 ③ 特定場合下使用括號對,不但可以使程式碼邏輯清晰,增強可讀性,還可能會減少程式碼量。比如用echo語句構造多行文字內容的時候:
  1. @echo off
  2. (
  3. echo 第一行
  4. echo 第二行
  5. echo 第三行
  6. )>test.txt
  7. start test.txt
複製程式碼 如果不使用括號對的話,則需要使用如下程式碼:
  1. @echo off
  2. echo 第一行>test.txt
  3. echo 第二行>>test.txt
  4. echo 第三行>>test.txt
  5. start test.txt
複製程式碼 11、+、-、*、/
  在 set /a 語句中,這些符號的含義分別為:加、減、乘、除。例如:set /a num=1+2-3*4/5。需要注意的是,這些運算子號遵循數學運算中的優先順序順序:先乘除後加減,有括號的先算括號,並且,直接忽略小數點,因此,剛才那個算式的結果是1而不是0或0.6。
  另外,有可能會在程式碼中看到這樣的寫法:set /a num+=1、set /a num-=1、set /a num*=1 和 set /a num/=1,這些表示累加、累減、累乘、累除,步長都是1,展開後的完整寫法為:set /a num=num+1、set /a num=num-1、set /a num=num*1 和 set /a num=num/1(set /a 語句中,變數引用可以忽略百分號對或感嘆號對,set /a num=%num%+1 與 set /a num=num+1 等同)

12、equ、neq、lss、leq、gtr、geq
  這幾個命令符是if語句中常用到的數值比較符號,取自英文的關鍵字母,具體的含義為:
命令符號        含義                英文解釋
EQU                等於                equal
NEQ                不等於                 not equal
LSS                少於                 less than
LEQ                少於或等於         less than or equal
GTR                大於                 greater than
GEQ                大於或等於         greater than or equal