2012/7/28

【Windows】SET指令的兩個妙用

Windows Command SET是很好用的一個指令, 變數的指定就要靠這支工具!
但他還有兩個我覺得挺實用的功能:
  1. 做數學運算(使用/A參數)
    基本上你想得到的數學運算大概都包了,請參考底下範例:
    1
    2
    3
    4
    5
    6
    7
    @ECHO OFF
    CLS
    
    SET /A A = (50 + 25) / 3 - 20
    ECHO (50 + 25) / 3 - 20 = %A%
    
    PAUSE
  2. 把檔案內容存到環境變數
    常常會有需求要把某檔案的內容經過程式做處理, 但處理的程式只接受參數而不會直接去開檔讀取文件內容做處理, 這時就可以使用SET /P這功能來達成需求,先看看這指令的最初用意:
    在Windows Command中可以透過SET設定環境變數,但有時候情境是需要跟使用者互動的,假設程式會先跟使用者打招呼並問使用者名字,等使用者回答後會依使用者回答的名稱做互動,參考如下範例:
    1
    2
    3
    4
    5
    6
    7
    @ECHO OFF
    CLS
    
    SET /P NAME=Hi Sir, what's your name? 
    ECHO Hello %NAME%, Welcome!
    
    PAUSE
    

    知道SET /P的用法後,此時再運用重導向(Redirect)概念就可以把檔案內的內容指定給變數了,參考如下範例:
    1
    2
    3
    4
    5
    6
    7
    @ECHO OFF
    CLS
    
    SET /P CONTENT=<A.txt
    ECHO %CONTENT%
    
    PAUSE
    

2012/7/25

【批次檔】%CD% 與 %~dp0

%CD%:Current Directory, 當前工作目錄位置
%~dp0:批次檔存在的目錄位置

請試著執行下面例子感受兩者間的差異:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@ECHO OFF
CLS

REM ================
REM == 先比較效果 ==
REM ================
ECHO ===============================================
ECHO == [Step1] 看起來沒什麼不同, 除了結尾的斜線 ...
ECHO ===============================================
ECHO %%CD%% = %CD%
ECHO %%~dp0 = %~dp0


REM ==========================
REM == 切換工作目錄再做比較 ==
REM ==========================
IF NOT EXIST TEMP MKDIR TEMP
CD TEMP
ECHO ===============================================
ECHO == [Step2] 切換工作目錄後, 發生差異了!
ECHO ===============================================
ECHO %%CD%% = %CD%
ECHO %%~dp0 = %~dp0
CD ..

:CLEAN
RMDIR /S /Q TEMP

上面例子可以明確知道:

  1. %~dp0表示批次檔所存在的位置, 是不會因切換工作目錄而改變。
  2. %CD%表示的是當前工作目錄位置, 如果用CD之類的指令切換工作目錄, 則%CD%會改變成對應的目錄。

關於%~dp0其實是%0參數的衍伸用法(可以使用CALL /?查閱詳細說明)
首先執行下面例子先看看結果:
1
2
3
4
5
6
7
8
@ECHO OFF
CLS

ECHO %%0 = %0
ECHO %%~d0 = %~d0
ECHO %%~p0 = %~p0
ECHO %%~n0 = %~n0
ECHO %%~x0 = %~x0

CALL /?的說明頁面中, 得知在參數%n(%0, %1, ... %9)之間加了波浪符號(~)與相關的修飾字詞後, 就會有擴充的支援。

  1. %0:第0個參數, 表示批次檔本身。
  2. %~d0:Dirver, 批次檔存在的磁碟機代號。
  3. %~p0:Path, 批次檔的路徑位置(不包含磁碟機代號)。
  4. %~n0:批次檔的檔案名稱。
  5. %~x0:批次檔的副檔名。
  6. 所有的修飾字詞可以混搭使用, 所以%~dp0即是批次檔所在的完整路徑。
  7. 修飾字詞還有~f, ~a, ...等, 請參考程式說明頁面。