變數
設定變數
批次檔使用的變數就是作業系統的環境變數,一般來說都視為字串變數,而且是是全域變數,我們可以透過下面的指令觀察有哪些環境變數。
set
設定變數時,一樣使用 set 指令,注意等號左右不能有空白。
set myname=Peter
若設定的變數代表路徑時,因為路徑中可能包含空白字元,建議以雙引號含括起來較好,單純顯示沒問題,但在命令列解析時,因為會以空白當作參數分隔,若沒有用雙引號時,會被分開當成2個參數處理,造成錯誤。
set ProgramPath="c:\Program Files (x86)"
取用變數
取用變數時,則需在變數前後加上%
echo %myname%
取消變數
取消變數時,只需依照設定變數的方式,但值是空白即可
set var=
變數的運算
set 使用 /a 參數,可使後面的敘述成為運算式
set var=6
set /a var+=3
需注意的是,若變數的值為08或09的時候,會被視為一個錯誤的8進位而其值為0,影響後續的計算
set var=08
set /a var+=3
set var=09
set /a var+=3
輸入提示
set 使用 /p 參數,等號(=)開始到冒號(:)結束的一段文字將視為輸入的提示
@echo off
:menu
echo 1.dir
echo 2.dir /w
echo 0.離開
set /p id=請輸入功能代碼:
if %id%==1 goto one
if %id%==2 goto two
if %id%==0 goto zero
:one
dir
goto menu
:two
dir /w
goto menu
:zero
字串的擷取
批次檔也可以像一般程式語言一樣,做到從字串的第n個位置開始擷取m個字元這件事
步驟 | %date% | %date:~0,4% |
---|---|---|
說明 | 當下日期變數 | 變數從第0位開始取4碼 1 |
值 | 2015/10/17 週六 | 2015 |
上述說明的程式碼如下
set today=%date:~0,4%/%date:~5,2%/%date:~8,2%
echo %today%
1字串擷取符號說明
- 冒號(:)
- 波浪符號(~)
- 開始位置(從0開始)
- 逗號(,)
- 擷取幾個字元
字串的取代
批次檔也可以進行字串的取代,方式跟字串的擷取有點類似,下面的範例說明如何將(140.128.71.1)替換為[140.128.71.1]。
步驟1 | %var% | %var:(=[% |
---|---|---|
說明 | var變數 | 將 ( 替換為 [ 2 |
值 | (140.128.71.1) | [140.128.71.1) |
步驟2 | %result% | %result:)=]% |
---|---|---|
說明 | result變數(存放前一步驟的結果) | 將 ) 替換為 ] 2 |
值 | [140.128.71.1) | [140.128.71.1] |
上述說明的程式碼如下
@echo off
set var=(140.128.71.1)
set result=%var:(=[%
set result=%result:)=]%
echo %result%
Pause
2字串取代符號說明
- 冒號(:)
- 字串中想要被替換的子字串
- 等號(=)
- 替換後的子字串
其他的進階用法,請輸入 set /? 來獲得。
變數延遲展開
因為批次檔的命令解譯器,會針對每一行敘述中的變數進行預處理(預先賦值)的關係,因此造成取值的結果仍是前一個變數的狀態,必須開啟變數延遲展開(setlocal enabledelayedexpansion),才能如同一般程式語言循序處理變數,這個特性造成很多人無法正確駕馭批次檔的變數行為,甚為可惜。
以下會舉出幾個範例,先說明敘述中變數優先賦值的情形
請先看for 迴圈第一段的說明範例,其餘待續...