【问题标题】:batch file to check 64bit or 32bit OS检查 64 位或 32 位操作系统的批处理文件
【发布时间】:2012-09-07 16:51:04
【问题描述】:

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

编辑:

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

【问题讨论】:

  • 这很好,直到一个打包错误的应用程序创建这些文件夹之一(比如 Program Files (x86)\ 在 32 位系统上)并且您的脚本失败(在那里)
  • 你最终使用了哪个答案?

标签: windows command-line


【解决方案1】:

这是按照微软知识库参考 (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

【讨论】:

  • 此信息之前在 this answer 中提供,但我更喜欢您的实现,因为它不使用中间文件来保存结果。
  • 你也犯了一个错误——如果应该是find /i "x86",就没有“x32”这样的东西)
  • 另外,您可能不想使用操作系统作为您的环境变量,因为它已经由 Windows 设置。我机器上的“OS=Windows_NT”
  • 这是 Android SDK 工具使用的。见android.googlesource.com/platform/sdk/+/master/find_java/…
  • setlocal 放在 @echo off 行之后 - 这将确保环境的生命周期将随着批处理的终止而结束,因此使用 OS 变量应该没有伤害。
【解决方案2】:

我使用以下任何一种:

: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) ...
  • 谁发明了批量 if/else 语句...我从未见过如此糟糕的解释器。
  • 您对%PROCESSOR_ARCHITECTURE% 的测试不是错误的吗?我在 64 位上得到 AMD64。如果%PROCESSOR_ARCHITECTURE% 总是有效,那么它是一个 比检查任何有缺陷的软件可以创建的目录而不考虑 CPU 的目录更好的解决方案。
  • 发现了一个错误 - 必须在 IF "%PROCESSOR_ARCHITECTURE%"=="x86" (set bit=x64) 中交换正负分支。
  • @Mgamerz 当然,这远非理想,但请注意,批处理脚本可以(并且为了理智起见,应该)按行分隔命令,包括在 if/else 块中,只要左括号与条件在同一行,这使得事情更具可读性 - 在可用的范围内!
【解决方案3】:

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

echo "%PROCESSOR_ARCHITECTURE%"

