You are not logged in.
How to (most) reliably determine what version of Windows or CMD.exe one is running under? The example on the reference page (http://ss64.com/nt/ver.html) doesn't work on 64bit XP or Windows7. On those machines, or at least the ones I have, the delineating name is missing. The output of xp32, xp64, and w7x64 respectively:
Microsoft Windows XP [Version 5.1.2600]
Microsoft Windows [Version 5.2.3790]
Microsoft Windows [Version 6.1.7600]
Is there a comprehensive list somewhere of what windows releases the version numbers correspond too?
Offline
perhaps the "Current Version / Build" column from http://en.wikipedia.org/wiki/Microsoft_ … f_releases ?
Offline
Im not sure what you're trying to find.
Are you trying to get the Windows version or the CMD version? because as you've just shown, "ver" works fine to give you the cmd version.
If you're looking for the OS, then type: echo %os%
Offline
Not sure if that version number table is going to help you or not, as it appears several different editions have the same value -- look at XP 64bit, Win2003.
There was a recent thread along these lines, with lots of replies. Have a good read through this and see if it helps http://ss64.org/oldforum/viewtopic.php?id=803
Last edited by bluesxman (25 Nov 2009 09:07)
cmd | *sh | ruby | chef
Offline
http://ss64.org/oldforum/viewtopic.php?id=803
Its still unsolved at this time with the help of many here we took it so far but not completed
still hoping it will be solved eventually
The WMIC section works well but the VER seection not so well
Last edited by Chimaera (25 Nov 2009 11:42)
Offline
Maybe there's a location in the registry with such information, then drop "ver" all together.
Offline
Im not sure what you're trying to find.
Are you trying to get the Windows version or the CMD version? because as you've just shown, "ver" works fine to give you the cmd version.
If you're looking for the OS, then type: echo %os%
OS tells me Windows_NT for both Windows7 and XP, and if memory serves hasn't changed since Windows NT 3.5.
ver gives me a version number for cmd, but that on it's own is not enough as I don't know if "5.2.3790" is XP or Server 2003 (or msdos 5 for that matter). Perhaps this doesn't actually matter though, for my immediate purpose anyway.
Maybe there's a location in the registry with such information, then drop "ver" all together.
I've learned everything to answer this question lies under "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" and reg.exe can retrieve it. Not sure the reg.exe is always available though(?)
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentVersion
thanks. I'd never heard of wmic before.
Offline
Just a note
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentVersion
Does not work on Win2k
Offline
on Windows 7 64 bit
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentVersion
gives me
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
CurrentVersion REG_SZ 6.1
and based on the release schedule
Windows 7 and Windows Server 2008 R2 NT 6.1.7600
so 6.1 sounds about right
and ver gives me
Microsoft Windows [Version 6.1.7600]
so maybe my origanal question about was based on incorrect assumptions
and we should be aiming for the numbers instead
Last edited by Chimaera (25 Nov 2009 21:32)
Offline
Try this it works on win 7 64bit and xp 32bit for me
@echo off
::==================================
::variables
if %PROCESSOR_ARCHITECTURE%==x86 set pro_arch=32 Bit
if %PROCESSOR_ARCHITECTURE%==AMD64 set pro_arch=64 Bit
if %PROCESSOR_ARCHITECTURE%==IA64 set pro_arch=Itanium 64 Bit
::==================================
ver | find "4.0.950">nul
if not errorlevel 1 (
set WinOS=Windows 95
goto OSis)
::==================================
ver | find "4.10.1998">nul
if not errorlevel 1 (
set WinOS=Windows 98
goto OSis)
::==================================
ver | find "4.10.2222">nul
if not errorlevel 1 (
set WinOS=Windows 98 SE
goto OSis)
::==================================
ver | find "4.90.3000">nul
if not errorlevel 1 (
set WinOS=Windows ME
goto OSis)
::==================================
ver | find "NT">nul
if not errorlevel 1 (
set WinOS=Windows NT
goto OSis)
::==================================
ver | find "5.0.2195">nul
if not errorlevel 1 (
set WinOS=Windows 2000
goto OSis)
::==================================
ver | find "5.1.2600">nul
if not errorlevel 1 (
set WinOS=Windows XP
goto OSis)
::==================================
ver | find "5.2.3790">nul
if not errorlevel 1 (
set WinOS=Windows 2003
goto OSis)
::==================================
ver | find "6.0.6002">nul
if not errorlevel 1 (
set WinOS=Windows Vista
goto OSis)
::==================================
ver | find "5.2.4500">nul
if not errorlevel 1 (
set WinOS=Windows Home Server
goto OSis)
::==================================
ver | find "6.1.7600">nul
if not errorlevel 1 (
set WinOS=Windows 7)::==================================
:OSis
echo.
echo.
echo.Your Operating System Is %WinOS% %pro_arch%
echo.
echo.
@pause
If im correct this should work and ive added the 32/64 bit identification into it
Can u please note which OS it does work on so we can check plz
Last edited by Chimaera (25 Nov 2009 22:17)
Offline
W7x64 reports "Windows 7 64 Bit"
XPx64 reports "Windows 2003 64 Bit"
XPx32 reports "Windows XP 32 Bit"
Offline
Here's my kick at the can, building on Chimeara's:
(((UPDATES:
r2 - updated to clean up duplicate x64 reporting
r3 - store parsed version number in _ver*
r4 - merge redundant routines
)))
@echo off
setlocal
:: from http://ss64.org/viewtopic.php?pid=3136#p3136
::==================================
::variables
if %PROCESSOR_ARCHITECTURE%==x86 set pro_arch=32 Bit (x86)
if %PROCESSOR_ARCHITECTURE%==AMD64 set pro_arch=64 Bit (AMD64)
if %PROCESSOR_ARCHITECTURE%==IA64 set pro_arch=Itanium 64 Bit (IA64)
:Main
call :clean
for /f "tokens=2 delims=[]" %%x in ('ver') do set cmdver=%%x
set cmdver=%cmdver:Version =%
call :parse_cmdver
call :ver%cmdver%
call :Report
goto :End
:clean
:: Ensure we don't inherit values from previous runs
set _verCmd=
set _verMajor=
set _verMinor=
set _verBuild=
set _verWin=
goto :eof
:Parse_cmdver
:: Turn "5.1.2306" string into actionable variables
for /f "tokens=1,2,3* delims=." %%g in ("%cmdver%") do (
set major=%%g
set minor=%%h
set build=%%i
)
goto :eof
:Report
echo.
echo. CMD version is %cmdver%
echo. which probably means %longver% %pro_arch%
echo.
goto :eof
:Report2
echo. The numbers are stored in the following variables:
echo.
set _ver
goto :eof
::Table of version numbers built from
:: http://en.wikipedia.org/wiki/Microsoft_Windows#Timeline_of_releases
:ver1.01
set longver=Windows 1.01
set shortver=Win101
goto :eof
:ver2.03
set longver=Windows 2.03
set shortver=Win203
goto :eof
:ver2.10
set longver=Windows 2.10
set shortver=Win21
goto :eof
:ver2.11
set longver=Windows 2.11
set shortver=Win211
goto :eof
:ver3.0
set longver=Windows 3.0
set shortver=Win3
goto :eof
:ver3.1
set longver=Windows 3.1, Windows For Workgroups 3.1, or Windows NT 3.1
set shortver=Win31/WFW31/WinNT31
goto :eof
:ver3.11
set longver=Windows For Workgroups 3.11
set shortver=WFW311
goto :eof
:ver3.2
set longver=Windows 3.2 (released in Simplified Chinese only)
set shortver=Win32ch
goto :eof
:ver3.5
set longver=Windows NT 3.5
set shortver=WinNT35
goto :eof
:ver3.51
set longver=Windows NT 3.51
set shortver=WinNT351
goto :eof
:ver4.0.950
set longver=Windows 95
set shortver=Win95
goto :eof
:ver4.0.1381
set longver=Windows NT 4.0
set shortver=WinNT4
goto :eof
:ver4.90.3000
set longver=Windows Me
set shortver=WinMe
goto :eof
:ver4.10.1998
set longver=Windows 98
set shortver=Win98
goto :eof
:ver4.10.2222
set longver=Windows 98 SE
set shortver=Win98SE
goto :eof
:ver5.0.2195
set longver=Windows 2000
set shortver=Win2K
goto :eof
:ver5.1.2600
set longver=Windows XP or Windows Fundamentals for Legacy PCs
set shortver=WinXP/WinFun
goto :eof
:ver5.2.3790
set longver=Windows XP, Windows XP Pro or Windows Server 2003
set shortver=WinXP/WinXP-Pro/Server2003
goto :eof
:ver5.2.4500
set longver=Windows Home Server
set shortver=WinHomeServer
goto :eof
:ver6.0.6002
set longver=Windows Vista or Windows Server 2008
set shortver=Vista/Server2008
goto :eof
:ver6.1.7600
set longver=Windows 7 or Windows Server 2008 R2
set shortver=Win7/Server2008R2
goto :eof
:End
:: return version to calling shell/script,
:: see http://ss64.com/nt/syntax-functions.html
endlocal & set _verCmd=%cmdver% & set _verMajor=%major% & set _verMinor=%minor% & set _verBuild=%build% & set _verWin=%shortver%
call :Report2 :: comment this line out to suppress extra reporting
Last edited by maphew (27 Nov 2009 18:21)
Offline
Here's my kick at the can, building on Chimeara's:
Thats good but you have several duplicate subroutine names:
:ver3.1
:ver3.1
:ver5.1.2600
:ver5.2.3790
:ver5.2.3790
:ver5.2.3790
:ver5.1.2600
:ver6.0.6002
I think in practice theres little to be gained from distinguishing between windows versions with the same build number. Its more important to have the 32/64 architecture and (in recent OS's) the features that are installed.
What can be really useful is a way to distinguish all workstations from servers e.g. you may not want to run a login script when logging into a server. We do this by having a naming convention that prefixes every server name with one short string and every workstation name with a different short string - this gives you the option to use a server OS on some workstations - as long as it's named correctly (as a workstation) everything still works.
If we look at only the major and minor version numbers and ignore the build release no. then theres no worry about the script breaking as soon as the next service pack is released.
@echo off
Setlocal
:: Get windows Version numbers
For /f "tokens=2 delims=[]" %%G in ('ver') Do (set _version=%%G)
For /f "tokens=2,3,4 delims=. " %%G in ('echo %_version%') Do (set _major=%%G& set _minor=%%H& set _build=%%I)
Echo Major version: %_major% Minor Version: %_minor%.%_build%
if "%_major%"=="5" goto sub5
if "%_major%"=="6" goto sub6
Echo unsupported version
goto:eof
:sub5
::Winxp or 2003
if "%_minor%"=="2" goto sub_2003
Echo Windows XP [%PROCESSOR_ARCHITECTURE%]
goto:eof
:sub_2003
Echo Windows 2003 or xp 64 bit [%PROCESSOR_ARCHITECTURE%]
goto:eof
:sub6
if "%_minor%"=="1" goto sub7
Echo Windows Vista or Windows 2008 [%PROCESSOR_ARCHITECTURE%]
goto:eof
:sub7
Echo Windows 7 or Windows 2008 R2 [%PROCESSOR_ARCHITECTURE%]
goto:eof
Offline
thanks for pointing out the redundancies. I've cleaned and reposted for the sake of completeness, but you're right it's largely an academic exercise to go through the trouble of distinguishing builds. Thanks for the simpler example.
Here's the question and thread which led me here, thanks for all the help!
http://stackoverflow.com/questions/1792 … running-on
Last edited by maphew (27 Nov 2009 18:43)
Offline
I think you've over cooked the goose with regard to the amount of legacy Windows versions you're checking for -- not least because some of the commands you're using using simply won't work on anything that's not NT based (e.g. Win95, Win98) and/or older than WinNT4.
cmd | *sh | ruby | chef
Offline