12

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

以下はバッチスクリプトです。

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

私の別のバッチファイルでは、上記のバッチファイルを使用して変数セットを取得しています

   another.bat
 
   call getVariables.dat
   echo "%JAVA%"

しかし、エコーは設定されていない "" を出力しています。これが原因である場合setlocal、どうすればこれを克服できますか? setlocalまた、展開を遅らせて実行時に発生させる必要もあります。この問題を解決するにはどうすればよいですか?

4

4 に答える 4

22

複数のグローバル変数をローカル変数の値に設定するには、次のトリックを使用します。

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

( ) ブロック内の変数は、endlocal が実行される前に展開されます。

于 2013-08-17T17:39:09.653 に答える
5

これendlocal & set str=valueは驚くべきことです。

于 2013-03-19T08:40:34.487 に答える
3

それは本当にあなたがしていること、そしてあなたが完全なスクリプトを投稿したかどうかにかなり依存します。

まず、あなたは不均衡%です%test.dat

次に、バッチファイルに名前を付け.batないことをお勧めします.dat

次に、これの唯一の目的が次のgetVariables.batような行のファイル(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必要なのは、だけであるということです。最終的にそれらの行を削除すると、その存在理由が失われます。setlocalWITHIN THE LOOP WHERE YOU'RE CHANGING THE VALUESenabledelayedexpansion

テストのために、あなたは書くことができます

@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

于 2013-03-19T10:15:36.217 に答える
1

cmd に入り、setx を検索します。システム変数や、ファイル内の変数の x 座標と y 座標を見つけるなど、あらゆる種類のものを作成できます。

于 2014-03-01T21:41:19.253 に答える