windows bat批處理文法簡析

來源:互聯網
上載者:User

很久沒有寫過部落格了,這一段時間看的東西不多,很亂,但是不寫總感覺有一件工作沒有完成,於是草草寫下自己的總結吧。
第一節先介紹windows批處理。
這個起源於跟旁邊同事學習在windows用命令列辦公,漸漸地有些批處理功能就需要了,於是專門抽出了幾天學習了一下。我認為文檔最重要的功能是為了備忘,擇取了很多文檔的例子,現在很久了就沒法詳細的標明出處了,很是抱歉。為了我個人的使用,例子中很多不太必要的東西都被我簡化了,有些很重要的東西就被我描述的過於詳細。大家擇優而看吧。
簡單一點,把批處理當初語言來看,常用的C語言有輸入輸出,定義變數,順序,迴圈,條件判斷。這是任何一個語言的根本,我就按這些類分類描述了。

總括:

要想運行批處理命令,首先建立一個txt檔案,將其尾碼名改為.bat,例如命名為my.bat, 開啟cmd,切換到my.bat的目錄,輸入my.bat即可運行my.bat中寫入的命令。最簡單的測試例子,加入echo hello world即可看到hello world在cmd視窗中列印出來。
分類描述:協助:/?

command /?查看對應command的協助,這個無論何時都是最權威的。
注釋:::命令,echo off命令

程式中的注釋是相當有用的,行注釋在行首加上::,例子如下
::這是一個注釋。
@echo off的意思是此命令後的命令在執行的時候,不顯示命令本身。
變數:set命令

set var="c:\a.txt"
echo %var%
輸出:echo命令,直接列印到控制台

   echo Hello World
輸入:choice命令,根據使用者輸入切換到不同的流程。

仔細分析這個例子,使用了choice命令來讀取使用者的不同輸入,下面通過goto來根據不同的使用者輸入切換到不同的處理流程。
goto就是跳轉到不同的標號中。標號的定義以:(冒號)開始,後面是標號名,例如下面的:no, :yes, :cancel, :end都是一個個的標號。為什麼每一個標號要加上一個goto end呢?這是因為在跳轉到標號後,程式就開始順序執行,如果不進行跳轉走,那麼會繼續運行到下一個標號。標號僅僅是個標記,不像函數一樣,有自己的範圍範圍,由大括弧包括起來。標號沒有範圍,僅僅是標記,切記切記。非常有用的例子,希望掌握。
CHOICE /C
YNC /M "確認請按 Y,否請按 N,或者取消請按 C"
if errorlevel 3 goto cancel 
if errorlevel 2 goto no 
if errorlevel 1 goto yes
:no
echo no way
goto end
:yes
echo yes,please
goto end
:cancel
echo alread canceled.

:end
傳遞參數:%1, %2...,%9對應使用者通過命令傳遞的參數。

程式中使用echo %1, %2, %3,在調用的地方使用mybat param1 param2 param3,看看是不是列印出來了param1,param2,param3?
這個類似於命令中的選項。很多命令都有選項,就是這個道理。
給大家一個我很常用的功能。
我喜歡使用ultraedit來編輯日常的工作記錄,日誌什麼的,包括我當前寫的這個部落格,也是用ultraedit編輯的,以下簡稱ue。
於是我搜尋ue的安裝目錄,我的安裝目錄如下C:\Program Files (x86)\IDM Computer Solutions\UltraEdit\Uedit32.exe,我又研究了如果通過命令啟動應用程式,找到了start命令。於是我使用start "" "C:\Program Files (x86)\IDM Computer Solutions\UltraEdit\Uedit32.exe" 來通過命令列啟動ue,但是這個命令實在是太長了,不好記。通過bat的學習,知道可以將這條命令放在一個.bat檔案中運行。於是我建立一個ue.bat檔案,檔案內容如下:
 
