windows bat批處理語法簡析


第一節先介紹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"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM