1. 程式人生 > >Windows批處理或命令列迴圈變數不能設值--採用延遲環境變數擴充套件

Windows批處理或命令列迴圈變數不能設值--採用延遲環境變數擴充套件

    看一個例子,在Windows下使用批處理來將一堆jar檔案合成一個長串,作為Java 執行命令的classpath的值。

1、應用場景

    將TOMCAT lib目錄下所有的jar檔案合成一個長串。

2、錯誤的寫法

(1)示例

    首先想到的做法是這樣的:

@echo off

set var=
for /R D:\apache-tomcat-7.0.67\lib %%m in (*.jar) do (
    set var=%var%;%%m
)

echo %var%
pause
    但最後,執行後,你會發現結果並非你所想象:

E:\Work\test>test_delayed_expansion1.bat
;D:\apache-tomcat-7.0.67\lib\websocket-api.jar

    迴圈過程並沒有將所有的jar檔案合在一起,只是加入了一個檔案。

(2)原因分析

    原因是什麼呢?和批處理檔案的解釋機制有關。下面是延遲環境變數的由來恰好解釋了這種現象發生的原因:

cmd在解釋我們的命令的時候,首先會讀取命令列一條完整的命令,然後對其進行一些命令格式的匹配操作,看你所輸的命令格式是否正確。如果我們要在命令中引用一些變數,那麼我們需要在變數的兩邊各加一個%號,使cmd在解釋我們的命令的時候能夠識別這個變數,例如%name%。當cmd讀取我們的命令進行格式匹配的時候,就會發現name這個字串兩邊各加了一個%,就不會把它當作普通字串處理,而是把它當作一個變數處理,變數名就叫做name。然後cmd就會查詢這個變數的值,用該值替換掉%name%,最後執行這個替換好的命令。這個替換的過程就叫做環境變數擴充套件。


3、正確的寫法

    所以,正確的做法是使用延遲環境變數擴充套件,使用延遲環境變數的前提條件是使用語句:

setlocal enabledlayedexpansion

    其次,獲取變數值時不使用%var%,而是使用!var!。

    下面是能正確拼合jar檔案的指令碼程式碼:

@echo off
setlocal enabledelayedexpansion
set var=
for /R D:\apache-tomcat-7.0.67\lib %%m in (*.jar) do (
    set var=!var!;%%m
)

echo !var!
pause

注意:

變數名後不能使用空格,否則,變數名可能獲取不正確,變數值若非必要,也不要包含空格。