title: bat批處理簡介:Windows自動化之道

最近在工做中遇到一些純粹重複的工做,最終都經過腳本方式達到了自動化,大大提升效率。好比以前每次發佈zip包都須要手動編譯lua文件、替換lua引用爲二進制文件的引用,選擇對應文件打zip包,每次都須要幾分鐘,還容易出錯、遺漏,很不geek,經過腳本後實現了徹底自動化:php

再好比Android項目中用到了插件,因爲正式打包和本地編譯的gradle腳本不一樣,以及Android Studio對模塊的編譯支持不夠,致使每次都須要手動修改文件名(如本地開發時build.gradle修改成build.gradle.tmpbuild.gradle.local修改成build.gradle,正式編包時再修改回去),再copy插件目錄出去單獨開發調試,最後在把改動合入工程,終端也須要一個按鈕來啓動插件,十分繁瑣且容易形成代碼不一樣步,經過腳本能夠實現工程內一鍵編譯運行:python

因爲以前沒有用過bat腳本,因此作自動化時速度不是很快,所以花了一天時間整理一下bat腳本的使用要點,只是一個綱領,沒有深刻講解,由於我以爲須要的時候去學習細節纔是最高效的,但必須瞭解總體框架才能快速定位到需求對應的命令,所以整理了這篇文章。
此外,Windows7已經支持了powershell,其語法更接近bash,比bat不知道靈活到哪裏去了,我爲何不用powershell呢?主要是目前powershell速度遠沒有cmd快,正好個人自動化任務都比較簡單,若是用powershell可能啓動時間比運行時間還長。
爲何不用python、perl等腳本語言?這些腳本須要環境配置,考慮到這些腳本工具可能被其餘人使用,因此但願開箱即用,並且bat足夠簡單,足夠知足需求。shell

PART 1:運行環境

相似於編程語言庫,這些命令是Windows內置的,能夠做爲腳本的基本元素,能夠在cmd運行,也能夠寫入cmd運行。首先介紹最重要的兩個命令:help,/?,利用help能夠查看當前內置的命令:數據庫

F:\BatchFileProgramming>help
有關某個命令的詳細信息,請鍵入 HELP 命令名
ASSOC          顯示或修改文件擴展名關聯。
ATTRIB         顯示或更改文件屬性。
BREAK          設置或清除擴展式 CTRL+C 檢查。
BCDEDIT        設置啓動數據庫中的屬性以控制啓動加載。
CACLS          顯示或修改文件的訪問控制列表(ACL)。
CALL           從另外一個批處理程序調用這一個。
CD             顯示當前目錄的名稱或將其更改。
CHCP           顯示或設置活動代碼頁數。
CHDIR          顯示當前目錄的名稱或將其更改。
CHKDSK         檢查磁盤並顯示狀態報告。
CHKNTFS        顯示或修改啓動時間磁盤檢查。
CLS            清除屏幕。
CMD            打開另外一個 Windows 命令解釋程序窗口。
COLOR          設置默認控制檯前景和背景顏色。
......

利用/?能夠詳細的瞭解某個命令:編程

F:\BatchFileProgramming>call /?
從批處理程序調用另外一個批處理程序。

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

  batch-parameters   指定批處理程序所需的命令行信息。

若是命令擴展被啓用,CALL 會以下改變:

CALL 命令如今將卷標看成 CALL 的目標接受。語法是:

    CALL:label arguments

一個新的批文件上下文由指定的參數所建立,控制在卷標被指定
後傳遞到語句。您必須經過達到批腳本文件末兩次來 "exit" 兩次。
第一次讀到文件末時,控制會回到 CALL 語句的緊後面。第二次
會退出批腳本。鍵入 GOTO /?,參看 GOTO :EOF 擴展的描述,
此描述容許您從一個批腳本返回。

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

有了這兩個命令,我也就不須要像網上那些文章同樣詳細解釋每一個命令了,查閱文檔便可。這裏列一些經常使用的,建議優先掌握,較爲生僻的在須要時詳細學習便可。
經常使用命令:vim

REM,echo,color,title,prompt,cls,date,time,start,exit,call,tree,type,pause,shutdown,at

經常使用環境變量(Environment variables are special variables that contain its values set by the operating system itself, other applications or by manual):bash

%CD%,%PATH%,%RANDOM%

文件和文件夾相關的命令:網絡