@echo off  :: 
start "" "C:\Program Files (x86)\IDM Computer Solutions\UltraEdit\Uedit32.exe"
但是我不可能每次都切換到ue.bat的目錄中去執行ue.bat命令,於是建立一個單獨的目錄,將此目錄加入到環境變數中,這樣命令列可以搜尋到這個目錄中的檔案,將ue.bat放入這個目錄中。這樣我每次啟動ue就只需在cmd下敲入ue(它會自動匹配ue.exe,ue.bat等檔案)就可以了。ue可以用來開啟檔案,我猜測ue應該可以傳遞參數。將上面命令後面加上%1參數,即start "" "C:\Program Files (x86)\IDM
Computer Solutions\UltraEdit\Uedit32.exe" %1,即可,然後在cmd命令列輸入ue blog.txt, 如果目前的目錄下有blog.txt,ue會自動開啟它,如果沒有,它會自動建立一個新的空白檔案。相當好用。這就是應用程式傳遞參數的妙用。上面的start命令可以擴充開來,像我的qq,vs2008,vc,chrome等等常用的軟體全都採用了如vc.bat,qq.bat上述方式,案頭捷徑基本不怎麼用了。
條件判斷:if命令

=============================================== 
 @echo off 
  set str1=abcd1233 
  set str2=ABCD1234 
  if %str1%==%str2% (
echo 字串相同!
) else (
echo 字串不相同!
)
=============================================== 
請一定要注意上面的if,else的文法結構,else不允許直接是行首。超級噁心,導致我經常出現語法錯誤。後面我基本上就以上面這個為模板了,即使就一個句子需要執行,我也將()括著,文法就按照上面的描述寫。易記不易錯。
if判斷有幾種情況
1. 是errorlevel的判斷, 上面已經樣本了。
2. 是比較判斷,常用的如下:
  == - 等於 
  EQU - 等於 
  NEQ - 不等於 
  LSS - 小於 
  LEQ - 小於或等於 
  GTR - 大於 
  GEQ - 大於或等於 
  選擇開關/i則不區分字串大小寫;選擇not項,則對判斷結果進行邏輯非。 
3. 是存在判斷,就是 if exists file1 echo "file1 exists" 這樣的文法結構判斷檔案或者目錄的存在。
4. 是定義判斷,判斷變數是否存在,即是否已被定義。其命令格式為: 
  IF [not] DEFINED variable command1 [else command2]

迴圈:

1、無開關的for語句能夠對設定的範圍內進行迴圈,是最基本的for迴圈語句。其命令格式為: 
  FOR %%variable IN (set) DO command 
  其中,%%variable是批次程式裡面的書寫格式,在DOS中書寫為%variable,即只有一個百分比符號(%);set就是需要我們設定的迴圈範圍,類似於C語言裡
面的迴圈變數;do後面的command就是迴圈所執行的命令,即迴圈體。 
  無開關for語句舉例: 
  =============================================== 
  @echo off 
  for %%i in (a,"b c",d) do echo %%i 
  pause>nul 
  =============================================== 
    2、開關/L 
  含開關/L的for語句,可以根據set裡面的設定進行迴圈,從而實現對迴圈次數的直接控制。其命令格式為: 
  FOR /L %%variable IN (start,step,end) DO command 
  其中,start為開始計數的初始值,step為每次遞增的值,end為結束值。當end小於start時,step需要設定為負數。 
  含開關/L的for語句舉例(建立5個檔案夾): 
  =============================================== 
  @echo off 
  for /l %%i in (1,2,10) do md %%i 
  pause 
  =============================================== 
  上例將建立5個檔案夾,檔案夾名稱依次為1、3、5、7、9。可以發現,%%i的結束值並非end的值10,而是不大於end的一個數。 
     3、開關/F 
  含開關/F的for語句具有最強大的功能,它能夠對字串進行操作,也能夠對命令的傳回值進行操作,還可以訪問硬碟上的ASCII碼檔案,比如txt文檔等
。其命令格式為: 
  FOR /F ["options"] %%variable IN (set) DO command 
  其中,set為("string"、'command'、file-set)中的一個;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一個或多個的組
合。各選項的意義參見for /f。一般情況下,使用較多的是skip、tokens、delims三個選項。 
  含開關/F的for語句舉例: 
  =============================================== 
  @echo off 
  echo **No Options: 
  for /f %%a in ("1,2,10") do echo a=%%a 
  echo **Options tokens ^& delims: 
  for /f "tokens=1-3 delims=," %%a in ("1,2,10") do echo a=%%a b=%%b c=%%c 
  pause 
  ===============================================

