批处理文件:将结果代码存储到变量中

时间:2012-11-01 19:29:51

标签: batch-file

你能看出为什么会显示0

的原因
"%ConnectDirectExe%" -f"%ConnectDirectCredentials%" < "%CurrentCDConfigFile%" > "%CurrentCDTaskLogFile%"    
ECHO %errorlevel%  

但这显示为空白?

"%ConnectDirectExe%" -f"%ConnectDirectCredentials%" < "%CurrentCDConfigFile%" > "%CurrentCDTaskLogFile%"    
SET Result=%errorlevel%  
ECHO errorlevel is %Result%

请注意,两种情况下的“%ConnectDirectExe%”行完全匹配。如果我反转块以相反的顺序运行,结果也会被反转。

为什么我不能在结果中存储%errorlevel%的结果并显示它?它一直显得空白。

更新

如果我的SET语句出现在IF块中,似乎没有被执行。

鉴于以下批处理文件,if.bat:

echo off

SET Result=1
ECHO ResultCaption1=%Result%

IF 1 equ 1 (
    SET Result=2
    ECHO ResultCaption2=%Result%
) else (
  ECHO 1 is not = 2
)

当我运行它时,我看到了这个输出:

C:\Batch>if.bat

C:\Batch>echo off
ResultCaption1=1
ResultCaption2=1

C:\Batch>

不应该是第二个ECHO显示

ResultCaption2=2

?

1 个答案:

答案 0 :(得分:1)

我怀疑你的代码嵌入在带括号的块中,可能是IF语句或FOR循环的一部分。问题是当解析行时发生扩展,并且在执行块中的任何内容之前立即解析整个块。因此%errorlevel%将是执行命令之前的值,%Result%可能未定义。

解决方案是使用延迟扩展,必须先启用延迟扩展才能使用。从命令提示符处键入HELP SET以获取有关延迟扩展的更多信息以及在处理代码块时它可以提供的帮助。

setlocal enableDelayedExpansion
for ... in(...) do (
  "%ConnectDirectExe%" -f"%ConnectDirectCredentials%" < "%CurrentCDConfigFile%" > "%CurrentCDTaskLogFile%"
  SET Result=!errorlevel!
  ECHO errorlevel is !Result!
)