web-dev-qa-db-ja.com

Windowsバッチ変数が設定されない

Windowのバッチスクリプトのバグに遭遇したと思います。

展開された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は、セットではないものを実行します。私は何かを見逃したとは思わない。また、複数行のifステートメントは、else ( echo Not successful. )行が実行されなかったため、正しい行を正しく実行しています。

行が実行されなかったのはなぜですか?

46
RandomClown

あなたは何かを見逃した;-)

cmdは、コマンドが実行されるときではなく、コマンドが解析済みのときに変数を展開します。その場合、ブロック( ... )(または実際には任意のブロック)を含むifまたはforステートメントが単一のコマンドになります。したがって、ブロック内に変数を設定するとand同じブロックで変数を使用してみてください。変数はもうありません。変数が持っていた値に置き換えられましたbefore

スティック

setlocal enabledelayedexpansion

バッチファイルの先頭で、!Zip!の代わりに%Zip%を使用します。問題の詳細については、help setを参照してください。

87
Joey