57

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

编辑:

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

4

22 回答 22

80

这是按照 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
于 2014-07-05T21:09:05.873 回答
38

我使用以下任何一种:

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

希望这可以帮助。

于 2012-10-30T16:54:07.130 回答
23

如果你只做这些似乎工作:

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可以做到这一点。

于 2012-09-07T16:54:01.663 回答
6

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

开始 -> 运行 -> 键入cmd并在生成的黑框中输入以下命令:

wmic os get osarchitecture
于 2014-01-20T05:54:19.817 回答
5

'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
于 2013-11-11T08:42:01.907 回答
5
PROCESSOR_ARCHITECTURE=x86

将出现在 Win32 上,并且

PROCESSOR_ARCHITECTURE=AMD64

将出现在 Win64 上。

如果您不正常地运行 32 位cmd.exe进程,那么 Windows 会提供两个环境变量:

PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64
于 2012-09-07T16:55:07.447 回答
5
*** 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

于 2013-11-06T04:41:43.533 回答
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
于 2016-03-14T05:07:31.740 回答
1

这里的答案都不适用于我的情况(64 位处理器但 32 位操作系统),所以这是对我有用的解决方案:

(set | find "ProgramFiles(x86)" > NUL) && (echo "%ProgramFiles(x86)%" | find "x86") > NUL && set bits=64 || set bits=32
于 2013-10-16T16:48:44.033 回答
1

我通常会做以下事情:

:Check_Architecture
if /i "%processor_architecture%"=="x86" (
    IF NOT DEFINED PROCESSOR_ARCHITEW6432 (
        REM Run 32 bit command

    ) ELSE (
        REM Run 64 bit command
    )           
) else (
        REM Run 64 bit command
)
于 2013-10-16T17:00:05.900 回答
1

这是我个人最喜欢的,一个逻辑炸弹:)

::32/64Bit Switch
ECHO %PROCESSOR_ARCHITECTURE%|FINDSTR AMD64>NUL && SET ARCH=AMD64 || SET ARCH=x86
ECHO %ARCH%
PAUSE

使用 AND 的 ( &&) 和 OR 的 ( ||) 这是一个IF THEN ELSE批处理构造。

于 2013-02-28T07:32:07.747 回答
1

这是一个简洁的版本:

set isX64=False && if /I "%PROCESSOR_ARCHITECTURE%"=="AMD64" ( set isX64=True ) else ( if /I "%PROCESSOR_ARCHITEW6432%"=="AMD64" ( set isX64=True ) )

echo %isX64%

不要使用“Program Files (x86)”目录作为任何证据:顽皮的软件可以轻松地在 32 位机器上创建此目录。而是使用 PROCESSOR_ARCHITECTURE 和 PROCESSOR_ARCHITEW6432 环境变量。

于 2014-06-23T16:46:19.703 回答
1

这是一个单行代码,%errorlevel%64 位为 0,非 64 位为 1。我不能保证它适用于所有版本的 Windows,但演示了一种确定它的方法。如果您知道要查找的所有可能性,则可以添加多个findstr查询。

set | findstr /i processo.*64 > nul 2>&1

基本上,您正在转储环境变量,并使用正则表达式来搜索在其行中某处具有“ 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 中更可靠。

于 2017-08-09T19:41:22.963 回答
1

我真的不明白这里给出的一些答案(对此感到抱歉)。例如,投票最多的答案不会返回 Windows 架构,而是会为您提供处理器架构。在 64 位 CPU 上运行 32 位 Windows 时,您会得到错误的结果(这是对正在使用的硬件的查询)。

最安全的选择是从注册表中查询 BuildLabEx 值。

确定 x86 (intel) 或 x86-64 (amd)

reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion" /v "BuildLabEx" | >nul find /i ".x86fre."   && set "_ARCH_=x86" || set "_ARCH_=x86-64"

确定 x86 (intel)、x86-64 (amd) 或 arm

set "_ARCH_=unknown"
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion" /v "BuildLabEx" | >nul find /i ".x86fre."   && set "_ARCH_=x86" 
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion" /v "BuildLabEx" | >nul find /i ".amd64fre." && set "_ARCH_=x86-64" 
reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion" /v "BuildLabEx" | >nul find /i ".armfre."   && set "_ARCH_=arm" 

另一种选择(前面提到过)

if defined ProgramFiles(x86) ( set "_ARCH_=x86-64" ) else ( set "_ARCH_=x86" )

后者的问题是,当您弄乱变量时,您将无法使用此方法。当以前安装有剩余(或某些用户故意创建文件夹)时,检查文件夹是否存在也会导致问题。

于 2018-03-15T17:30:34.100 回答
0

不同版本的 Windows 中的许多 DOS 命令是相似的,但可能支持不同的参数。此外,较新版本的 Windows 可能支持新命令或淘汰旧命令。因此,如果您希望编写一个可以在不同类型的机器上运行的批处理文件,确定运行该批处理文件的 Windows 版本可能是有益的。这样,批处理文件可以执行适合操作系统的命令。

以下批处理文件将确定计算机是否运行 Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003、Windows XP、Windows 2000 或 Windows NT。它可以根据需要轻松修改以支持其他版本的 Windows,或根据检测到的 Windows 版本设置环境变量。请注意,要让此批处理文件正确区分较新版本的 Windows Server 和消费者版本的 Windows,它比您可能在其他地方看到的批处理文件更加复杂。我已经解释了下面的原因。

1) 打开记事本窗口。

2) 将以下文本复制到记事本中(您可能希望在某些行换行时访问此提示的打印版本):

@echo off

ver | find "2003" > nul
if %ERRORLEVEL% == 0 goto ver_2003

ver | find "XP" > nul
if %ERRORLEVEL% == 0 goto ver_xp

