如果批处理脚本中有条件,则变量内部不会更新

时间:2015-05-14 09:51:54

标签: batch-file

  @echo off

  SET CONFIGS_QUASAR1=Q1_1 Q1_2 Q1_3 Q1_4 Q1_5 Q1_6
  SET CONFIGS_QUASAR2=Q2_1 Q2_2 Q2_3 Q2_4 Q2_5 Q2_6
  SET CONFIGS_QUASAR3=Q3_1 Q3_2 Q3_3 Q3_4 Q3_5 Q3_6
  SET CONFIGS_QUASAR0B=Q0B_1 Q0B_2 Q0B_3 Q0B_4 Q0B_5 Q0B_6

  FOR %%A IN (QUASAR1 QUASAR2 QUASAR3 QUASAR0B) DO (
    IF "%%A" == "QUASAR1" (
      SET CONFIGS=%CONFIGS_QUASAR1%
    ) ELSE IF "%%A" == "QUASAR2" (
      SET CONFIGS=%CONFIGS_QUASAR2%
    ) ELSE IF "%%A" == "QUASAR3" (
      SET CONFIGS=%CONFIGS_QUASAR3%
    ) ELSE IF "%%A" == "QUASAR0B" (
      SET CONFIGS=%CONFIGS_QUASAR0B%
    )

    echo %%A
    echo %CONFIGS%
  )

  pause

我对批处理文件编程很新。 我编写了一个非常小的程序来在'if'条件下设置变量,但变量(“CONFIGS”)在上述程序中没有变得过时。

请检查程序并告诉我应该修改什么?

批处理文件的输出:

QUASAR1
Q0B_1 Q0B_2 Q0B_3 Q0B_4 Q0B_5 Q0B_6
QUASAR2
Q0B_1 Q0B_2 Q0B_3 Q0B_4 Q0B_5 Q0B_6
QUASAR3
Q0B_1 Q0B_2 Q0B_3 Q0B_4 Q0B_5 Q0B_6
QUASAR0B
Q0B_1 Q0B_2 Q0B_3 Q0B_4 Q0B_5 Q0B_6

3 个答案:

答案 0 :(得分:1)

对不起。虽然您的问题与npocmaka在答案中指出的延迟扩展直接相关,但我想提请您注意以下建议。

当您使用延迟扩展时,您可以充分利用第二个(延迟)扩展的事实!可以处理先前已修改或%扩展%的文本。这是一个功能强大的批处理文件功能,可以避免复杂的操作。

例如,假设您有一个名为result的变量,它将存储另一个名为term的变量加上值1,2,3和11的总和。一种方法是这样做:

for %%a in (1 2 3 11) do (
   if %%a == 1 (
      set /A result=term+1
   ) else if %%a == 2 (
      set /A result=term+2
   ) else if %%a == 3 (
      set /A result=term+3
   ) else if %%a == 11 (
      set /A result=term+11
   )
   echo The sum of !term! plus %%a is !result!
)

但是,您可以得出结论,所有这些IF都不是必需的,因为您可以通过这种方式直接获取第二项的值:

for %%a in (1 2 3 11) do (
   set /A result=term+%%a
   echo The sum of !term! plus %%a is !result!
)

嗯,同样的结论可能会以这种方式在您的代码中使用:

@echo off
setlocal EnableDelayedExpansion

rem Create CONFIGS_QUASAR 1, 2, 3 and 0B strings
FOR %%A IN (1 2 3 0B) DO (
   rem Initialize this string
   SET "CONFIGS_QUASAR%%A="
   rem Fill this string with their values
   FOR /L %%I IN (1,1,6) DO SET "CONFIGS_QUASAR%%A=!CONFIGS_QUASAR%%A! Q%%A_%%I"
)

FOR %%A IN (1 2 3 0B) DO (
   SET CONFIGS=!CONFIGS_QUASAR%%A!

   echo QUASAR%%A
   echo !CONFIGS!
)

pause

输出:

QUASAR1
 Q1_1 Q1_2 Q1_3 Q1_4 Q1_5 Q1_6
QUASAR2
 Q2_1 Q2_2 Q2_3 Q2_4 Q2_5 Q2_6
QUASAR3
 Q3_1 Q3_2 Q3_3 Q3_4 Q3_5 Q3_6
QUASAR0B
 Q0B_1 Q0B_2 Q0B_3 Q0B_4 Q0B_5 Q0B_6

答案 1 :(得分:0)

<强> delayed expansion!!!

 @echo off

  SET CONFIGS_QUASAR1=Q1_1 Q1_2 Q1_3 Q1_4 Q1_5 Q1_6
  SET CONFIGS_QUASAR2=Q2_1 Q2_2 Q2_3 Q2_4 Q2_5 Q2_6
  SET CONFIGS_QUASAR3=Q3_1 Q3_2 Q3_3 Q3_4 Q3_5 Q3_6
  SET CONFIGS_QUASAR0B=Q0B_1 Q0B_2 Q0B_3 Q0B_4 Q0B_5 Q0B_6

  setlocal enableDelayedExpansion
  FOR %%A IN (QUASAR1 QUASAR2 QUASAR3 QUASAR0B) DO (
    IF "%%A" == "QUASAR1" (
      SET CONFIGS=CONFIGS_QUASAR1%
    ) 
    IF "%%A" == "QUASAR2" (
      SET CONFIGS=%CONFIGS_QUASAR2%
    ) 
    IF "%%A" == "QUASAR3" (
      SET CONFIGS=%CONFIGS_QUASAR3%
    ) 
    IF "%%A" == "QUASAR0B" (
      SET CONFIGS=%CONFIGS_QUASAR0B%
    )

    echo %%A
    echo !CONFIGS!
  )

  pause

答案 2 :(得分:0)

对于上述评论感到抱歉,

我得到了答案,批处理文件现在工作正常。 请参阅下面的更正代码。 非常感谢你:))

    @echo off
    Setlocal EnableDelayedExpansion

    SET CONFIGS_QUASAR1=Q1_1 Q1_2 Q1_3 Q1_4 Q1_5 Q1_6
    SET CONFIGS_QUASAR2=Q2_1 Q2_2 Q2_3 Q2_4 Q2_5 Q2_6
    SET CONFIGS_QUASAR3=Q3_1 Q3_2 Q3_3 Q3_4 Q3_5 Q3_6
    SET CONFIGS_QUASAR0B=Q0B_1 Q0B_2 Q0B_3 Q0B_4 Q0B_5 Q0B_6

    FOR %%A IN (QUASAR1 QUASAR2 QUASAR3 QUASAR0B) DO (
      IF "%%A" == "QUASAR1" (
        SET CONFIGS=%CONFIGS_QUASAR1%
      ) ELSE IF "%%A" == "QUASAR2" (
        SET CONFIGS=%CONFIGS_QUASAR2%
      ) ELSE IF "%%A" == "QUASAR3" (
        SET CONFIGS=%CONFIGS_QUASAR3%
      ) ELSE IF "%%A" == "QUASAR0B" (
        SET CONFIGS=%CONFIGS_QUASAR0B%
      )

      echo %%A
      echo !CONFIGS!
    )

    pause