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

Batch file 批处理文件的IF语句中的变量未打印(ECHO),batch-file,Batch File,由于某些原因,我无法在IF语句内部打印%NetVerClientOrFull%。这真的很奇怪,因为即使我没有改变任何东西,有时会,有时不会。我在多台机器上进行了测试,结果相同。如果在If语句中使用%NetVer%,则始终打印。知道发生了什么事吗 回显客户端或已满?%NetVerClientOrFull%应显示Client或Full,有时也会显示 @echo off set frameworkDirectory=Reg query "HKLM\Software\Microsoft\NET Fr

由于某些原因,我无法在IF语句内部打印%NetVerClientOrFull%。这真的很奇怪,因为即使我没有改变任何东西,有时会,有时不会。我在多台机器上进行了测试,结果相同。如果在If语句中使用%NetVer%,则始终打印。知道发生了什么事吗

回显客户端或已满?%NetVerClientOrFull%应显示Client或Full,有时也会显示

@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 . . .

这是因为解析器在读取块时扩展变量,而不是在执行语句时。if块中的语句可以看到变量,因为它们是在进入该块之前设置的。set帮助中很好地解释了这个问题,以及如何使用延迟扩展来克服它。只需从命令行执行帮助集,甚至还包含了类似的示例。这里也有解释:


为什么在第三次和后续运行时打印?您不使用setlocal—因此,当您下次执行批处理时,它将看到在上一次运行中设置的变量。删除或注释@echo off,并从新启动的控制台执行批处理。您将看到变量是如何展开的,以及为什么它只在第三次之后才起作用

这是因为解析器在读取块时扩展变量,而不是在执行语句时。if块中的语句可以看到变量,因为它们是在进入该块之前设置的。set帮助中很好地解释了这个问题,以及如何使用延迟扩展来克服它。只需从命令行执行帮助集,甚至还包含了类似的示例。这里也有解释:

为什么在第三次和后续运行时打印?您不使用setlocal—因此,当您下次执行批处理时,它将看到在上一次运行中设置的变量。删除或注释@echo off,并从新启动的控制台执行批处理。您将看到变量是如何展开的,以及为什么它只在第三次之后才起作用