批处理文件变量范围问题

时间:2014-01-27 17:08:44

标签: batch-file scope

在尝试创建'dos'(Windows 7命令行)批处理文件时,我遇到了一个奇怪的变量范围问题,该文件执行一些字符串操作来创建新的文件路径。任何人都可以在下面的例子中看到为什么OUTPUT_FILENAME变量总是为空?

echo Enter the Data Input, S (Site) or U (User)
set /p DATA_TYPE=
echo.
echo Enter the Input File Name
set /p INPUT_FILENAME=
echo.
IF /I %DATA_TYPE%==u (
  set OUTPUT_FILENAME=%INPUT_FILENAME:\users\=\Users\Outputs\%
  set OUTPUT_FILENAME=%OUTPUT_FILENAME:xls=txt%
  echo Output:
  echo %OUTPUT_FILENAME%
)
IF /I %DATA_TYPE%==s (
  set OUTPUT_FILENAME=%INPUT_FILENAME:\sites\=\Sites\Outputs\%
  set OUTPUT_FILENAME=%OUTPUT_FILENAME:xls=txt%
  echo Outputs:
  echo %OUTPUT_FILENAME%
)

提前感谢您的任何帮助,这让我疯狂!

2 个答案:

答案 0 :(得分:5)

您需要启用延迟扩展:

setlocal EnableDelayedExpansion
echo Enter the Data Input, S (Site) or U (User)
set /p DATA_TYPE=
echo.
echo Enter the Input File Name
set /p INPUT_FILENAME=
echo.
SET OUTPUT_FILENAME=Empty
IF /I %DATA_TYPE%==u (
  set OUTPUT_FILENAME=!INPUT_FILENAME:\users\=\Users\Outputs\!
  set OUTPUT_FILENAME=!OUTPUT_FILENAME:xls=txt!
  echo Output:
  echo !OUTPUT_FILENAME!
)
IF /I %DATA_TYPE%==s (
  set OUTPUT_FILENAME=!INPUT_FILENAME:\sites\=\Sites\Outputs\!
  set OUTPUT_FILENAME=!OUTPUT_FILENAME:xls=txt!
  echo Outputs:
  echo !OUTPUT_FILENAME!
)

正如SET命令的帮助所述:

  

延迟环境变量扩展对于解决当读取文本行时发生的当前扩展的限制很有用,而不是在执行时。

因此,您需要使用延迟扩展来确保在执行时扩展INPUT_FILENAME OUTPUT_FILENAME的值。

答案 1 :(得分:4)

正如Laf正确指出的那样,代码需要延迟扩展。在批处理文件中,当到达行或块(括号中包含的所有行)时,在执行之前,将对其进行解析。在此解析阶段,每个变量读取都将替换为变量在执行开始之前 >的值。

如果在块内部更改了变量,并且想要在同一块中访问此更改的值,则需要延迟扩展。 Laf答案中的代码反映了如何做到

或者,如果可能,您可以将代码更改为不需要

echo Enter the Data Input, S (Site) or U (User)
set /p DATA_TYPE=
echo.
echo Enter the Input File Name
set /p INPUT_FILENAME=
echo.
IF /I %DATA_TYPE%==u (
  set OUTPUT_FILENAME=%INPUT_FILENAME:\users\=\Users\Outputs\%
)
IF /I %DATA_TYPE%==s (
  set OUTPUT_FILENAME=%INPUT_FILENAME:\sites\=\Sites\Outputs\%
)
set OUTPUT_FILENAME=%OUTPUT_FILENAME:xls=txt%
echo Output:
echo %OUTPUT_FILENAME%

现在,块内部已经更改了变量,但随后会从块中访问这些值。