2012-03-13 35 views
0

現在我正在使用兩個批處理文件,在此示例中將它們稱爲variables.cmd和main.cmd。 variable.cmd文件將用於外部化可能與多個其他批處理文件一起使用的一組變量。來自外部批處理文件的變量在主批處理文件中不起作用

現在,除了CLASSPATH之外,每個變量在main.cmd文件中都沒有問題。當回聲variables.cmd CLASSPATH中正確地創建中調用,但在main.cmd文件我得到以下結果迴盪時:

!CLASSPATH!;C:\ipp\deploy\lib\app\momex-webservice-client.jar;C:\ipp\deploy\resources 

上發生了什麼任何想法,以及它如何能解決嗎?

這是main.cmd文件:

@echo off 

call variables.cmd 

echo %JAVA_HOME% 
echo %DEPLOY% 
echo %DEBUG% 
echo %DEBUG_PORT% 
echo %JAVA_OPTIONS% 
echo %CLASSPATH% 

這是variables.cmd文件:

@echo off 
setlocal EnableDelayedExpansion 

set JAVA_HOME="C:\Program Files\Java\jdk1.6.0_30" 
set DEPLOY=C:\ipp\deploy 
set DEBUG=false 
set DEBUG_PORT=15000 

set JAVA_OPTIONS=" 
set JAVA_OPTIONS=%JAVA_OPTIONS% -Djava.endorsed.dirs=%DEPLOY%\lib\endorsed 
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump="true" 
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dconfiguration.properties=%DEPLOY%\resources\vendor.configuration.properties 
if "%DEBUG%"=="true" (
    set JAVA_OPTIONS=%JAVA_OPTIONS% -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=15000,suspend=n,server=y 
) 

set CLASSPATH=%DEPLOY% 
for %%i in (%DEPLOY%\*.jar) do (
    set CLASSPATH=!CLASSPATH!;%%i 
) 

for %%i in (%DEPLOY%\lib\system\*.jar) do (
    set CLASSPATH=!CLASSPATH!;%%i 
) 

for %%i in (%DEPLOY%\lib\app\*.jar) do (
    set CLASSPATH=!CLASSPATH!;%%i 
) 

for %%i in (%DEPLOY%\tools\jaxws-ri\lib\*.jar) do (
    set CLASSPATH=!CLASSPATH!;%%i 
) 

set CLASSPATH=%CLASSPATH%;%DEPLOY%\resources 

回答

1
--main.bat-- 
@echo in main.bat 
@set CLASSPATH="This is a failed test" 
@echo The current classpath is %CLASSPATH% 
@echo going to call variables.bat 
@call variables.bat 
@call temporary.bat 
@echo back in main.bat 
@echo The current classpath is %CLASSPATH% 
@echo main.bat -- all done 

--variables.bat-- 
@setlocal EnableDelayedExpansion 
@echo In variables.bat 
@set something="This is a successfull test" 
@echo set classpath=!something! > temporary.bat 
@endlocal 
@echo variables.bat is finished 
+0

我也試過了。很棒!謝謝您的幫助。 – Karl 2012-03-13 19:06:25

0

你variables.cmd頂部的SETLOCAL特別使其中定義的變量爲「本地」 - 因此不在「範圍內」main.cmd

+0

感謝您的支持。這是有道理的,但我如何設法使用!CLASSPATH的for循環!而不使用setLocal EnableDelayedExpansion?調用endLocal將導致CLASSPATH恢復到使用setLocal之前的狀態。 – Karl 2012-03-13 17:43:26

+0

是的,可以肯定的是 - 我只能想到的是讓你的「variables.cmd」文件寫出一個臨時的「.cmd」或「.bat」文件,其中包含完全擴展的類路徑設置 - - 然後改變你的「main.cmd」首先調用「variables.cmd」,第二次調用「temporary.cmd」 - 你構建的臨時文件將不包含「setLocal」,並且它對環境的改變應該是可見的「主」 - 祝你好運! – 2012-03-13 18:20:30

+0

另一件值得嘗試的事情是在變量.cmd文件中使用「endlocal」 - 理論上,在endlocal語句後對環境所做的更改應反映回「main」 – 2012-03-13 18:24:32

1

這是一個修改後的變量iabled.cmd文件:

@echo off 

set JAVA_HOME="C:\Program Files\Java\jdk1.6.0_30" 
set DEPLOY=C:\ipp\deploy 
set DEBUG=false 
set DEBUG_PORT=15000 

set JAVA_OPTIONS=" 
set JAVA_OPTIONS=%JAVA_OPTIONS% -Djava.endorsed.dirs=%DEPLOY%\lib\endorsed 
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump="true" 
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dconfiguration.properties=%DEPLOY%\resources\vendor.configuration.properties 
if "%DEBUG%"=="true" (
    set JAVA_OPTIONS=%JAVA_OPTIONS% -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=15000,suspend=n,server=y 
) 

set CLASSPATH=%DEPLOY% 

setlocal EnableDelayedExpansion 

for %%i in (%DEPLOY%\*.jar) do (
    set CLASSPATH=!CLASSPATH!;%%i 
) 

for %%i in (%DEPLOY%\lib\system\*.jar) do (
    set CLASSPATH=!CLASSPATH!;%%i 
) 

for %%i in (%DEPLOY%\lib\app\*.jar) do (
    set CLASSPATH=!CLASSPATH!;%%i 
) 

for %%i in (%DEPLOY%\tools\jaxws-ri\lib\*.jar) do (
    set CLASSPATH=!CLASSPATH!;%%i 
) 

endlocal & set CLASSPATH=%CLASSPATH%;%DEPLOY%\resources 

的唯一變化是setlocal命令和位置在最後一組CLASSPATH變量的同一行一個endlocal。這樣,此批處理文件中設置的值將保留在main.bat文件中,並且需要時啓用延遲擴展。