34

I am trying to retrieve the environment variable to detect whether the system is 32 or 64 bit. But on 64 bit server the environment variable %processor_architecture% is returning x86 instead of AMD64.

Does anyone has any clue about this?

Lesmana
  • 25,663
  • 9
  • 82
  • 87
alice7
  • 3,834
  • 14
  • 64
  • 93
  • 2
    bash tag? I'm assuming this is just for windows. What version are you running? – Dan McGrath Nov 15 '09 at 22:09
  • Guys i think it was the problem that MCG and bobince suggested. – alice7 Nov 15 '09 at 22:44
  • I'm having a similar issue with Jenkins. My session is running from a CMD.exe console that is in C:\Windows\SYSWOW64 and still no luck, but if the JVM is being set to x86, then that... could get tricky... – kayleeFrye_onDeck Apr 25 '17 at 03:24

9 Answers9

56

You may be getting the wrong environment variable. If your application is a 32-bit application running on a 64-bit OS the process version of this environment variable will return x86. If you want to find the architecture of the machine, you can grab it from the following registry entry:

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

Or if you're using .NET, then you can use this call to get it:

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

From the command line you can try this:

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

There is even a more simple solution using cmd:

ECHO %PROCESSOR_ARCHITECTURE%
Wai Ha Lee
  • 8,598
  • 83
  • 57
  • 92
Gerald
  • 23,011
  • 10
  • 73
  • 102
  • I just tried this and it is working. Thanks so much for your help. – alice7 Nov 15 '09 at 22:34
  • 4
    Thankyou. I just ran into this problem. MS - what a bunch of brain surgeons. A variable which tells you the target platform *of the currently executing binary*. Fish, bicycle, usefulness of to, etbloodycetra. –  Mar 25 '11 at 20:30
  • perfect, I am launching my batch file from 32-bit version exe in 64-bit architecture hence get into the same problem. – NDestiny Jan 12 '17 at 09:52
11

You can also get this from an environment variable, PROCESSOR_ARCHITEW6432. See this article for more info.

Patrick Cuff
  • 28,540
  • 12
  • 67
  • 94
9

Are you actually running a 64-bit version of Windows? If you are running 32-bit Windows on a 64-bit-capable CPU, you will still get x86.

bobince
  • 528,062
  • 107
  • 651
  • 834
6

Assuming 64bit PC with 64bit Windows installation.

%processor_architecture% returns x86 only when getting the value in 32bit programs. In 64bit programs it returns correctly AMD64.

Example: execute echo %processor_architecture% from:

  • 32bit Total Commander
  • 64bit Explorer
SkyRaT
  • 285
  • 3
  • 6
  • What's this 64-bit Explorer you speak of? Can you provide a link? – chamberlainpi Jun 05 '16 at 17:23
  • 1
    @bigp, it is the built-in file manager a.k.a Windows Explorer (`explorer.exe`). Running on 64bit Windows installation, this guy is 64bit program. – SkyRaT Jun 06 '16 at 23:03
  • That was the answer for me, normal windows console was 64-bit, but starting via total-commander showed `x86` thx for solving my problem – Radon8472 Oct 24 '21 at 11:54
3

AMD64 is a brand of CPU which is based on the x86 architecture. x86-64 more precisely, which is the 64-bit extension of x86.

This also relates to bobince's answer.

This Knowledge Base article shows you how to determine if your system is 32-bit or 64-bit

Dan McGrath
  • 41,220
  • 11
  • 99
  • 130
3

MOST RELIABLE SOLUTION:

Method 1:
(Two step Validation with PROCESSOR_ARCHITECTURE and 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"
)

Method 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"

source: https://superuser.com/a/293143/249349

T.Todua
  • 53,146
  • 19
  • 236
  • 237
  • 1
    for your method 1 to work for me on Win8.1 the test of Arch must be quoted so **if "%Arch%" == "x64"** – Craig Apr 09 '16 at 04:12
1

I think part of the reason it is like this way is that the x86-64 architecture has to allow 32-bit programs to treat it as identical (as far as possible) to a 32-bit environment and make sure that 32-bit programs do not think it is 64-bit only (like the Itanium architecture).

This however makes it very frustrating to people who need to access the differences between the x86-64 architecture vs 32 bit architecture on Windows.

1

I found on my Win7HB x64 system:

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
omegastripes
  • 12,351
  • 4
  • 45
  • 96
1

Apologize for the grave dig. However, the processor architecture environmental variable is accessible via powershell ...

$env:PROCESSOR_ARCHITECTURE
Edward J Beckett
  • 5,061
  • 1
  • 41
  • 41