批处理文件的IF语句中的变量不打印(ECHO)

时间:2012-08-24 16:32:14

标签: batch-file

出于某种原因,我无法在IF语句内部打印%NetVerClientOrFull%。这真的很奇怪,因为它有时甚至在我没有改变任何东西时也会这样做。我已在多台机器上测试过相同的结果。如果我在IF语句中使用%NetVer%总是打印。有什么想法发生了什么?

ECHO客户还是全部? %NetVerClientOrFull%(应显示客户端或完整,有时会显示)

@echo off
  set frameworkDirectory=Reg query "HKLM\Software\Microsoft\NET Framework Setup\NDP"
  FOR /F "TOKENS=6 DELIMS=\." %%A IN ('%frameworkDirectory%') DO set NetVer=%%A
  ECHO The most current version of the .NET Framework installed is: %NetVer% 

  if "%NetVer%"=="v4" (
  set clientOrFullDirectory=Reg query "HKLM\Software\Microsoft\NET Framework Setup\NDP\v4"
  FOR /F "TOKENS=7 DELIMS=\." %%A IN ('%clientOrFullDirectory%') DO set NetVerClientOrFull=%%A
  ECHO Client or Full? %NetVerClientOrFull%

  )

pause

要添加到它上面似乎它在我的第三次运行中起作用,没有任何意义:

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\Nick>C:\Users\Nick\Desktop\FrameworkVersionChecker.bat
The most current version of the .NET Framework installed is: v4
Client or Full?
Press any key to continue . . .

C:\Users\Nick>C:\Users\Nick\Desktop\FrameworkVersionChecker.bat
The most current version of the .NET Framework installed is: v4
Client or Full?
Press any key to continue . . .

C:\Users\Nick>C:\Users\Nick\Desktop\FrameworkVersionChecker.bat
The most current version of the .NET Framework installed is: v4
Client or Full? Full
Press any key to continue . . .

1 个答案:

答案 0 :(得分:4)

这是因为解析器在读取块时扩展变量,而不是在执行它的语句时扩展变量。您在if ()块内的语句会看到变量,因为它们在之前设置为到此块。在set帮助中很好地解释了这个问题,以及如何克服它(通过使用延迟扩展)。只需从命令行执行help set - 甚至包含类似的示例。这里也解释了:windows batch SET inside IF not working

为什么它会在第三次(及后续)运行时打印?您不使用setlocal - 因此,当您下次执行批处理时,它将看到上次运行中设置的变量。删除或评论@echo off,然后从刚启动的控制台执行批处理。您将看到变量如何扩展以及为什么它仅在第3次起作用。