常用指令碼學習手冊——Bat指令碼
我們在日常工作中常常會遇到一些需要重複進行的工作,又或者我們的專案在轉交客戶時需要去簡化配置過程
這時我們就需要使用到一些自動化部署操作,我們常常會採用指令碼來完成這部分功能
下面我們來介紹一種指令碼型別Bat指令碼,我們會從以下方面介紹:
- 指令碼介紹
- Bat指令碼基本語法
- Bat指令碼常用語法
- Bat指令碼進階內容
指令碼介紹
首先我們需要去簡單瞭解一下指令碼
指令碼簡介
首先我們需要知道指令碼是什麼:
- 指令碼是一種特殊檔案,藉助這種檔案我們可以快速實現一些配置設定或快速啟動某些部件
那麼指令碼具有什麼優勢:
- 指令碼的語言相對而言比較簡單易學,可以快速掌握
- 指令碼可以使用任何文字檔案編輯工具建立和修改,簡單便捷
- 指令碼透過一次書寫多次執行的方式來簡化多次程式碼的書寫,加快速度
- 指令碼可以提前設定執行方式,使我們在部署或其他方面簡化操作,封裝內部快速使用
那麼市面上常見的指令碼都有哪些:
- python:目前比較常用的語言之一,這裡推薦簡單學習一下
- Shell:Shell既是一種命令語言,又是一種 程式設計語言 ,也就是我們所說的指令碼,以sh結尾的檔案
- Bat:Bat也是一種常見的指令碼語言,具有低廉的學習成本,可以快速掌握並用於一些簡單操作,雙擊執行即可
Bat指令碼簡介
首先我們需要先去了解一下Bat指令碼:
-
Bat指令碼是一種以.bat結尾的檔案,可以直接雙擊點選使用即可
-
全稱batch指令碼,也稱批處理檔案,是Windows系統預設支援的指令碼語言
然後我們給出一個簡單的Bat指令碼,介紹一下基本格式:
REM 這是註釋,@echo off表示關閉Bat指令碼內容展示
@echo off
REM set表示定義變數
set name=123
REM echo表示頁面輸出,%%中包含變數名可以使用變數
echo %name%
REM goto:eof表示結束不再繼續下面的內容
goto:eof
Bat指令碼基本語法
下面我們會介紹Bat的基本語法內容
註釋@和REM和::
首先我們介紹註釋資訊:
-
@:表示不顯示本行資訊,但是仍執行
-
REM:表示註釋資訊,該註釋資訊不會顯示
-
"::":也表示註釋資訊,實際上":"加任意符號都可以表示無資訊顯示,但我們通常用::來表示註釋
我們給出簡單示例:
REM 我是註釋
:: 我是註釋
輸出echo
首先我們來介紹echo的五種用處:
- echo txt :直接輸出語句
- echo. : 表示換行符
- echo text > txt檔案 :將text覆蓋在txt檔案中
- echo text >> txt檔案 :將text追加在txt檔案中
- echo on/off: bat語句資訊是否展示
我們給出簡單示例:
REM 我們採用@來隱藏該行指令,這樣本行就不會出現在介面
REM 我們使用echo off,那麼我們後續的指令就不會出現在介面中
@echo off
REM 正常輸出語句
echo 123
REM 這裡如果我們輸出所拼接的字串,直接拼接即可
echo hello world
REM 表示換行符
echo.
REM 表示將123寫入t.txt文字中
echo 123 > t.txt
REM 表示將456覆蓋進t.txt文字中,這時文字內為456
echo 123 > t.txt
REM 表示將789追加到t.txt文字中,這時文字內為789
echo 789 >> t.txt
暫停pause
我們先來簡單介紹一個pause:
- pause:用於暫時暫停介面,當我們輸入其他資訊時介面繼續執行
我們常常會將其用於暫停頁面檢視資訊:
REM 我們採用@來隱藏該行指令,這樣本行就不會出現在介面
REM 我們使用echo off,那麼我們後續的指令就不會出現在介面中
@echo off
REM 我們檢視一個較長的資料
echo 123
REM 我們可以在中途暫停檢視資料,點選後檢視下一個資料
pause
REM 我們檢視一個較長的資料
echo 456
標題title
我們簡單介紹title:
- title:可以用於設定該命令框的名稱
- 我們的bat命令其實就是一個cmd命令執行框,title會修改該框的名稱
我們給出簡單例項:
@echo off
REM 設定標題為this is a test
title this is a test
引數set
我們先來介紹一下set關鍵字:
- set:通常用來定義變數,定義後該變數可以任意使用
- 變數的使用通常採用%%包圍該變數,表示使用該變數的內部資料
我們給出一個簡單示例:
@echo off
REM set 後跟變數名=變數值,注意不能存在空格
set name=ScriptHome
REM 然後我們可以採用%%去使用該資料
echo %name%
REM 我們可以直接進行拼接
set age=18
echo %name%%age%
REM set的變數值可以進行介面互動獲取(set /P 變數名=提示資訊)
set /P yourname=你的名字是:
echo %yourname%
跳轉goto
下面我們來介紹跳轉關鍵字:
- goto:goto後面可以跟位置關鍵字,用於跳轉到對應的位置
- goto通常配合:來使用,使用":名稱"來定義跳轉位置,然後使用goto:名稱來進行跳轉
我們給出一個簡單例項:
:: goto展示
@echo off
REM 下述是一個死迴圈,我們正常使用時不能這樣書寫,下述會一直輸出1
:top
echo 1
goto:top
:: goto:eof 表示結束,執行後就不會再執行後續命令
REM 下述命令只會執行1,不會執行2,因為在中間進行了中斷
@echo off
echo 1
goto:eof
echo 2
其他功能
首先我們需要知道Bat指令碼其實是基於cmd命令來實現的,所以我們首先給出window的一些常用命令:
windows命令列 | 功能描述 | linux終端 |
---|---|---|
cd | 切換工作目錄 | cd |
dir | 列出當前資料夾下所有檔案 | ls [-lh] |
type | 檢視檔案內容 | cat |
md/mkdir | 建立目錄 | mkdir |
del | 刪除檔案 | rm |
rd | 刪除目錄 | rm -r |
copy/xcopy | 複製 | cp [-r] |
cls | 清屏 | clear |
findstr | 根據關鍵字查詢 | grep |
move/rename | 移動/重新命名 | mv/rename |
tasklist | 查詢程式 | ps [-ef] |
taskkill | 殺死程式 | kill [-9] |
下面我們統一來介紹一些其他語法
::首先我們需要介紹一個Bat指令碼中文亂碼修復辦法:使用 chcp 65001 命令列
::當然我們也可以在儲存時手動選擇為ANSI編碼格式來解決中文亂碼問題
@echo off
chcp 65001
set param1=hello
set param2=world
REM 預設情況下可能會導致你好出現亂碼狀況,但是有chcp 65001相當於選擇 ANSI 編碼格式,可以修復亂碼問題
echo %param1%%param2%你好
::start可以呼叫同目錄級別下的其他檔案
Bat指令碼常用語法
下面我們來介紹一些關於Bat的常用內容
常用系統變數
除了常用的符號我們還需要注意一些常用的系統變數:
REM 當前工作路徑
%CD%
REM 當前日期,格式為"星期日 DD/MM/YYYY"
%DATE%
REM 當前時間,格式為"HH:MM:SS.SS"
%TIME%
REM 一個從0~32767之間的隨機數
%RANDOM%
REM 之前的命令是否出錯(出錯為0,出錯為1+)
%ERRORLEVEL%
REM 當前登入使用者名稱
%USERNAME%
REM 當前使用者的使用者資料夾目錄
%USERPROFILE%
REM 當前使用者的應用程式資料資料夾目錄
%APPDATA%
常用符號介紹
首先我們來介紹Bat中常用的各類符號的功能
命令列回顯遮蔽符@
命令列回顯遮蔽符@的主要用途:
- 關閉當前行的回顯
- ECHO OFF可以關閉掉整個批處理命令的回顯,但不能關掉ECHO OFF這個命令,所以我們通常採用@來關閉ECHO OFF命令的回顯
**批處理變數引導符% **
批處理變數引導符%的主要用途:
- %%將變數名包圍在裡面可以表示變數
- %%將變數名放在最後可以用於表示for的單個元素
- %0表示該Bat指令碼本身,通常可以用於複製文字或者其他的一些操作
- %(19)表示在執行該Bat指令碼時傳入的19個引數,可以看作為輸入的變數值,可以在bat指令碼中使用
**重定向符> **
重定向符>的主要用途:
- DOS的標準輸入輸出通常是在標準裝置鍵盤和顯示器上進行的,利用重定向,可以方便地將輸入輸出改向磁碟檔案或其它裝置
- “>”:將命令傳送到檔案或裝置,使用大於號“>”時,有些命令輸出(例如錯誤訊息)不能重定向
- “>>”:將命令輸出新增到檔案結尾而不刪除檔案中已有的資訊
- “<”:從檔案而不是鍵盤上獲取命令所需的輸入
**命令管道符| **
命令管道符| 的主要用途:
- 格式:第一條命令 | 第二條命令 [| 第三條命令...]4
- 將第一條命令的結果作為第二條命令的引數來使用,例如dir c:|find "txt"查詢c盤下的txt文字
**跳脫字元^ **
跳脫字元^的主要用途:
- ^是對特殊符號<,>,&的前導字元
- 在命令中他將以上3個符號的特殊功能去掉,僅僅只把他們當成符號而不使用他們的特殊意義
- 此外,^放在echo text的末尾可以表示續行符號,因為每行末尾還有一個看不見的符號,即回車符,所以^會將回車符失去意義
**組合命令& **
組合命令&的主要用途:
- 語法:第一條命令 & 第二條命令 [& 第三條命令...]
- 這個符號允許在一行中使用2個以上不同的命令,當第一個命令執行失敗了,也不影響後邊的命令執行
**組合命令&& **
組合命令&&的主要用途:
- 語法:第一條命令 && 第二條命令 [&& 第三條命令...]
- 用這種方法可以同時執行多條命令,當碰到執行出錯的命令後將不執行後面的命令,如果一直沒有出錯則一直執行完所有命令
**組合命令|| **
組合命令|| 的主要用途:
- 語法:第一條命令 || 第二條命令 [|| 第三條命令...]
- 用這種方法可以同時執行多條命令,當一條命令失敗後才執行第二條命令,當碰到執行正確的命令後將不執行後面的命令
Bat指令碼進階內容
下面我們來介紹Bat指令碼中的一些進階內容
函式
首先我們需要了解Bat指令碼中的函式:
- 函式由":"表示開始函式,同樣後面帶函式名(實際上類似於goto的跳轉概念)
- 由":函式名"來宣告函式並書寫函式內容,由"call:函式名"來呼叫函式並在呼叫結束後回到原位置執行
我們來給出一些簡單的函式例項:
::首先我們先來宣告函式
REM 宣告兩個函式
:method1
@echo hello
:method2
@echo world
REM 但實際上輸出的結果會是helloworld,因為只要存在在bat中該程式碼都會被執行,所以我們需要一些命令避免執行
:: 我們會採用call來呼叫函式同時分段在末尾書寫goto:eof來中斷後續程式碼執行
REM 宣告兩個函式並呼叫第二個函式
@echo off
call:method2
goto:eof
:method1
@echo hello
goto:eof
:method2
@echo world
goto:eof
REM 那麼我們只會執行world,因為call呼叫method2,然後method2末尾有goto:eof回到原位置執行第二個goto:eof結束bat檔案
陣列
下面我們來介紹一下陣列:
- bat的陣列在某種意義上來說不能被稱為陣列,因為它無法透過下標訪問
- bat的陣列可以透過set直接定義,一次定義一堆可以被稱為陣列,一次定義一個並標記下標也可以被稱為陣列
我們下面給出陣列例項:
:: 我們首先給出基礎陣列
set arr=1,3,5,6,8
REM 這裡是一個for迴圈,我們會在後續介紹,大致意思就是從arr陣列種提取資料a,然後展示
for %%a in (%arr%) do (
@echo %%a
)
:: 然後我們來展示帶有下標的陣列
set a[0]=1
set a[1]=3
set a[2]=5
set a[3]=7
set a[4]=9
set a[5]=11
REM 這裡也是for迴圈,大致意思從0~5全部遍歷一遍為n,然後去獲得a[n]的值
for /l %%n in (0,1,5) do (
@echo !a[%%n]!
)
迴圈
我們這裡介紹的迴圈是for迴圈:
-
基本格式:FOR %%variable IN (set) DO command [command-parameters]
-
其中%%variable表示我們獲取的陣列中的各個元素值
-
其中set表示我們所定義的陣列,有的可以是陣列,有的可以是自定義的一些資料
-
最後do(),()中書寫所需要執行的for迴圈內容
我們需要注意的是針對不同的for迴圈引數具有不同的意義:
- /D:只能顯示當前目錄下的目錄名字
- /R:可以把當前或者你指定路徑下的檔名字全部讀取
- /L:該集表示以增量形式從開始到結束的一個數字序列
- /F:使用檔案解析來處理命令輸出、字串及檔案內容
下面我們給出關於for迴圈的一些案例:
:: 基本迴圈語法
for [/d/l/r/f] %%i in () do (
)
:: 這裡講解一個知識點:\dir /b 指定目錄\ 這個語法可以用於獲得指定目錄下的所有檔案和資料夾
REM %~dp0等同於%CD%,表示當前路徑
set curdir=%~dp0test1\
for /f %%i in ('dir /b "%curdir%"') do (
echo %%i
)
:: /d 表示獲取某一目錄下的所有資料夾
REM 表示bat同目錄級下的所有資料夾
for /d %%i in (%cd%\*) do (
@echo %%i
)
:: /l 可以使用一個序列來做迴圈,包含三個引數,第一個引數是開始值,第二個引數是跨步值,第三個引數是結束值
REM 例如下面我們會從1~10每隔兩位輸出,輸出為1,3,5,7,9
for /l %%i in (1 2 10) do (
echo %%i
)
REM 此外也可以實現倒數輸出
for /l %%i in (10 -2 1) do (
echo %%i
)
:: /r 可以獲取某一個目錄下所有的檔案以及資料夾下的檔案
REM 獲得該目錄下的所有檔案及資料夾內的txt文字檔案
for /r %%i in (*.txt) do (
@echo %%i
)
:: /f 讀取檔案(下述的/表示換行)
REM 例如我們的資料為:
REM ID NAME AGE
REM 1 zhang 18
REM 2 lisi 15
REM 3 wang 19
REM 讀取user.txt檔案並展示(預設只讀取每行第一個空格前的資訊)
REM 那麼展示的資料就是ID /1 /2 /3
for /f %%a in (user.txt) do (
echo %%a
)
REM 可以增加一個"delims="的引數,表示不分割讀取每一行
REM 那麼展示的資料就是ID NAME AGE /1 zhang 18 /2 lisi 15 /3 wang 19
for /f "delims=" %%a in (user.txt) do (
echo %%a
)
REM 也可以採用"delims=分隔符"來將其分割輸出,同時需要採用tokens設定獲取幾列資料
REM delims= 表示以空格作為分隔符;tokens=1-3表示獲取第1~3列分別作為%%a,%%b,%%c來作為引數輸出
for /f "tokens=1-3 delims= " %%a in (user.txt) do (
echo %%a - %%b - %%c
)
結束語
這篇文章中詳細介紹了Bat指令碼的優勢和一些具體語法來幫助我們快速構建指令碼,希望能為你帶來幫助
附錄
下面給出我學習和書寫該篇文章的一些參考文章,大家也可以去仔細觀賞:
-
bat批處理指令碼大全:bat批處理指令碼大全_bat指令碼_luffy5459的部落格-CSDN部落格
-
批處理文字指令碼教程:超詳細 批處理檔案指令碼(bat) 教程(持續更新)_bat指令碼_哈森程式猴的部落格-CSDN部落格
-
【最全】BAT批處理指令碼教程:【最全的】BAT 批處理指令碼教程_bat指令碼菜鳥教程_致守的部落格-CSDN部落格