0

我想编写一个简单的批处理文件,我想在其中设置基于机器架构的环境变量。如下:

set ARCH=%PROCESSOR_ARCHITECTURE%
echo %ARCH%
if %ARCH%==x86 (
  set JAVA_ROOT=C:\Progra~1\Java\j2re1.4.2_13
) else (
  set JAVA_ROOT=C:\Progra~2\Java\j2re1.4.2_13
)
echo JAVA_ROOT is %JAVA_ROOT%

在架构为“AMD64”的 64 位机器上,JAVA_ROOT 将在 echo 语句中显示为“C:\Progra~2\Java\j2re1.4.2_13”。但是当我运行一个使用这个文件的应用程序时,JAVA_ROOT 的第一个值会被选中'C:\Progra~1\Java\j2re1.4.2_13'。即使我在 64 位 Windows7 上运行它,我也不知道为什么它会出现在“if”部分。当我回应

4

2 回答 2

2

不依赖 x64 特定变量的替代解决方案:

IF NOT EXIST %WINDIR%\SysWOW64\regedit.exe GOTO PLATX86
:PLATX64
ECHO PLATFORM IS X64
GOTO PLATDONE
:PLATX86
ECHO PLATFORM IS X86
GOTO PLATDONE
:PLATDONE

它对我有用,也可能对你有用。

于 2010-12-23T07:56:29.577 回答
0

如果您%SystemRoot%\syswow64\cmd.exe在 64 位 Windows 上运行批处理文件,可能是因为您是从 32 位应用程序启动它,那么%PROCESSOR_ARCHITECTURE%将等于x86,而不是AMD64. 要检测这种情况,您可以使用%PROCESSOR_ARCHITEW6432%变量。这是一篇包含更多信息的博客文章

但是,如果您只想找到 32 位 Java 路径,则不必担心,因为如果您使用%ProgramFiles%变量,WOW64 会为您处理:

if "%PROCESSOR_ARCHITECTURE%" == "x86" set JAVA_ROOT=%ProgramFiles%\Java\j2re1.4.2_13
if "%PROCESSOR_ARCHITECTURE%" == "AMD64" set JAVA_ROOT=%ProgramFiles(x86)%\Java\j2re1.4.2_13
if not defined JAVA_ROOT (
  echo Unsupported processor architecture.
  exit /b 1
)
if not exist %JAVA_ROOT%\. (
  echo Java 1.4.2_13 is not installed.
  exit /b 1
)

请注意,我避免使用if condition ( command ) else ( command )设置表单JAVA_ROOT。这是因为%ProgramFiles(x86)%包含括号,cmd.exe如果我使用该形式,这将导致错误解析 if 语句。对于更复杂的命令或更复杂的条件,使用call调用子程序可能会更好。(使用更具表现力的语言会更好,但这并不能回答问题。)

于 2010-05-20T02:09:05.020 回答