2012-02-23 3 views
0

SETは、次のコード?:Unworking SET

ECHO OFF 
FOR /L %%b IN (-1,1,1) DO (
SET /A _lat=%%b 
ECHO variable lat: %_lat% 
ECHO variable b: %%b 
ECHO: 
) 

出力に何もしていない理由PCAN誰でも説明:

variable lat: 
variable b: -1 

variable lat: 
variable b: 0 

variable lat: 
variable b: 1 

私が試した/なしSETもちろん、私は、変数%% bがファイルからの文字列であって、通常どおりに動作するFOR内で試しましたが、variabl %% bが変更された数値であっても動作しません。

ご意見がありましたら教えてください。私が望むものを表示するために%% bを使うことはできますが、これは大きなスクリプの一部であるため、より読みやすくするために、変数をapproproateするようにしたいと思います。

+0

関連質問:http://stackoverflow.com/questions/980718/cmd-for-loop-does-not-hold-set-a-value –

答えて

1

あなたがENABLEDELAYEDEXPANSIONを使用する必要があります。以下で試してみてください:

setlocal ENABLEDELAYEDEXPANSION 

echo off 
for /L %%b in (-1,1,1) do (
    set /A _lat=%%b 
    echo variable lat: !_lat! 
    echo variable b: %%b 
    echo: 
) 
+0

thx、それはまさにそれです:) – MasterPJ

1

SET /?の出力をコンソールで確認してください。これを有効にするには、遅延環境変数展開を有効にして使用する必要があります。ここでhelp setから関連するスニペットはです:

最後に、遅延環境変数の展開のサポートが が追加されました。このサポートは、既定では常に無効になっていますが、CMD.EXEへの/ Vコマンドラインスイッチを使用して を有効または無効にすることができます。 CMD /?を参照してください。

遅延環境変数拡張は、実行時ではなく、 行のテキストを読み込んだときに発生する現在の展開の制限を回避するために便利です。次の例 は即時変数展開に問題があることを示しています

set VAR=before 
if "%VAR%" == "before" (
    set VAR=after 
    if "%VAR%" == "after" @echo If you see this, it worked 
) 

は、文を読むと、それは論理的に 含まれているため は、最初に置換された文の両方でIF%のVAR%以来、メッセージを表示することはありませんIFの本体。これは複合文です。コンパイルステートメントの中の のIFは、実際には「前」と「後で」の「 」を比較しています。予想通り同様に、次の例 では動作しません。

set LIST= 
for %i in (*) do set LIST=%LIST% %i 
echo %LIST% 

それは、現在のディレクトリ内のファイルのリストを構築 ではなく、ただ最後に見つかったファイルにLIST変数に設定されますしないことに。 また、これは、 FOR文が読み込まれたときに%LIST%が1回だけ展開され、その時点でLIST変数が空であるためです。 だから我々が実行されているループFOR実際には、次のとおりです。ただ最後に見つかったファイルにリストを設定し続ける

for %i in (*) do set LIST= %i 

遅延環境変数拡張では、 文字(感嘆符)を使用して、実行時に環境変数を拡張することができます。遅れ変数の展開が有効になっている場合は、上記の 例が意図したとおりに動作するように、次のように書くことができます。

set VAR=before 
if "%VAR%" == "before" (
    set VAR=after 
    if "!VAR!" == "after" @echo If you see this, it worked 
) 

set LIST= 
for %i in (*) do set LIST=!LIST! %i 
echo %LIST% 
+0

ありがとうございました、I問題を解決しました。私は「遅延した環境変数の拡張」のようなものは知らなかった。だから次回は、私は本当に助けを読むでしょう。 – MasterPJ