ver | find "2000" > nul
if %ERRORLEVEL% == 0 goto ver_2000

ver | find "NT" > nul
if %ERRORLEVEL% == 0 goto ver_nt

if not exist %SystemRoot%\system32\systeminfo.exe goto warnthenexit

systeminfo | find "OS Name" > %TEMP%\osname.txt
FOR /F "usebackq delims=: tokens=2" %%i IN (%TEMP%\osname.txt) DO set vers=%%i

echo %vers% | find "Windows 7" > nul
if %ERRORLEVEL% == 0 goto ver_7

echo %vers% | find "Windows Server 2008" > nul
if %ERRORLEVEL% == 0 goto ver_2008

echo %vers% | find "Windows Vista" > nul
if %ERRORLEVEL% == 0 goto ver_vista

goto warnthenexit

:ver_7
:Run Windows 7 specific commands here.
echo Windows 7
goto exit

:ver_2008
:Run Windows Server 2008 specific commands here.
echo Windows Server 2008
goto exit

:ver_vista
:Run Windows Vista specific commands here.
echo Windows Vista
goto exit

:ver_2003
:Run Windows Server 2003 specific commands here.
echo Windows Server 2003
goto exit

:ver_xp
:Run Windows XP specific commands here.
echo Windows XP
goto exit

:ver_2000
:Run Windows 2000 specific commands here.
echo Windows 2000
goto exit

:ver_nt
:Run Windows NT specific commands here.
echo Windows NT
goto exit

:warnthenexit
echo Machine undetermined.

:exit

3) 将文件另存为 %WINDIR%\whichvers.bat

4) 现在,从命令提示符输入:

无论哪个

这将显示您正在运行的 Windows 版本。

笔记:

  1. 使用 SYSTEMINFO 命令而不是依赖 VER 命令的原因是因为 Windows Server 2008 与其他 Windows 版本“共享”版本号(请参阅 Microsoft)。因此,依靠“版本号”6.0 来检测 Windows Vista 或依靠 6.1 来检测 Windows 7 无法将计算机与 Windows Server 2008 或 Windows Server 2008 R2 区分开来。

  2. %TEMP%\osname.txt 的创建完全是因为我无法放置 systeminfo | 的结果。直接在 for /f 命令中找到“操作系统名称” - 它不喜欢管道命令。您可能会找到一种更简单的方法来处理从 SYSTEMINFO 获取信息 - 如果是这样,请发表评论。

  3. 环境变量 %vers% 有前导空格。我可以使用更长的批处理文件来删除这些,但在这种情况下没有必要。

  4. 批处理文件检测 SYSTEMINFO,因为它假定如果它超出了较旧的操作系统检测范围,则运行的 Windows 版本甚至更旧,并且不会具有此实用程序。在 Windows 7 64 位上,它仍位于 %SystemRoot%\system32 文件夹中 - 如果更高版本的 Windows 仅变为 64 位,则可能必须更新此批处理文件。

返回到 Windows XP 和 DOS 页面。

于 2015-03-09T06:07:33.803 回答
0

经过多次试验和错误,我设法得到了一些不同的工作示例,但最重要的是当批处理在 32 位 CMD 上的 64 位操作系统上启动时。最后,这是我可以开始工作的最简单的检查,它适用于 Win2k-Win8 32/64。也非常感谢帮助我解决这个问题的菲尔。

set bit64=n
if /I %Processor_Architecture%==AMD64 set bit64=y
if /I "%PROCESSOR_ARCHITEW6432%"=="AMD64" set bit64=y
于 2013-12-02T22:26:43.800 回答
0

您可以使用以下注册表位置检查计算机是否运行 32 位或 64 位 Windows 操作系统:

HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0

您将在右窗格中看到以下注册表项:

Identifier     REG_SZ             x86 Family 6 Model 14 Stepping 12
Platform ID    REG_DWORD          0x00000020(32)

以上x860x00000020(32)表示操作系统版本为32位。

于 2016-10-05T05:04:22.383 回答
0
set bit=64
IF NOT DEFINED PROGRAMFILES(X86) (
set "PROGRAMFILES(X86)=%PROGRAMFILES%"
set bit=32
)
REM Example 1: REG IMPORT Install%bit%.reg (all compatibility)
REM Example 2: CD %PROGRAMFILES(X86)% (all compatibility)
于 2017-07-27T00:25:21.747 回答
-1
If $SYSTEM_os_arch==x86 ( 
  Echo OS is 32bit
 ) else ( 
  ECHO OS is 64bit
)
于 2015-11-03T03:49:18.677 回答
-1

正如SAM之前写的那样,正确的方法是:

reg 查询 "HKLM\Hardware\Description\System\CentralProcessor\0" /v "标识符" | 查找 /i "x86" > NUL && 设置 OS=32BIT || 设置操作系统=64BIT

但是/v "Identifier"有点正确。

于 2016-01-22T14:11:08.370 回答
-1

仅供参考,请尝试远离使用 %PROCESSOR_ARCHITECTURE%,因为 SCCM 在 2012 版周围进行了更改,该更改始终在 32 位进程下启动包/程序(它可以安装 x64,但环境变量将显示为 x86)。我现在使用;

如果存在“%SystemDrive%\Program Files (x86)”转到 X64

杰克

于 2016-08-22T14:57:43.323 回答
-2
set "_os=64"
if "%PROCESSOR_ARCHITECTURE%"=="x86" (if not defined PROCESSOR_ARCHITEW6432 set "_os=32")

基于:https ://blogs.msdn.microsoft.com/david.wang/2006/03/27/howto-detect-process-bitness/

http://ss64.com/nt/syntax-64bit.html

于 2016-04-22T06:40:54.247 回答