dir,mkdir,rmdir,chdir,ren,replace,copy,xcopy,del,pushd,popd,move

網絡:app

net,ping,telnet,tlntadmn,tracert,ipconfig,hostname,ftp,netstat,nbtstat,arp

若是遇到須要但本身又不知道的,google便可。框架

PART 2:語法

若是隻有這些命令,那麼運行bat和在命令行執行沒什麼區別,最多把命令保存下來了方便之後運行。bat也支持一些編程語言的特性,雖然簡陋且不夠優雅,但應付簡單的自動化任務基本夠用。我以爲Dennis Ritchie和Brian Kernighan的The C Programming Language,是介紹一門語言的模板,因此這裏也按照該書的結構安排。

類型、變量、操做符

bat沒有類型。set命令很重要,用於賦值,經過%name%引用變量,且變量賦值的=兩邊不能有空格:

C:\Users\vimerzhao\Desktop>set a=1
C:\Users\vimerzhao\Desktop>echo a
a
C:\Users\vimerzhao\Desktop>echo %a%
1

bat對運算符的支持和其餘語言大同小異:

operators description
() grouping
!、~、- unary operators
*、/、%、+、- arithmetic operators
<<、>>、<、> logical shift and re directional operators
& bitwise and
^ bitwise exclusive or
| bitwise or
=、*=、/=、%=、+=、-=、&=、^=、|=、<<=、>>= assignment operators
, separator
&& for using multiple commands
|| for executing one from many commands

流程控制

bat能夠經過for和goto實現循環,經過if實現條件語句。bat經過switch的概念支持不一樣類型的遍歷,switch和Linux命令的option很像,就是選項,常見的有四個:

switch description
for /d the ‘/d’ switch along with the ‘for’ command is used for looping through several directories
for /r the ‘/r’ switch along with the ‘for’ command is used for looping through directories and sub directories
for /l the ‘/l’ switch along with the ‘for’ command is used for looping through a range of specified numbers
for /f the ‘/f’ switch along with the ‘for’ command is used for looping through a wide variety of files, command and strings

for循環最多見的應用就是遍歷文件夾:

C:\Users\vimerzhao\Desktop>@echo off
C:\Users\vimerzhao\Desktop>echo 顯示所有文件
C:\Users\vimerzhao\Desktop>for %a in (*) do echo %a
001.PNG
002.PNG
...

在bat腳本中因爲%與變量引用衝突,要寫成

for %%a in (*) do echo %%a

此外,能夠經過內置的語法對文件作處理(如顯示完整路徑、文件名、後綴名等):

command description
%~I expands %I removing any surrounding quotes (")
%~fI expands %I to a fully qualified path name
%~dI expands %I to a drive letter only
%~pI expands %I to a path only
%~nI expands %I to a file name only
%~xI expands %I to a file extension only
%~sI expanded path contains short names only
%~aI expands %I to file attributes of file
%~tI expands %I to date/time of file
%~zI expands %I to size of file
%~$PATH:I searches the directories listed in the PATH environment variable and expands %I to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found by the search, then this modifier expands to the empty string.
%~dpI expands %I to a drive letter and path only
%~nxI expands %I to a file name and extension only
%~fsI expands %I to a full path name with short names only
%~dp$PATH:I searches the directories listed in the PATH environment variable for %I and expands to thedrive letter and path of the first one found
%~ftzaI expands %I to a DIR like output line

if語句除了支持操做符還支持幾個自定義的關鍵字:

operators meaning
equ equal
neq not equal
lss less than
leq less than or equal
gtr greater than
geq greater than or equal

子程序

最後,bat也支持簡單的子程序調用,和彙編很像,經過%n能夠獲取參數,從1開始,如如下代碼:

REM filename: test.bat
@echo off
call :procedure "argument 1"

goto:eof
:procedure
    echo repeat part or modular code
    echo %1
goto:eof

輸出爲:

F:\BatchFileProgramming>test.bat
repeat part or modular code
"argument 1"

總結

以上基本都是一些提綱挈領的概述,本身也不算精通每一個細節,相信只要心中有總體框架,再加上一點自動化的意識,長此以往自會駕輕就熟。

參考

做者:達文西z連接:https://www.imooc.com/article/75823來源:慕課網本文原創發佈於慕課網 ,轉載請註明出處,謝謝合做

相關文章
相關標籤/搜索