批处理文件变量范围问题

use*_*379 5 scope batch-file

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

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%
)
Run Code Online (Sandbox Code Playgroud)

在此先感谢任何帮助,这让我疯了!

Laf*_*ica 6

您需要启用延迟扩展:

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!
)
Run Code Online (Sandbox Code Playgroud)

作为SET命令的帮助说明:

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

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