What's the best and quickest way to detect whether you're running a 32 or 64-bit version of Windows Server from the command line?
(Cygwin is installed)
A slightly quicker way would be to check for the existence of the %ProgramFiles(x86)% directory. If it exists then you're running 64-bit, if it doesn't exist then you're running 32-bit.
if exist "%ProgramFiles(x86)%" echo 64-bit
That will output
64-bit if the directory exists. That would fail, though, if it didn't exist as a variable but it did exist as a directory (as %ProgramFiles(x86)%).
You can also use the find tool to have a more accurate way to determine bitness.
set | find "ProgramFiles(x86)"
or using the
systeminfo command previously
systeminfo | find /I "System type"
/I to work across XP/2003/2008/etc)
This will return x86 on 32-bit systems and AMD64 (or IA64) on 64-bit systems.
It will list quite a bit, about 10 fields down there is one called System Type. This will tell you if it's x86 or x64
systeminfo | find /I "System type"
This is locale dependent, and slow.
Notice, that it's x86 in 32-bit
set Arch=x64 if "%PROCESSOR_ARCHITECTURE%" == "x86" ( if not defined PROCESSOR_ARCHITEW6432 set Arch=x86 )
Other way to check with a WMI query:
wmic OS get OSArchitecture
Extracted from here: http://www.sysadmit.com/2015/10/windows-como-saber-si-es-de-32-o-64-bits.html
There are numerous ways to check the processor architecture under Windows:
However, this can give different results, depending on the way in which the command-prompt is opened. To avoid getting “unexpected results” due to WoW64, you can read it directly from the registry (Microsoft made no less than two typos in the key):
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PROCESSOR_ARCHITECTURE
Microsoft also suggests reading the hardware information store from the registry:
reg query "HKLM\Hardware\Description\System\CentralProcessor\0" /v Identifier
You can also check for the existence of the x86 version of the
Program Files directory (or the environment variable that points to it) since it would only exist on a 64-bit system. Unlike the
PROCESSOR_ARCHITECTURE variable, this is not dependant on the way that the command prompt is run since the directory exists (or not) regardless of how the prompt is opened:
if not defined ProgramFiles(x86) echo 32-bit
if not exist "%systemdrive%\Program Files (x86)" echo 32-bit
These methods can be combined in a single batch-file (e.g.,
cpuinfo.bat) and provides a nice, lightning fast way to check the system from a standard Windows NT command-prompt without needing to resort to running other programs or frameworks.
This was tested on 32-bit and Intel 64-bit systems (please test on AMD64), giving correct results in <1 second:
@echo off echo PROCESSOR_ARCHITECTURE var: echo %PROCESSOR_ARCHITECTURE% | find /i "x86" > nul if %errorlevel%==0 ( echo 32-bit ) else ( echo 64-bit ) echo. echo PROCESSOR_ARCHITECTURE reg: reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PROCESSOR_ARCHITECTURE | find /i "x86" > nul if %errorlevel%==0 ( echo 32-bit ) else ( echo 64-bit ) echo. echo CentralProcessor reg: reg query "HKLM\Hardware\Description\System\CentralProcessor\0" | find /i "x86" > nul if %errorlevel%==0 ( echo 32-bit ) else ( echo 64-bit ) echo. echo ProgramFiles(x86) var: if not defined ProgramFiles(x86) ( echo 32-bit ) else ( echo 64-bit ) echo. echo ProgramFiles(x86) dir: if not exist "%systemdrive%\Program Files (x86)" ( echo 32-bit ) else ( echo 64-bit ) echo.
Although this is not the ideal answer, and
systeminfo.exe should be your preferred method of determining the system type, i.e. 32-bit or 64-bit, this solution runs a little faster if you do not want to wait for
systeminfo.exe to finish its work.
reg.exe query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" | find "BuildLabEx"
With the correct changes to the registry query and search string you can also check for operating system versions as far back as Windows 95.
systeminfo.exe is more exact and the correct way of querying,
reg.exe query is faster and more backwards compatible.
I really had to dig into this and have a real look around in WMI.
The best option in my opinion is to simply use this PowerShell string
(Get-WmiObject win32_ComputerSystem -ComputerName $ComputerName).SystemType
This even work with old Windows 2003 and XP
The answer will be one of
Or if reverting to some old fashioned cmd tools
wmic computersystem get systemtype
(Two step Validation with
set Arch=x64 if "%PROCESSOR_ARCHITECTURE%" == "x86" ( if not defined PROCESSOR_ARCHITEW6432 set Arch=x86 ) if %Arch% == "x64" ( msg * "yessss" ) else ( msg * "noooo" )
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"
Using the WMI interface, under the Command Prompt. Open the Command Prompt as Administrator, and type
wmic OS get OSArchitecture and press Enter