batch file来检查64位或32位操作系统

我可以检查当前机器是否在batch file中运行64位操作系统或32位 操作系统

编辑:

在网上find了,现在对我来说已经够用了:

这是按照Microsoft知识库参考( http://support.microsoft.com/kb/556009 )执行检查的正确方法,我已将其重新编辑为一行代码。

它不依赖于任何环境variables或文件夹名称,而是直接在registry中进行检查。

如下面的完整batch file所示,它设置一个环境variablesOS等于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 

我使用以下任一项:

 :CheckOS IF EXIST "%PROGRAMFILES(X86)%" (GOTO 64BIT) ELSE (GOTO 32BIT) :64BIT echo 64-bit... GOTO END :32BIT echo 32-bit... GOTO END :END 

或者我设置bitvariables,我稍后在脚本中使用它来运行正确的设置。

 :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 

尝试find一个没有GOTO的方式请…

对于使用Unix系统的人来说, uname -m将会起作用。

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

 PROCESSOR_ARCHITECTURE=x86 

将出现在Win32和

 PROCESSOR_ARCHITECTURE=AMD64 

将出现Win64。

如果您正在运行32位cmd.exe进程,则Windows将显示两个环境variables:

 PROCESSOR_ARCHITECTURE=x86 PROCESSOR_ARCHITEW6432=AMD64 

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

开始 – >运行 – >inputcmd并在下面的结果黑框中input命令:

 wmic os get osarchitecture 

'ProgramFiles(x86)'是一个由Windows 64位机器上的cmd.exe(32位和64位版本)自动定义的环境variables,所以试试这个:

 @ECHO OFF echo Check operating system ... if defined PROGRAMFILES(X86) ( echo 64-bit sytem detected ) else ( echo 32-bit sytem detected ) pause 

经过多次试验和错误之后,我设法得到了几个不同的工作示例,但是在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/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位机器上创build这个目录。 而是使用PROCESSOR_ARCHITECTURE和PROCESSOR_ARCHITEW6432环境variables。

如果脚本能够在Administrator下运行,则可以使用wmi命令。

 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 

我通常会做以下事情:

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

这里没有答案在我的情况下(64位处理器,但32位操作系统),所以这里的解决scheme,为我工作:

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

在不同版本的Windows中的许多DOS命令是相似的,但可能支持不同的参数。 此外,Windows的新版本可能支持新的命令或退出较旧的命令。 因此,如果您希望编写可以在不同types的计算机上运行的batch file,那么确定运行batch file的Windows的版本可能是有益的。 这样batch file可以执行适合于操作系统的命令。

以下batch file将确定计算机是否运行Windows 7,Windows Server 2008,Windows Vista,Windows Server 2003,Windows XP,Windows 2000或Windows NT。 可以根据需要轻松修改它以支持其他版本的Windows,或根据检测到的Windows版本设置环境variables。 请注意,对于此batch file要正确识别Windows Server的新版本和Windows的消费版本之间,它比其他地方可能会看到的batch file更复杂。 我已经解释了下面的推理。

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%\ thatvers.bat

4)现在,从命令提示符处input:

whichvers

这将显示您正在运行的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. 创build%TEMP%\ osname.txt完全是因为我无法放置systeminfo |的结果 find“OS名称”直接进入for / f命令 – 它不喜欢pipe道命令。 你可能会发现一个更简单的方法来处理从SYSTEMINFO获取信息 – 如果是这样,请评论。

  3. 环境variables%vers%具有前导空格。 我可以删除这些更长的batch file,但在这种情况下,这是没有必要的。

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

返回到Windows XP和DOS页面。

您可以使用以下registry位置来检查计算机是否正在运行32位或64位的Windows操作系统:

 HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0 

您将在右窗格中看到以下registry项:

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

上面的x860x00000020(32)表示操作系统版本是32位。

 @echo off setlocal EnableExtensions DisableDelayedExpansion IF NOT DEFINED PROGRAMFILES(X86) (set "PROGRAMFILES(X86)=%PROGRAMFILES%") echo %PROGRAMFILES(X86)% pause > NUL endlocal 

答案是:

 @echo off setlocal EnableExtensions EnableDelayedExpansion set bit=%PROCESSOR_ARCHITECTURE:~-2% IF %bit%==86 (set bit=32) echo %bit% pause > NUL endlocal 

这是一个%errorlevel% ,其中64位的%errorlevel%为0,非64位为1

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

基本上,你正在倾销环境variables,并使用正则expression式来search在其行中某处具有“ processo ”+“ 64 ”的东西。 pipe道只是压制匹配线。 如果我改变它set | findstr /i processo.*64 > nul 2>&1 set | findstr /i processo.*64 > nul 2>&1在我目前的钻机上,这将是结果:

  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

您可以将这些作为起点,并根据您的要求对其进行优化。 我结束了使用这个已知的环境variables名称,因为它在不同主要版本的Windows中更可靠。

 If $SYSTEM_os_arch==x86 ( Echo OS is 32bit ) else ( ECHO OS is 64bit ) 

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

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

但用/ v“标识符”有点正确。

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

IF EXIST“%SystemDrive%\ Program Files(x86)”GOTO 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/

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