这是按照 Microsoft 的知识库参考文献(http://support.microsoft.com/kb/556009)所述的正确检查方式,我已将其编辑成一行代码。
它不依赖于任何环境变量或文件夹名称,而是直接在注册表中进行检查。
如下面的批处理文件所示,它设置了一个名为OS的环境变量,等于32BIT或64BIT,您可以根据需要使用。
@echo OFF
reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > NUL && set OS=32BIT || set OS=64BIT
if %OS%==32BIT echo This is a 32bit operating system
if %OS%==64BIT echo This is a 64bit operating system
find /i "x86"
, 没有“x32”这个东西。 - mikalai@echo off
行之后立即加上 setlocal
- 这将确保环境的生命周期随着批处理的终止而结束,因此使用操作系统变量不会造成任何影响。 - Matt0x86
开头,则此代码在64位系统上会失败。 - Wiimm我使用以下任意一种:
:CheckOS
IF EXIST "%PROGRAMFILES(X86)%" (GOTO 64BIT) ELSE (GOTO 32BIT)
:64BIT
echo 64-bit...
GOTO END
:32BIT
echo 32-bit...
GOTO END
:END
我设置了bit
变量,稍后在我的脚本中使用它来运行正确的设置。
:CheckOS
IF EXIST "%PROGRAMFILES(X86)%" (set bit=x64) ELSE (set bit=x86)
还是……
:CheckOS
IF "%PROCESSOR_ARCHITECTURE%"=="x86" (set bit=x86) else (set bit=x64)
希望这有所帮助。
IF DEFINED ProgramFiles(x86) ...
。 - paddy%PROCESSOR_ARCHITECTURE%
的测试是否相反了?在 64 位机器上,我得到的是 AMD64
。如果 %PROCESSOR_ARCHITECTURE%
总是有效的话,那么它比检查任何有缺陷软件都可以创建的目录要好得多。请注意,这不会改变原意。 - RoryIF "%PROCESSOR_ARCHITECTURE%"=="x86" (set bit=x64)
中的正负分支。 - mikalai如果只做这些,似乎会起作用:
echo "%PROCESSOR_ARCHITECTURE%"
我发现这些脚本可以根据操作系统架构(x64或x86)执行特定的操作:
@echo off
echo Detecting OS processor type
if "%PROCESSOR_ARCHITECTURE%"=="AMD64" goto 64BIT
echo 32-bit OS
\\savdaldpm01\ProtectionAgents\RA\3.0.7558.0\i386\DPMAgentInstaller_x86 /q
goto END
:64BIT
echo 64-bit OS
\\savdaldpm01\ProtectionAgents\RA\3.0.7558.0\amd64\DPMAgentInstaller_x64 /q
:END
"C:\Program Files\Microsoft Data Protection Manager\DPM\bin\setdpmserver.exe" -dpmservername sa
请尝试寻找一种无需使用GOTO语句的方法...
对于在Unix系统下工作的人来说,uname -m
命令可以解决问题。
PROCESSOR_ARCHITECTURE
不足以确定操作系统的位数。上面的示例仅测试了脚本cmd.exe
进程本身的位数。要像问题中所述地测试操作系统的位数,您还需要检查PROCESSOR_ARCHITEW6432
变量的存在,因为在64位操作系统上可能有32位进程。 - Andry在命令提示符中运行以下命令:
开始 -> 运行 -> 输入 cmd
并在出现的黑色框中输入以下命令:
wmic os get osarchitecture
wmic os get osarchitecture | find "64" > NUL && set NumBits=64 || set NumBits=32
否则,我认为这是最简洁的答案...前提是wmic
始终存在于路径中... - Steven the Easily Amused如果您以管理员身份运行脚本,则脚本可以使用wmic命令。
FOR /f "tokens=2 delims==" %%f IN ('wmic os get osarchitecture /value ^| find "="') DO SET "OS_ARCH=%%f"
IF "%OS_ARCH%"=="32-bit" GOTO :32bit
IF "%OS_ARCH%"=="64-bit" GOTO :64bit
ECHO OS Architecture %OS_ARCH% is not supported!
EXIT 1
:32bit
ECHO "32 bit Operating System"
GOTO :SUCCESS
:64bit
ECHO "64 bit Operating System"
GOTO :SUCCESS
:SUCCESS
EXIT 0
*** Start ***
@echo off
Set RegQry=HKLM\Hardware\Description\System\CentralProcessor\0
REG.exe Query %RegQry% > checkOS.txt
Find /i "x86" < CheckOS.txt > StringCheck.txt
If %ERRORLEVEL% == 0 (
Echo "This is 32 Bit Operating system"
) ELSE (
Echo "This is 64 Bit Operating System"
)
*** End ***
'ProgramFiles(x86)'是一个由cmd.exe(32位和64位版本)自动定义的环境变量,仅在Windows 64位机器上存在。因此,请尝试以下操作:
"@ECHO OFF
echo Check operating system ...
if defined PROGRAMFILES(X86) (
echo 64-bit sytem detected
) else (
echo 32-bit sytem detected
)
pause
PROCESSOR_ARCHITECTURE=x86
这将在Win32上出现,并且
PROCESSOR_ARCHITECTURE=AMD64
将出现Win64。
如果你正在倒行逆施地运行32位cmd.exe
进程,那么Windows会呈现两个环境变量:
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64
cmd.exe
,一个是64位的,另一个是32位的(通常可以在这里找到:C:\Windows\SysWOW64\cmd.exe
)。 - Igor Brejcfindstr
查询。基本上,你正在转储环境变量,并使用正则表达式搜索具有其行中的“processo
”+“64
”的内容。管道只是为了抑制匹配行。如果我在我的当前设备上将其更改为set | findstr /i processo.*64
,则结果如下: C:\Windows\System32>set | findstr /i processo.*64
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 158 Stepping 9, GenuineIntel
这是一个一行命令,用于检测您的处理器是否为64位AMD
set | findstr /i processo.*amd.*64 > nul 2>&1
您可以将这些作为起点并根据您的要求进行修改。由于我使用的Windows主版本不同,因此我最终选择了这个命令,而不是已知的环境变量名称,因为它更加可靠。
findstr
查询。我无法保证每个64位Windows版本都具有此环境变量。如果您想尽可能全面,可以查找您感兴趣的Windows版本的每个环境变量,并为每个可能的变量和值设置一个查询,以消除您的担忧。 - kayleeFrye_onDeckcmd.exe
下运行,这可能会发生在64位操作系统上。C:\Windows\System32
文件夹中,它最终会被放置在C:\Windows\SysWOW64
文件夹中。@ECHO OFF
IF "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
ECHO Running under 64-bit CMD.EXE on 64-bit Windows...
REM C:\Windows\System32 is 64-bit here
) ELSE (
IF "%PROCESSOR_ARCHITECTURE%"=="x86" IF "%PROCESSOR_ARCHITEW6432%"=="AMD64" (
ECHO Running under 32-bit CMD.EXE on 64-bit Windows...
REM C:\Windows\System32 is redirected to C:\Windows\SysWOW64 here
) ELSE (
ECHO Running under 32-bit CMD.EXE on 32-bit Windows...
REM C:\Windows\System32 is 32-bit here
)
)
这是唯一安全的检查批处理文件的方式 -- 您不应该假定用户(或第三方程序)将在 64 位操作系统上的 64 位 cmd.exe
中运行您的批处理。