2012-03-13 9 views
34

Windowのバッチスクリプトでバグが発生したと思います。Windowsバッチ変数が設定されない

拡張されたif文にある変数を設定できません。ここで

は私のスクリプトの孤立一部です:

@echo off 

set success=1 
set Version=12345 
set Target=Client 
set Type=456 
set dir= 
set zip= 

if "%Version%"=="" set success=0 
if "%Type%"=="" set success=0 

if 1==1 set test=42 

if %success%==1 (
    set test2=57005 
    if "%Target%"=="Client" (
     set dir=ModName v%Version% 
     set zip=ModName v%Version% %Type%.zip 
     echo Version: %Version% 
     echo Type: %Type% 
     echo. 
     echo Target: %Target% 
     echo  dir: %dir% 
     echo  zip: %zip% 
     echo. 
     echo test: %test% 
     echo test2: %test2% 
    ) 
) else (
    echo Not successful. 
) 

これはCMDのブランドの新しいインスタンスから出力さ:

C:\Users\RandomClown\Desktop>test.bat 
Version: 12345 
    Type: 456 

Target: Client 
    dir: 
    zip: 

    test: 42 
    test2: 

あなたは気づくべきことif文という一行れます正しく設定します。 複数行ifは、セットではないものを実行します。私は何も見逃したとは思わない。 また、行が実行されなかったelse (echo Not successful.)として、複数行のif文が正しく行を実行しています。

なぜ行が実行されませんでしたか?コマンドはを解析されるとき、ないそれらが実行されたときに

+0

これは高速応答でした。それを今見て。 – RandomClown

+4

可能性のある[ウィンドウ内のバッチSETが動作しない場合は重複しています](http://stackoverflow.com/questions/9102422/windows-batch-set-inside-if-not-working) – chwarr

+0

この質問をヘッダーに入れる必要がありますバッチファイルの。 – SteveFest

答えて

65

あなたが何か;-)

cmdを逃したが、変数が展開されます。ブロック(...)(または実際には任意のブロック)を持つifまたはforの文は、その場合は単一のコマンドとして認識されます。だから、ブロック内の変数を設定するときには、は同じブロック内で変数を使用してみてください。変数はもうの前の値に置き換えられました。ブロックはの前に実行されます。

スティック

​​

バッチファイルの開始時と%zip%の代わりに!zip!を使用しています。この問題の詳細については、help setを参照してください。

+0

うわー、決してそれを知らなかった。知識をありがとう! – RandomClown

+0

tnaks obrigdo !! – durtto

-1

ms-dosの "set"コマンドは、すべての文字列を等号の後に置きます。だからあなたが書く場合

if "x"=="x" set a=foo else set a=bar 
echo %a% // output : foo else set a=bar 

実際に%a%は "foo else set a = bar"に設定され、fooではなく設定されます。 1行に複数のコマンドがある場合、setコマンドには常に "()"を使います。

if "%1"=="" (set a=20) else (set a=%1)  
+1

"set"コマンドは、常に等号の後のすべての文字列を受け取るわけではありません。例:set one = 1&echo Hiya。しかし、かっこについての良い点は、彼らは本当に非常に有用です。 –

関連する問題