批处理文件用于检查64位或32位操作系统。

57

我可以在批处理文件中检查当前计算机是否运行64位操作系统或32位操作系统吗?

编辑:

在网上找到了这个,现在对我来说已经足够好了:


4
直到一个打包不良的应用程序创建了这样一个文件夹(比如在32位系统上的Program Files(x86)),你的脚本就会失败(我曾经遇到过这种情况),之前都挺好的。 - Adil Hindistan
你最终使用了哪个答案? - Seanny123
23个回答

79

这是按照 Microsoft 的知识库参考文献(http://support.microsoft.com/kb/556009)所述的正确检查方式,我已将其编辑成一行代码。

它不依赖于任何环境变量或文件夹名称,而是直接在注册表中进行检查。

如下面的批处理文件所示,它设置了一个名为OS的环境变量,等于32BIT64BIT,您可以根据需要使用。

@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

3
这些信息在这个答案中已经提供过了,但我更喜欢你的实现方式,因为它不使用一个中间文件来保存结果。 - Ken White
3
你也犯了一个错误 - 应该是find /i "x86", 没有“x32”这个东西。 - mikalai
7
你可能不想使用“OS”作为你的环境变量,因为Windows已经使用了该变量。在我的计算机上,“OS=Windows_NT”。 - Adisak
2
@echo off 行之后立即加上 setlocal - 这将确保环境的生命周期随着批处理的终止而结束,因此使用操作系统变量不会造成任何影响。 - Matt
1
如果任何十六进制值以 0x86 开头,则此代码在64位系统上会失败。 - Wiimm
显示剩余4条评论

37

我使用以下任意一种:

: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)

希望这有所帮助。


1
这很好,但我更喜欢使用 IF DEFINED ProgramFiles(x86) ... - paddy
7
谁发明了批处理if/else语句...我从未见过如此糟糕的解释器。 - Mgamerz
3
您对于 %PROCESSOR_ARCHITECTURE% 的测试是否相反了?在 64 位机器上,我得到的是 AMD64。如果 %PROCESSOR_ARCHITECTURE% 总是有效的话,那么它比检查任何有缺陷软件都可以创建的目录要好得多。请注意,这不会改变原意。 - Rory
3
发现一个错误-必须交换 IF "%PROCESSOR_ARCHITECTURE%"=="x86" (set bit=x64) 中的正负分支。 - mikalai
1
@Mgamerz 当然,这远非理想,但请注意,批处理脚本可以(为了保持清晰,应该)通过换行符分隔命令,包括在if/else块内部,只要开头的括号与条件在同一行上。这使得事情更加易读 - 在可用的限制范围内! - underscore_d

21

如果只做这些,似乎会起作用:

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命令可以解决问题。


2
@5YrsLaterDBA:如果您有具体要求,您需要在问题中说明。您对实际提出的问题有两个正确答案。您应该接受其中一个并点赞这两个答案。 - Carey Gregory
2
注意:仅测试PROCESSOR_ARCHITECTURE不足以确定操作系统的位数。上面的示例仅测试了脚本cmd.exe进程本身的位数。要像问题中所述地测试操作系统的位数,您还需要检查PROCESSOR_ARCHITEW6432变量的存在,因为在64位操作系统上可能有32位进程。 - Andry
@Andry:在我写这些答案的时候,比你回答的时间早了9年,那个脚本还是有用的。随着时间的推移,事物都可能会有多多少少的变化。感谢你指出现在的情况。 - BendaThierry.com
@ThierryB 这并不是现今的依赖。x64操作系统和相关变量的性质从它第一次出现时就没有改变。它有用的原因是你只使用了其中一半,而没有测试其他情况。如果你不相信我,那就选择你想要的虚拟机,在其中安装所有的Windows XP/7/8等版本,带或不带SP,亲自看看吧。 - Andry
我会的,但是我已经很久没有使用Windows电脑了,而且我也不想用。谢谢你指出来。这对于这里的一些人肯定会有用。 - BendaThierry.com
如果批处理文件是从32位进程运行的,则%PROCESSOR_ARCHITECTURE%将给出x86。 - CCarter

8

在命令提示符中运行以下命令:

开始 -> 运行 -> 输入 cmd 并在出现的黑色框中输入以下命令:

wmic os get osarchitecture

我可以知道为什么这个回答有两个踩吗?我想知道为什么这个答案没有帮助。 - Emil Reña Enriquez
猜测下投票反对的原因可能是因为问题的方向是从命令提示符中运行命令,而不是将命令的输出放入批处理文件中并使用,这与问题所要求的不同。 - user66001
2
我认为原始问题期望得到适用于批处理文件的解决方法,例如: wmic os get osarchitecture | find "64" > NUL && set NumBits=64 || set NumBits=32否则,我认为这是最简洁的答案...前提是wmic始终存在于路径中... - Steven the Easily Amused

5

如果您以管理员身份运行脚本,则脚本可以使用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

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

参考 http://support.microsoft.com/kb/556009


4
"

'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

它运行得非常好!在Win7和Vista(x86和x64)上进行了测试。只需记住,如果您需要处理WOW64,则还应检查PROCESSOR_ARCHITEW6432(详细信息- http://goo.gl/tWDK3V)。 - Alex Klaus

4
PROCESSOR_ARCHITECTURE=x86

这将在Win32上出现,并且

PROCESSOR_ARCHITECTURE=AMD64

将出现Win64。

如果你正在倒行逆施地运行32位cmd.exe进程,那么Windows会呈现两个环境变量:

PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64

1
@5YrsLaterDBA 至少试着研究一下这个主题:http://www.computerhope.com/if.htm - Steve-o
顺便提一下,64位操作系统也可以是IA64。 - Joey
1
@Joey 我就像对待 Oracle 一样假装它不存在,啦啦啦 HP - 我听不见你说什么! - Steve-o
1
有关此变量在Win32 / Win64 / WOW64上的作用以及更多有用信息,请参阅:http://blogs.msdn.com/b/david.wang/archive/2006/03/26/howto-detect-process-bitness.aspx - the_mandrill
3
这只检测你正在使用的命令行解释器的位数,而不是操作系统本身的位数。在64位Windows上有两个版本的cmd.exe,一个是64位的,另一个是32位的(通常可以在这里找到:C:\Windows\SysWOW64\cmd.exe)。 - Igor Brejc
显示剩余3条评论

1
这是一条只有在64位为0,非64位为1的单行代码。我不能保证它适用于所有版本的Windows,但演示了一种确定方法。如果你知道所有可能的情况,可以添加多个findstr查询。基本上,你正在转储环境变量,并使用正则表达式搜索具有其行中的“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主版本不同,因此我最终选择了这个命令,而不是已知的环境变量名称,因为它更加可靠。


1
我对依赖环境持谨慎态度。如果使用英特尔处理器,即使期望“AMD64”始终存在,也要格外小心。而且,我还要三番五次地注意用户环境中是否有奇怪的东西,比如“IWISH=像模型5564这样快的amd图形驱动程序一样拥有一个食品加工器”。 - Steven the Easily Amused
如果您知道要查找的所有内容,可以添加多个findstr查询。我无法保证每个64位Windows版本都具有此环境变量。如果您想尽可能全面,可以查找您感兴趣的Windows版本的每个环境变量,并为每个可能的变量和值设置一个查询,以消除您的担忧。 - kayleeFrye_onDeck

1
所有答案的问题在于它们忽略了你的批处理文件是在32位还是64位的cmd.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 中运行您的批处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接