我发现 these script 会根据操作系统架构(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 可以解决问题。

【讨论】:

  • @5YrsLaterDBA:如果您有特定要求,您需要将它们放在您的问题中。对于您实际提出的问题,您有两个正确答案。你应该接受一个并赞成两个。
  • 当心:仅测试PROCESSOR_ARCHITECTURE 来找出操作系统位数是不够的。上面的示例仅测试脚本cmd.exe 进程位数本身。要测试问题中所述的操作系统位数,您还需要检查 PROCESSOR_ARCHITEW6432 变量是否存在,因为 64 位操作系统上可能存在 32 位进程。
  • @Andry :在我写这些答案的时候,比你的答案早 9 年,那个脚本很有用。随着时间的推移,事情会发生或多或少的变化。感谢您今天指出这一点。
  • @ThierryB 现在不依赖了。 x64 操作系统和相关变量的性质从它第一次出现时就没有改变。它有用的原因是您只使用了一半而没有测试其他情况。如果你不相信我,那就拿你想要的虚拟机,安装所有带有或不带 SP 的 Windows XP/7/8/etc 版本,然后自己看看。
  • 我会的,但我已经很久没有使用过 Windows 计算机了,我也不想。感谢您指出这一点。它肯定对这里的某些人有用。
【解决方案4】:

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

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

wmic os get osarchitecture

【讨论】:

  • 我可以得到一个公正的理由来解释为什么这有 2 票否决吗?我想知道为什么这个答案没有帮助
  • 冒险猜测下票的原因是方向是从命令提示符运行命令,而不是说明将命令的输出放在批处理文件中然后使用,因为问题要求。
  • 我认为最初的问题是期待一些可以在批处理文件中使用的东西,例如wmic os get osarchitecture | find "64" > NUL && set NumBits=64 || set NumBits=32 否则,我认为这是最简洁的答案...前提是wmic 始终存在于路径上...。
【解决方案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

【讨论】:

    【解决方案6】:

    '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(详情 - goo.gl/tWDK3V
    【解决方案7】:
    PROCESSOR_ARCHITECTURE=x86
    

    会出现在Win32上,并且

    PROCESSOR_ARCHITECTURE=AMD64
    

    将出现在 Win64 上。

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

    PROCESSOR_ARCHITECTURE=x86
    PROCESSOR_ARCHITEW6432=AMD64
    

    【讨论】:

    • 如何使用命令行命令在批处理文件中获取这些信息?
    • @5YrsLaterDBA 至少尝试研究该主题:computerhope.com/if.htm
    • @Joey 我假装它不像 Oracle 那样存在,啦啦啦 HP - 我听不见你的声音!
    • 有关此变量的更多有用信息以及它如何作用于 Win32/Win64/WOW64:blogs.msdn.com/b/david.wang/archive/2006/03/26/…
    • 这只会检测您正在使用的命令外壳的位数,而不是操作系统本身。在 64 位 Windows 上,cmd.exe 有两个版本,一个是 64 位,一个是 32 位(您通常可以在这里找到:C:\Windows\SysWOW64\cmd.exe)。
    【解决方案8】:

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

    【讨论】:

      【解决方案9】:

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

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

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

      【讨论】:

      • 对于那些想知道为什么直接 if-else 不起作用的人; forums.codeguru.com/… 我注意到的一个烦恼是,在 IF 块中进行的分配(即 SET 语句)直到 IF-bock 之后才实现。因此,换句话说,您不能依赖 IF 块中的变量赋值。
      • %PROCESSOR_ARCHITECTURE% 如果进程在 32 位模式下运行,则在 64 位机器上返回 x86。例如如果你在c:\windows\syswow64\cmd.exe 内运行,那么它会输出 x86。在这种情况下,您可以检查%PROCESSOR_ARCHITEW6432%,它将是 AMD64。
      • @AnneTheAgile 我不确定您从该链接得出的结论是否准确;请参阅 stackoverflow.com/questions/7805510/… 了解其他可能使某人认为的条件陷阱的示例。另一个可能相关的事情是setlocal enabledelayedexpansion - 无论如何我都将其用作反射。
      【解决方案10】:

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

      (set | find "ProgramFiles(x86)" > NUL) && (echo "%ProgramFiles(x86)%" | find "x86") > NUL && set bits=64 || set bits=32
      

      【讨论】:

        【解决方案11】:

        这是一个简洁的版本:

        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 环境变量。

        【讨论】:

          【解决方案12】:

          我通常会做以下事情:

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

          【讨论】:

          • 应该是 == "x86",而不是 'x32'
          【解决方案13】:

          我真的不明白这里给出的一些答案(对不起)。例如,投票最多的答案不会返回 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" )
          

          后者的问题是当你弄乱你的变量时,你就不能使用这个方法。检查文件夹是否存在也会在以前安装有剩余(或某些用户故意创建文件夹)时出现问题。

          【讨论】:

            【解决方案14】:

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

            set | findstr /i processo.*64 &gt; nul 2&gt;&amp;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 &gt; nul 2&gt;&amp;1

            您可以将这些作为起点,并根据您的要求对其进行改进。我最终在已知的环境变量名称上使用了这个,因为它在我正在使用的不同主要版本的 Windows 中更可靠。

            【讨论】:

            • 我对依赖环境持谨慎态度。即使使用 Intel 处理器,也要警惕在所有情况下都会出现“AMD64”。并且三倍警惕用户环境没有像IWISH=I had a food processor as fast as amd graphics drivers like model 5564这样的奇怪东西
            • 如果您知道自己在寻找什么,您可以添加多个 findstr 查询。我不能保证每个版本的 64 位 Windows 都有这个环境变量。如果您想尽可能彻底,您可以查找您感兴趣的 Windows 版本的每个版本的环境变量,并查询每个可能的变量和值以消除您的谨慎。
            【解决方案15】:

            不同版本的 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 页面。

            【讨论】:

              【解决方案16】:

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

              set bit64=n
              if /I %Processor_Architecture%==AMD64 set bit64=y
              if /I "%PROCESSOR_ARCHITEW6432%"=="AMD64" set bit64=y
              

              【讨论】:

                【解决方案17】:

                您可以使用以下注册表位置来检查计算机运行的是 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位。

                【讨论】:

                • -1 与两年多前的Sam spade's answer 相同的答案(授予稍微详细一点的答案)。
                【解决方案18】:
                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)
                

                【讨论】:

                • 并没有真正回答这个问题,是吗?
                【解决方案19】:
                If $SYSTEM_os_arch==x86 ( 
                  Echo OS is 32bit
                 ) else ( 
                  ECHO OS is 64bit
                )
                

                【讨论】:

                  【解决方案20】:

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

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

                  /v "Identifier" 有点正确。

                  【讨论】:

                  • 这应该是对Sam Spade'spost 的评论,而不是为已经使这个问题变得混乱的许多添加另一个单独的答案。
                  【解决方案21】:

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

                  如果存在 "%SystemDrive%\Program Files (x86)" GOTO X64

                  杰克

                  【讨论】:

                  • 感谢您提供有关 SCCM 更改的说明(有方便的信息链接吗?),但正如其他答案指出的那样,任何人/任何事物都可以创建的目录存在风险。
                  【解决方案22】:
                  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

                  【讨论】:

                    猜你喜欢
                    • 2011-10-16
                    • 2012-08-26
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-08-29
                    • 2011-07-07
                    • 1970-01-01
                    • 2011-02-20
                    • 1970-01-01
                    相关资源
                    最近更新 更多