我想编写一个简单的批处理文件,我想根据机器架构设置环境变量。如下:
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'部分。当我回应
答案 0 :(得分: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
它对我有用,也可能适合你。
答案 1 :(得分:0)
如果您在64位Windows上使用%SystemRoot%\syswow64\cmd.exe
运行批处理文件,可能是因为您是从32位应用程序启动它,那么%PROCESSOR_ARCHITECTURE%
将等于{{1 },而不是x86
。要检测此情况,您可以使用AMD64
变量。这是一个blog post with more info。
但是,如果您只想查找32位Java路径,则不必担心,因为如果您使用%PROCESSOR_ARCHITEW6432%
变量,WOW64会为您处理:
%ProgramFiles%
请注意,我避免使用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)%
错误地使用if语句。对于更复杂的命令或更复杂的条件,使用cmd.exe
调用子例程可能会更好。 (使用更具表现力的语言会更好,但这不能回答这个问题。)