批处理文件变量作用域问题

5

当我尝试创建一个“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个回答

7

您需要启用延迟扩展:

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_FILENAMEOUTPUT_FILENAME的值在执行时扩展。

谢谢,那个完美地运行了。这是我第一次尝试在批处理文件中进行任何真正的流程控制,所以我一定会记下来以备将来参考! - user3241379

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%

现在,在块内部更改了变量,但是这些值随后会在块外部被访问。


感谢提供额外的信息 - 我已经使用了 Laf 的解决方案,因为它与批处理文件的其他部分更加匹配(上面的片段只是一个摘录),但这也是有用的知识。 - user3241379

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接