Почему% processor_architecture% всегда возвращает x86 вместо AMD64

Я пытаюсь получить переменную окружения, чтобы определить, является ли система 32 или 64 бит. Но на 64-битном сервере переменная окружения %processor_architecture% возвращает x86 вместо AMD64.

Кто-нибудь знает об этом?

Ответ 1

Возможно, вы получаете неправильную переменную окружения. Если ваше приложение является 32-разрядным приложением, работающим в 64-разрядной ОС, версия процесса этой переменной среды вернет x86. Если вы хотите найти архитектуру машины, вы можете получить ее из следующей записи реестра:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment\PROCESSOR_ARCHITECTURE

Или, если вы используете .NET, то вы можете использовать этот вызов, чтобы получить его:

string arch = System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE", 
    EnvironmentVariableTarget.Machine);

Из командной строки вы можете попробовать это:

reg query "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /v PROCESSOR_ARCHITECTURE

Существует даже более простое решение с использованием cmd:

ECHO %PROCESSOR_ARCHITECTURE%

Ответ 2

Вы также можете получить это из переменной среды, PROCESSOR_ARCHITEW6432. См. эту статью для получения дополнительной информации.

Ответ 3

Вы фактически используете 64-разрядную версию Windows? Если вы используете 32-битную Windows на 64-битном процессоре, вы все равно получите x86.

Ответ 4

Предположим, что 64-битный ПК с 64-битной установкой Windows.

%processor_architecture% возвращает x86 только при получении значения в 32-битных программах. В 64-битных программах он корректно возвращает AMD64.

Пример: выполнить echo %processor_architecture% из:

  • 32bit Total Commander
  • 64-разрядный проводник

Ответ 6

НАИБОЛЕЕ НАДЕЖНОЕ РЕШЕНИЕ:

Способ 1:
(Двухэтапная проверка с PROCESSOR_ARCHITECTURE и PROCESSOR_ARCHITEW6432)

set Arch=x64
if "%PROCESSOR_ARCHITECTURE%" == "x86" ( 
    if not defined PROCESSOR_ARCHITEW6432 set Arch=x86
) 

if "%Arch%" == "x64"    (
    msg * "yessss"
) else  (
    msg * "noooo"
)

Способ 2:

reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x32" > NUL && set OS=32BIT || set OS=64BIT

if %OS%==32BIT echo "YESSS"
if %OS%==64BIT echo "NOOO"

источник: https://superuser.com/a/293143/249349

Ответ 7

Я думаю, что причина этого заключается в том, что архитектура x86-64 должна позволять 32-разрядным программам рассматривать ее как идентичную (насколько это возможно) для 32-разрядной среды и следить за тем, чтобы 32 -битные программы не считают, что это только 64-разрядные (например, архитектура Itanium).

Это, однако, очень расстраивает людей, которым необходимо получить доступ к различиям между архитектурой x86-64 и 32-битной архитектурой в Windows.

Ответ 8

Извинись за могилу. Однако переменная окружения архитектуры процессора доступна через powershell...

$env:PROCESSOR_ARCHITECTURE

Ответ 9

Я нашел в своей системе Win7HB x64:

msgbox wscript.createobject("wscript.shell").environment("system").item("processor_architecture") ' always "AMD64"

msgbox wscript.createobject("wscript.shell").environment("process").item("processor_architecture") ' "AMD64" if launched via System32, "x86" if launched via SysWOW64