Shell 批处理以检测系统是32位还是64位

Shell 批处理以检测系统是32位还是64位,shell,batch-file,32bit-64bit,Shell,Batch File,32bit 64bit,有人知道如何创建一个批处理文件,如果是64位系统,它可以shell一个程序,如果是32位系统,它可以shell另一个程序?简单的方法是测试%SystemRoot%\SysWOW64文件夹是否存在。虽然它不是100%万无一失,但它确实是检测系统是否为64位的好方法。阅读本文 uname -a #for mac uname -i #for ubuntu 检查%PROCESSOR\u ARCHITECTURE%是否为x86: if %PROCESSOR_ARCHITECTURE%==x86 (

有人知道如何创建一个批处理文件,如果是64位系统,它可以shell一个程序,如果是32位系统,它可以shell另一个程序?

简单的方法是测试
%SystemRoot%\SysWOW64
文件夹是否存在。虽然它不是100%万无一失,但它确实是检测系统是否为64位的好方法。

阅读本文

uname -a #for mac

uname -i #for ubuntu

检查
%PROCESSOR\u ARCHITECTURE%
是否为
x86

if %PROCESSOR_ARCHITECTURE%==x86 (
  rem 32 bit
) else (
  rem 64 bit
)
至少目前是这样。例如,在一台服务器上,我可以访问它的
AMD64
,但不知道安腾是什么样子。但32位版本总是报告
x86

另一个选项也适用于WoW64:

for /f "skip=1 delims=" %%x in ('wmic cpu get addresswidth') do if not defined AddressWidth set AddressWidth=%%x

if %AddressWidth%==64 (
  rem 64 bit
) else (
  rem 32 bit
)

在Linux上,您只需在命令行中使用“arch”

ubuntu# arch
x86_64

在OSX(Snow Leopard)上,即使您使用的是64位硬件,它也会返回“i386”。

这一行将为您提供您想要的,适用于XP、Vista和7

另存为.bat或.cmd

If Defined ProgramFiles(x86) (\\Fileserver\Distribution\Softwarex64.exe) else (\\Fileserver\Distribution\Softwarex86.exe)
如果本地计算机中的安装源指向它(D:\Programs\Softwarex64.exe)

如果只想运行命令而不想安装,只需在第一个()之间键入用于x64的命令,在第二个()之间键入用于x86的命令

将其复制到CMD中进行测试

我希望这有帮助

它在没有WMI的情况下也能工作! 我建议:

 @echo off
 if /i "%processor_architecture%"=="AMD64" GOTO AMD64
 if /i "%PROCESSOR_ARCHITEW6432%"=="AMD64" GOTO AMD64
 if /i "%processor_architecture%"=="x86" GOTO x86
 GOTO ERR
 :AMD64
    rem do amd64 stuff
 GOTO EXEC
 :x86
    rem do x86 stuff
 GOTO EXEC
 :EXEC
    rem do arch independent stuff
 GOTO END
 :ERR
 @echo Unsupported architecture "%processor_architecture%"!
 pause
 :END

上面的所有批处理在我的Windows 8 x64中都不起作用

以下是我的工作:

@cd %programfiles(x86)%\

@if %ERRORLEVEL% == 0 (echo x64&&pause)

@if %ERRORLEVEL% == 1 (echo x86&&pause)

以下方法应该非常可靠,因为即使环境变量被弄乱,它也能工作:

rem If no kernel32.dll in System32, probably running on DOS or 16-bit Windows
if not exist "%SystemRoot%\System32\kernel32.dll" goto DOS

rem If no kernel32.dll in SysWOW64, likely a 32-bit Windows 
if not exist "%SystemRoot%\SysWOW64\kernel32.dll" goto WIN32

rem If file size reported for kernel32.dll located in System32 and SysWOW64 is
rem the same, it likely means that System32 is being redirected to SysWOW64.
rem This would be the case for 32-bit version of cmd.exe running on 64-bit OS. 
for %%I in ("%SystemRoot%\SysWOW64\kernel32.dll") do (
  for %%J in ("%SystemRoot%\System32\kernel32.dll") do (
    if "%%~zI" equ "%%~zJ" goto WOW64
  )
)

rem If we get this far, the script is likely running in native 64-bit console
echo Native shell on 64-bit Windows
rem ...
exit /b

:WOW64
echo 32-bit shell on 64-bit Windows (WOW64)
rem ...
exit /b

:WIN32
echo 32-bit Windows
rem ...
goto END

:DOS
echo DOS or 16-bit Windows
rem ...
goto END

rem ...

:END
rem We can put this label at the end of the file to allow exiting script on 
rem older systems that do not support 'exit /b'
此方法依赖于所有Windows系统上都应存在“%WINDIR%\System32\kernel32.dll”这一事实。64位版本的Windows还包括“%WINDIR%\SysWOW64”目录,其中包含32位版本的系统文件,而32位系统上不存在该目录


在64位系统上,当尝试访问System32中的文件时,32位应用程序将重定向到SysWOW64。因此,如果我们从System32和SysWOW64获得相同大小的kernel32.dll,这意味着重定向生效,并且我们的脚本在64位操作系统上的32位控制台中运行

这里有一些答案:原因是我正在为Autocad创建一个自定义文件,我们的员工也可以将该文件带回家用于个人系统。我们的定制使用VBA for AutoCAD,但有两个版本可用:32位和64位。我知道员工同时使用32位或64位或
arch
。但我认为OP指的是Windows。@Mehrdad:已修复。虽然我想知道谁使用专用的32位
cmd
实例在64位系统上工作。有趣的解决方案!:)其实,这并不一定是因为用户有选择权;相反,
cmd
实例可能已经由32位进程启动,用户可能只提供命令,无法控制命令提示符的启动方式。(哦,顺便说一句:如果出于任何原因禁用WMI,该解决方案将不起作用。)在Windows XP中,我遇到了问题,并给了我一个错误“Go to此时出乎意料”。解决方案是将比较放在引号中:如果/i“%processor\u architecture%”==“AMD64”转到AMD64,这不是更简单吗<代码>如果/i“%processor_architecture%”==“x86”(rem 32)else(rem 64)这将在任何其他体系结构上中断并执行64位代码!有安腾,很快ARM上可能会有窗口!
rem If no kernel32.dll in System32, probably running on DOS or 16-bit Windows
if not exist "%SystemRoot%\System32\kernel32.dll" goto DOS

rem If no kernel32.dll in SysWOW64, likely a 32-bit Windows 
if not exist "%SystemRoot%\SysWOW64\kernel32.dll" goto WIN32

rem If file size reported for kernel32.dll located in System32 and SysWOW64 is
rem the same, it likely means that System32 is being redirected to SysWOW64.
rem This would be the case for 32-bit version of cmd.exe running on 64-bit OS. 
for %%I in ("%SystemRoot%\SysWOW64\kernel32.dll") do (
  for %%J in ("%SystemRoot%\System32\kernel32.dll") do (
    if "%%~zI" equ "%%~zJ" goto WOW64
  )
)

rem If we get this far, the script is likely running in native 64-bit console
echo Native shell on 64-bit Windows
rem ...
exit /b

:WOW64
echo 32-bit shell on 64-bit Windows (WOW64)
rem ...
exit /b

:WIN32
echo 32-bit Windows
rem ...
goto END

:DOS
echo DOS or 16-bit Windows
rem ...
goto END

rem ...

:END
rem We can put this label at the end of the file to allow exiting script on 
rem older systems that do not support 'exit /b'