doc 變數

變數

設定變數

批次檔使用的變數就是作業系統的環境變數,一般來說都視為字串變數,而且是是全域變數,我們可以透過下面的指令觀察有哪些環境變數。
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字串擷取符號說明
  1. 冒號(:)
  2. 波浪符號(~)
  3. 開始位置(從0開始)
  4. 逗號(,)
  5. 擷取幾個字元

字串的取代

批次檔也可以進行字串的取代,方式跟字串的擷取有點類似,下面的範例說明如何將(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字串取代符號說明
  1. 冒號(:)
  2. 字串中想要被替換的子字串
  3. 等號(=)
  4. 替換後的子字串
其他的進階用法,請輸入 set /? 來獲得。
+

變數延遲展開

因為批次檔的命令解譯器,會針對每一行敘述中的變數進行預處理(預先賦值)的關係,因此造成取值的結果仍是前一個變數的狀態,必須開啟變數延遲展開(setlocal enabledelayedexpansion),才能如同一般程式語言循序處理變數,這個特性造成很多人無法正確駕馭批次檔的變數行為,甚為可惜。

留言

這個網誌中的熱門文章

格式透視 - 解析 PE 文件格式

doc call呼叫外部程式與副程式