50

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:

注意すべきことは、1 行の if ステートメントが正しく設定されていることです。複数行の if は、セットではないものを実行します。私は何も逃したとは思わない。else ( echo Not successful. )また、行が実行されなかったため、複数行の if ステートメントは正しい行を正しく実行しています。

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

4

2 に答える 2

93

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

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

スティック

setlocal enabledelayedexpansion

バッチ ファイルの先頭に置き、!zip!代わりに%zip%. help set問題の詳細については、を参照してください。

于 2012-03-13T10:04:28.277 に答える