4、總結說來就是常用的有三種,無開關主要是用於對設定的範圍進行迴圈,使用的場合比較少。
帶開關l常用於設定迴圈次數的情況,例如迴圈10次,可以for /l %%i in (1,1,10) do ( command )這樣就會迴圈10次。
帶開關F常用於截取字串,不過由於for,它可以對命令的結果進行批量截取。in的裡面可以使用字串,也可以使用命令的結果,也可以使用檔案,相當強大,也最難用。
下面這個例子相信會讓你有點感覺:
=============================================== 
  @echo off 
  echo 本檔案夾裡面的檔案有: 
  for /f "skip=5 tokens=3* delims= " %%a in ('dir') do ( 
  if not "%%a"=="<DIR>" if not "%%b"=="位元組" if not "%%b"=="可用位元組" echo %%b 
  ) 
  pause 
  ===============================================
解釋一下這個例子,skip=5表示要跳過前5個字元,delims= 表明使用空格分隔,tokens=3*表明要取得空格分隔的第3組,以及最後一組(*表明第4組到最後).後面的%%a對應的第三組,%%b對應的*那一組。
實際還有開關/R, /D,我沒有用過也沒有深入瞭解。
截取路徑參數:

截取傳入的帶路徑的參數
Test.bat: 假設傳入的參數為:c:\temp\test1.txt
則對應截取如下:下面的1表明是對應著%1,當然可以為2,3等等,與傳入的參數對應即可。
echo %~d1 =>c:
echo %~dp1 =>c:\temp\
echo %~nx1 =>test1.txt
echo %~n1 =>test1
echo %~x1 =>.txt
cho 目前的目錄路徑:%~dp0
語音聲音:

mshta vbscript:createobject("sapi.spvoice").speak("好好學習Merry Christmas and Happy New Year!")(window.close)

字串處理:

截取字串:
set var=10203040
第一數字是位置,從哪裡開始截取,第二個數字是截取的長度。
第一個數字如果是負數,則表示反方向的位置,例如-4表明從倒數第四個字元開始。
第二個數字如果無,表明是可以達到的最長的長度,位置從0開始。
echo %var:~-4,3%   ;從倒數第四個字元的位置開始截取,截取3個字元
echo %var:~0%      ;從正數第0個位置開始,即全長。
echo %var:~1%      ;從正數第一個開始,截取除第一個字元之外的全部字元
echo %var:~-2%
  ;從倒數第2個字元的位置開始截取,截取2個字元(從左向右截最長只有2個)。
替換字串
echo %var:0=kkk%  ;0替換為kkk
echo %var:10=kkk% ;10替換為kkk
echo %var:20=kkk%
echo %var:*20=kkk% ;20之前包括20字串都替換為kkk

簡單牢騷一下:

本文主要闡述bat基本文法,不怎麼講命令。在命令的基礎上使用bat,才會真正的事半功倍。當需要進行批量處理或者重複的工作才需要用到它,簡單的工作自己就簡單完成就可以了。將你特別常用的命令編製成批次檔,然後在命令列下使用,個人認為還是很不錯的。像ssh登入總是需要輸入機器的ip,那可以搞個批次檔,例如ssh1,ssh2,或者ssh_wang, ssh_liu,這個裡面進行真正的ssh對應的ip,敲的字元少了,工作就快了,而且不用每次都記憶那麼長的ip地址。像你可能在使用一套編譯環境,每次都是需要幾步命令才可以完成,這個時候你也可以將要輸入的命令集合組裝成一個bat檔案,以後就只需要一步就oK了。慢慢的你可能會積累一套自己的bat命令,雖然是一個一個的檔案,但其實就是簡單的命令集。你可能會忘記命令的名字,可以專門寫一個簡單的list.bat的命令,負責將bat目錄的命令集列印到螢幕上。
list.bat內容如下,相當簡單,功能是列印目前的目錄下的所有的bat檔案名稱和exe檔案名稱,將它和你的一系列的bat檔案放到同一個目錄,同時把目錄加入到環境變數裡面,你就可以進行享用它給你帶來的便捷了:
@echo off
::echo "path=%~dp0"
dir  /b "%~dp0*.bat" "%~dp0*.exe"

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.