2

何らかの理由で、%NetVerClientOrFull% を IF ステートメント内に出力することができません。何も変更しなくても、そうなる場合とそうでない場合があるので、これは本当に奇妙です。複数のマシンでテストしましたが、同じ結果が得られました。IF ステートメント内で %NetVer% を使用すると、常に出力されます。何が起こっているのですか?

ECHO クライアントまたはフル? %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

これに追加すると、3回目の実行で機能するように見えますが、意味がありません:

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

1 に答える 1

4

これは、ステートメントが実行されたときではなく、ブロックを読み取るときにパーサーが変数を展開するためです。ブロック内のステートメントには、このブロックに入る前if ()に設定された変数が表示されます。この問題と、それを (遅延拡張を使用して) 克服する方法は、ヘルプで詳しく説明されています。コマンドラインから実行するだけです。同様の例も含まれています。ここでも説明されています:IF内のWindowsバッチSETが機能しないsethelp set

3 回目 (およびそれ以降) の実行で印刷されるのはなぜですか? 使用しないためsetlocal、次にバッチを実行すると、前回の実行で設定された変数が表示されます。を削除またはコメント@echo offして、新しく起動したコンソールからバッチを実行します。変数がどのように展開されるか、および 3 回目以降にのみ機能する理由がわかります。

于 2012-08-24T19:33:35.743 に答える