Подтвердить что ты не робот

Пакетный файл для проверки 64-битной или 32-битной ОС

Можно ли проверить, работает ли в текущем компьютере 64-битная ОС или 32 бит ОС внутри пакетного файла?

EDIT:

Нашел это в Интернете, и для меня это сейчас достаточно:

4b9b3361

Ответ 1

Это правильный способ выполнения проверки по базе знаний 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

Ответ 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, которую я позже использовал в своем script для правильной настройки.

:CheckOS
IF EXIST "%PROGRAMFILES(X86)%" (set bit=x64) ELSE (set bit=x86)

или...

:CheckOS
IF "%PROCESSOR_ARCHITECTURE%"=="x86" (set bit=x86) else (set bit=x64)

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

Ответ 3

Кажется, нужно работать, если вы делаете только следующие действия:

echo "%PROCESSOR_ARCHITECTURE%"

Я нашел эти 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 выполнит трюк.

Ответ 4

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

Ответ 5

PROCESSOR_ARCHITECTURE=x86

Появится на Win32 и

PROCESSOR_ARCHITECTURE=AMD64

появится для Win64.

Если вы извращаете 32-разрядный процесс cmd.exe, то Windows представляет две переменные среды:

PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=AMD64

Ответ 6

'ProgramFiles (x86)' - это переменная среды, автоматически определяемая cmd.exe(как 32-разрядная, так и 64-разрядная версии) только для 64-разрядных компьютеров Windows, поэтому попробуйте следующее:

@ECHO OFF

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

Ответ 7

Запустите ниже в командной строке:

Пуск → Выполнить → Введите cmd и введите следующую команду в появившемся черном поле:

wmic os get osarchitecture

Ответ 8

Вот мой личный фаворит, логическая бомба:)

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

С помощью AND (&&) и OR (||) это IF THEN ELSE Batch Construct.

Ответ 9

Ни один из ответов здесь не работал в моем случае (64-битный процессор, но 32-разрядная ОС), поэтому вот решение, которое сработало для меня:

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

Ответ 10

После долгих проб и ошибок, мне удалось получить несколько разных рабочих примеров, но кикер был, когда пакет был запущен на 64-битной ОС на 32-разрядной CMD. В конце концов, это была самая простая проверка, которую я мог бы приступить к работе, которая работает на Win2k-Win8 32/64. Также большое спасибо Филу, который помог мне в этом.

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

Ответ 11

Если вы запускаете скрипт как администратор, то скрипт может использовать команду 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

Ответ 12

Это однострочник, который будет иметь %errorlevel% от 0 для 64-разрядных, 1 для не 64-разрядных. Я не могу поручиться за то, что он работает на всех версиях Windows, но демонстрирует один метод для его определения. Вы можете добавить несколько запросов findstr если знаете все возможности поиска.

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

По сути, вы сбрасываете переменные окружения и используете регулярное выражение для поиска чего-то, у которого где-то в строке " processo " + " 64 ". Трубопровод просто для подавления совпадающих линий. Если бы я изменил его, чтобы set | findstr/i 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, с которыми я работал.

Ответ 13

Я действительно не понимаю некоторые ответы, приведенные здесь (извините за это). Например, ответ с наибольшим количеством голосов не возвращает архитектуру Windows, а дает архитектуру процессора. При запуске 32-битной Windows-сборки на 64-битном процессоре вы получите неправильный результат (это запрос на используемое оборудование).

Самый безопасный вариант - запросить значение 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

Я обычно делаю следующее:

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

Ответ 15

Здесь хорошая краткая версия:

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.

Ответ 16

Многие команды DOS в разных версиях Windows похожи, но могут поддерживать разные параметры. Кроме того, новые версии 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) Теперь из командной строки введите:

whichvers

Это покажет, какую версию 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 | найдите "OS Name" непосредственно в команде for/f - ему не нравятся команды с каналами. Вы можете найти более простой способ справиться с захватом информации из SYSTEMINFO - если да, прокомментируйте.

  • Переменная среды% vers% имеет ведущие пробелы. Я мог бы удалить их с помощью более длинного командного файла, но в этом случае он не нужен.

  • Пакетный файл обнаруживает для SYSTEMINFO, поскольку он предполагает, что если он выходит за рамки более ранних обнаружений операционной системы, работающая версия Windows еще старше и не будет иметь эту утилиту. В 64-разрядной версии Windows 7 он по-прежнему находится в папке% SystemRoot%\system32 - если более поздние версии Windows становятся только 64-разрядными, этот пакетный файл, возможно, потребуется обновить.

Вернитесь на страницу Windows XP и DOS.

Ответ 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)

Вышеуказанные x86 и 0x00000020(32) указывают, что версия операционной системы 32 бит.

Ответ 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 Query "HKLM\Hardware\Description\System\CentralProcessor\0" /v "Идентификатор" | find/i "x86" > NUL && set OS = 32BIT || set OS = 64BIT

но с /v "Идентификатор" немного прав.

Ответ 21

FYI, попробуйте отказаться от использования% PROCESSOR_ARCHITECTURE%, поскольку SCCM внесла изменения в версию 2012, которая всегда запускает пакеты/программы под 32-разрядным процессом (он может устанавливать x64, но переменные среды будут отображаться как x86). Теперь я использую

IF EXIST "% SystemDrive%\Program Files (x86)" GOTO X64

Джек