Пакет для определения, является ли система 32-битной или 64-битной - PullRequest
17 голосов
/ 14 февраля 2011

Кто-нибудь знает, как создать командный файл, который может обрабатывать одну программу, если это 64-разрядная система, или оболочку другой, если это 32-разрядная система?

Ответы [ 9 ]

23 голосов
/ 14 февраля 2011

Проверьте, чтобы %PROCESSOR_ARCHITECTURE% было x86:

if %PROCESSOR_ARCHITECTURE%==x86 (
  rem 32 bit
) else (
  rem 64 bit
)

По крайней мере, на данный момент.На сервере у меня есть доступ к AMD64, но я не знаю, например, как выглядит Itanium.Но 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
)
12 голосов
/ 08 июля 2012

Работает и без 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
5 голосов
/ 14 февраля 2011
uname -a #for mac

uname -i #for ubuntu
3 голосов
/ 14 февраля 2011

И простым способом было бы проверить наличие папки %SystemRoot%\SysWOW64.Хотя он не на 100% надежен, он действительно полезен для определения, является ли система 64-битной.

2 голосов
/ 28 декабря 2012

Все партии там не работают в моей Windows 8 x64.

Следующая работа со мной:

@cd %programfiles(x86)%\

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

@if %ERRORLEVEL% == 1 (echo x86&&pause)
1 голос
/ 02 января 2012

Эта строка даст вам то, что вы хотите, работает на XP, Vista и 7

сохранить его как .bat или .cmd

If Defined ProgramFiles(x86) (\\Fileserver\Distribution\Softwarex64.exe) else (\\Fileserver\Distribution\Softwarex86.exe)

Если источник установки на локальном компьютерепросто укажите на него (D: \ Programs \ Softwarex64.exe)

и, если вы хотите просто запускать команды, а не устанавливать, просто введите команду, которую вы хотите для x64 Между first () и командами дляx86 Между секундами ()

If Defined ProgramFiles(x86) (ipconfig /all & @echo  This Is A 64-bit System ) else (arp -a & @echo This Is A 32-bit System)

Скопируйте это в CMD для проверки

Надеюсь, это поможет

0 голосов
/ 28 февраля 2014

Приведенный ниже метод должен быть достаточно надежным, поскольку он будет работать, даже если переменные среды были перепутаны с:

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'

Этот метод основан на том факте, что «% WINDIR% \ System32 \ kernel32.dll»должен присутствовать во всех системах Windows.64-разрядные версии Windows также включают каталог «% WINDIR% \ SysWOW64», содержащий 32-разрядные версии системных файлов, которых нет в 32-разрядных системах.

В 64-разрядных системах 32-разрядные приложения перенаправляются на SysWOW64 при попытке доступа к файлам в System32.Таким образом, если мы получаем одинаковый размер kernel32.dll как из System32, так и из SysWOW64, это означает, что перенаправление действует, и наш скрипт выполняется в 32-разрядной консоли на 64-разрядной ОС.

0 голосов
/ 14 февраля 2011

В Linux вы можете просто использовать «arch» в командной строке.

ubuntu# arch
x86_64

В OSX (Snow Leopard) он возвращает «i386», даже если вы используете 64-битное оборудование.

0 голосов
/ 14 февраля 2011
...