2013-03-19 224 views
6

我正在寫一個批處理文件來從文件中讀取一個路徑並將其設置爲環境變量。該批處理文件將被許多其他批處理文件使用(調用)以獲取變量。在編寫批處理文件時,我遇到了一個問題,因此我使用了SETLOCAL ENABLEDELAYEDEXPANSION來解決這個問題。但是,使用它的其他批處理文件無法獲取變量集。批處理腳本使setlocal變量訪問其他批處理文件

下面是批處理腳本,

getVariables.bat 

@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 
if EXIST "test.dat" (
    for /F "tokens=*" %%I in (test.dat) do set %%I 
    echo setting JAVA_HOME to :: !JAVA_HOME! 
    echo setting JAVA to !JAVA! 
) 

在我的另一個批處理文件我使用上述batach文件,以獲取變量設置

another.bat 

    call getVariables.dat 
    echo "%JAVA%" 

但回聲打印「」,在那裏沒有設置。如果這是因爲setlocal,我該如何克服這個問題?我還需要setlocal來延遲擴展並在執行時發生。這個問題的任何解決方案?請幫助我。

回答

4

This endlocal & set str=value will work wonders。

+1

這是我的問題。我習慣於在我的所有腳本中使用SETLOCAL。最後,我發現了一個引起問題的例外。 – djangofan 2013-06-05 21:28:07

2

這真的取決於你在做什麼 - 以及你是否發佈了完整的腳本。

首先,你必須不平衡在%test.dat

下一頁%,這是一個好主意來命名批處理文件.bat沒有.dat

接下來,如果這個getVariables.bat的唯一目的是設置變量的FOM的文件線(TEST.DAT)等

JAVA_HOME=c:\whereverjavahomeis 
JAVA=c:\whereverjavais 

然後

@echo off 
if EXIST "test.dat" (
    for /F "tokens=*" %%I in (test.dat) do set %%I 
) 

是完全足夠的。這就是它 - 4行(如果你真的嘗試,它可以被壓縮爲1)...

問題是你只需要enabledelayedexpansion,因此setlocal爲了顯示變量的值,重新改變WITHIN THE LOOP WHERE YOU'RE CHANGING THE VALUES。您最終將刪除這些行,並且enabledelayedexpansion會失去它的存儲權

爲了測試,你可以寫

@echo off 
echo before...JAVA=%java% 
echo before...JAVA_HOME=%java_home% 
if EXIST "test.dat" (
    for /F "tokens=*" %%I in (test.dat) do set %%I 
) 
echo after....JAVA=%java% 
echo after....JAVA_HOME=%java_home% 

甚至

@echo off 
echo before&set java 
if EXIST "test.dat" (
    for /F "tokens=*" %%I in (test.dat) do set %%I 
) 
echo after&set java 

事實上,如果getVariables.bat是永遠只能CALL版則連@echo off線是多餘的 - 假設你執行@echo off從調用批次。

10

要設置多個全局變量來局部變量的值,可以使用下面的技巧:執行ENDLOCAL之前

endlocal & (
    set "globalvar1=%localvar1%" 
    set "globalvar2=%localvar2%" 
    set "globalvar3=%localvar3%" 
) 

在()塊中的變量被擴展。

0

進入cmd並搜索setx。它可以讓你製作系統變量和所有其他類型的東西,甚至可以在文件中找到變量的x和y座標。