出于某种原因,我无法在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 . . .
答案 0 :(得分:4)
这是因为解析器在读取块时扩展变量,而不是在执行它的语句时扩展变量。您在if ()
块内的语句会看到变量,因为它们在之前设置为到此块。在set
帮助中很好地解释了这个问题,以及如何克服它(通过使用延迟扩展)。只需从命令行执行help set
- 甚至包含类似的示例。这里也解释了:windows batch SET inside IF not working
为什么它会在第三次(及后续)运行时打印?您不使用setlocal
- 因此,当您下次执行批处理时,它将看到上次运行中设置的变量。删除或评论@echo off
,然后从刚启动的控制台执行批处理。您将看到变量如何扩展以及为什么它仅在第3次起作用。