我可以检查当前机器是否在批处理文件中运行64 位操作系统或32 位 操作系统?
编辑:
在网上找到了这个,现在对我来说已经足够了:
这是按照 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
我使用以下任何一种:
: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)
希望这可以帮助。
如果你只做这些似乎工作:
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
可以做到这一点。
在命令提示符下运行以下命令:
开始 -> 运行 -> 键入cmd
并在生成的黑框中输入以下命令:
wmic os get osarchitecture
'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
*** 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 ***
如果您以管理员身份运行脚本,则该脚本可以使用 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
这里的答案都不适用于我的情况(64 位处理器但 32 位操作系统),所以这是对我有用的解决方案:
(set | find "ProgramFiles(x86)" > NUL) && (echo "%ProgramFiles(x86)%" | find "x86") > NUL && set bits=64 || set bits=32
我通常会做以下事情:
: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
)
这是我个人最喜欢的,一个逻辑炸弹:)
::32/64Bit Switch
ECHO %PROCESSOR_ARCHITECTURE%|FINDSTR AMD64>NUL && SET ARCH=AMD64 || SET ARCH=x86
ECHO %ARCH%
PAUSE
使用 AND 的 ( &&
) 和 OR 的 ( ||
) 这是一个IF THEN ELSE
批处理构造。
这是一个简洁的版本:
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 环境变量。
这是一个单行代码,%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 中更可靠。
我真的不明白这里给出的一些答案(对此感到抱歉)。例如,投票最多的答案不会返回 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" )
后者的问题是,当您弄乱变量时,您将无法使用此方法。当以前安装有剩余(或某些用户故意创建文件夹)时,检查文件夹是否存在也会导致问题。
不同版本的 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 版本。
笔记:
使用 SYSTEMINFO 命令而不是依赖 VER 命令的原因是因为 Windows Server 2008 与其他 Windows 版本“共享”版本号(请参阅 Microsoft)。因此,依靠“版本号”6.0 来检测 Windows Vista 或依靠 6.1 来检测 Windows 7 无法将计算机与 Windows Server 2008 或 Windows Server 2008 R2 区分开来。
%TEMP%\osname.txt 的创建完全是因为我无法放置 systeminfo | 的结果。直接在 for /f 命令中找到“操作系统名称” - 它不喜欢管道命令。您可能会找到一种更简单的方法来处理从 SYSTEMINFO 获取信息 - 如果是这样,请发表评论。
环境变量 %vers% 有前导空格。我可以使用更长的批处理文件来删除这些,但在这种情况下没有必要。
批处理文件检测 SYSTEMINFO,因为它假定如果它超出了较旧的操作系统检测范围,则运行的 Windows 版本甚至更旧,并且不会具有此实用程序。在 Windows 7 64 位上,它仍位于 %SystemRoot%\system32 文件夹中 - 如果更高版本的 Windows 仅变为 64 位,则可能必须更新此批处理文件。
返回到 Windows XP 和 DOS 页面。
经过多次试验和错误,我设法得到了一些不同的工作示例,但最重要的是当批处理在 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
您可以使用以下注册表位置检查计算机是否运行 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)
以上x86
并0x00000020(32)
表示操作系统版本为32位。
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)
If $SYSTEM_os_arch==x86 (
Echo OS is 32bit
) else (
ECHO OS is 64bit
)
正如SAM之前写的那样,正确的方法是:
reg 查询 "HKLM\Hardware\Description\System\CentralProcessor\0" /v "标识符" | 查找 /i "x86" > NUL && 设置 OS=32BIT || 设置操作系统=64BIT
但是/v "Identifier"有点正确。
仅供参考,请尝试远离使用 %PROCESSOR_ARCHITECTURE%,因为 SCCM 在 2012 版周围进行了更改,该更改始终在 32 位进程下启动包/程序(它可以安装 x64,但环境变量将显示为 x86)。我现在使用;
如果存在“%SystemDrive%\Program Files (x86)”转到 X64
杰克
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/