2013-03-19 11 views
6

ファイルからパスを読み込んで環境変数に設定するバッチファイルを作成しています。このバッチファイルは、変数を取得するために他の多くのバッチファイルによって使用されます(呼び出されます)。私が問題に直面したバッチファイルを書いている間、私はSETLOCAL ENABLEDELAYEDEXPANSIONを使ってこの問題を克服しました。しかし、それを使用している他のバッチファイルは、変数セットを取得することができません。以下は バッチスクリプトは、他のバッチファイルによってアクセスされるsetlocal変数を作成します。

は、私は変数が

another.bat 

    call getVariables.dat 
    echo "%JAVA%" 

設定を取得するには、上記batachファイルを使用しています、私の別のバッチファイルで

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! 
) 

バッチスクリプトである。しかし、エコーは、それをどこに「」印刷されます設定されていません。これがsetlocalの場合、どうすればこの問題を解決できますか?また、展開を遅らせ、実行時に発生させるためにsetlocalが必要です。この問題の解決策はありますか?私を助けてください。

答えて

4

このendlocal & set str=valueは不思議に作用します。

+1

それは私の問題でした。私はすべてのスクリプトでSETLOCALを使用する習慣があります。最後に、問題の原因となった1つの例外が見つかりました。 – djangofan

2

これは本当にあなたがやっていることと、完全なスクリプトを投稿したかどうかにかかっています。このgetVariables.batの唯一の目的は、変数は、ファイルをFOM設定する場合

まず、あなたは次

%test.dat%アンバランスを持っている、それは、ない .dat

.bat名前のバッチファイルに次のをお勧めします次いで

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

のような行(TEST.DAT)

は完全に適切です。それは4行です(実際に試してみると1に縮約できます)。

enabledelayedexpansionsetlocalが必要なのは、 WITHIN THE LOOP WHERE YOU'RE CHANGING THE VALUESを変更しています。最終的にはこれらの行が削除され、enabledelayedexpansionとなります。が失われます。テストのために

、あなたはgetVariables.batがしかCALL EDであれば、その後も、@echo offラインが冗長である、実際には

@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 

を書くことができ - あなたが実行してきたと仮定し@echo off呼び出し元のバッチから。

10

次トリック使用し、ローカル変数の値に複数のグローバル変数を設定する:ENDLOCALが実行される前に()ブロック内の変数が展開され

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

を。

0

cmdに入り、setxを検索します。システム変数や他のすべての種類のものを作成して、ファイル内の変数のx座標とy座標を見つけることさえできます。

関連する問題