常用指令碼學習手冊——Bat指令碼

2023-04-05 06:00:23

常用指令碼學習手冊——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指令碼的優勢和一些具體語法來幫助我們快速構建指令碼,希望能為你帶來幫助

附錄

下面給出我學習和書寫該篇文章的一些參考文章,大家也可以去仔細觀賞:

  1. bat批次處理指令碼大全:bat批次處理指令碼大全_bat指令碼_luffy5459的部落格-CSDN部落格

  2. 批次處理文字指令碼教學:超詳細 批次檔指令碼(bat) 教學(持續更新)_bat指令碼_哈森程式猴的部落格-CSDN部落格

  3. 【最全】BAT批次處理指令碼教學:【最全的】BAT 批次處理指令碼教學_bat指令碼菜鳥教學_致守的部落格-CSDN部落格