2009-11-24 24 views
14

¿Cómo se puede determinar en qué versión de Windows y/o cmd.exe se está ejecutando un archivo por lotes?cómo saber en qué versión de Windows y/o cmd.exe se está ejecutando un archivo por lotes?

No hay cmd /version que he podido encontrar y los resultados de SET en una sesión de símbolo del sistema no dan nada obviamente único (entre XP y Win7 de todos modos).

+0

archivo por lotes de MS para [Cómo determinar el tipo de sistema operativo en una secuencia de comandos de inicio de sesión] (http://support.microsoft.com/?kbid=190899), solo cubre W95, NT, 2000, Enterprise NT. –

+0

este script de SS64 funciona desde W9x hasta XP, pero * no * XPx64 o Win7 x64 - http://ss64.com/nt/ver.html –

+0

fragmento de reg.exe para recuperar la versión #: {{{reg query " HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion "/ v CurrentVersion}}} –

Respuesta

7

La versión de cmd.exe debería ser en realidad bastante irrelevante, a menos que se intenta utilizar características que antes no existían (en command.com por ejemplo). Existe la pseudovariable

%cmdextversion% 

que mantiene la versión de las extensiones de comando que ha sido para las edades de 2 (por lo menos volver a NT 4, IIRC).

Pero, de nuevo al punto de fabricación: ver y análisis de la cadena de versión podría ser su mejor apuesta:

for /f "tokens=2 delims=[]" %%x in ('ver') do set WINVER=%%x 
set WINVER=%WINVER:Version =% 
+0

gracias por apuntarme en la dirección correcta y darme un empujón. Fue una gran ayuda! –

2

Escriba "ver" en el símbolo del sistema.

La próxima vez, ya que esto no está realmente relacionado con la programación, sino que está relacionado con el servidor o el usuario, puede probar serverfault.com o superuser.com.

+0

Pensé en eso, pero aquí hay una colección mucho más grande de archivos de proceso por lotes que en cualquiera de esos sitios. Los scripts no son completamente programables y, sin embargo, tampoco se puede decir que sean exactamente de programación. En cualquier caso, gracias por la respuesta. Sabía que había sido algo simple. –

+2

No diría que las preguntas por lotes deben ir inmediatamente a SF o SU. Pertenecen aquí bastante bien. – Joey

+0

Johannes; si algo está etiquetado como "cmd" y "Windows", no puedo evitar mencionar SF o SU. :-) –

3

He encontrado un camino más corto usando ver así:

... 
ver | find "5.1" 
if %ERRORLEVEL% == 0 goto ver_winxp 
... 

Esta voluntad busque XP, reemplace la cadena con sus versiones deseadas

0

El comando interno ver informa el número de versión de Windows (que podría haberse aprendido escribiendo help en el símbolo del sistema).

Hay dynamic variable%CMDEXTVERSION%, pero no ha progresado en varios lanzamientos, por lo que solo es útil para delinear between Windows NT and Windows 2000 and newer. (. Gracias @Joey, here)

He aquí un lote para analizar la salida de ver para XP y versiones posteriores, cortesía de Simon Sheppard:

@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 

Y aquí está la mía bastante completo, gran parte académica, patada a la puede que devuelve el número de versión analizada como variables de entorno:

@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 
15

puede utilizar el "systeminfo" @ cmd.exe

C:\Users\Tagon8>systeminfo | findstr /B /C:"OS Name" /C:"OS Version" 
OS Name:     Microsoft Windows 8 Release Preview 
OS Version:    6.2.8400 N/A Build 8400 
+0

Esto proporciona una información completa. Muy útil. – RBT

1

Quizás alguien necesite lo siguiente para determinar el SKU (Win7). Estoy utilizando parte de este script para elegir el sistema operativo y XML correctos durante sysprep. Espero que ayude!

@echo off 

set ver=Unknown 

systeminfo > C:\sysinfo 

findstr /e /c:"Enterprise " C:\sysinfo 1>nul 2>nul  
if %errorlevel% equ 0 set ver=Enterprise 

findstr /e /c:"Ultimate " C:\sysinfo 1>nul 2>nul 
if %errorlevel% equ 0 set ver=Ultimate 

findstr /e /c:"Professional " C:\sysinfo 1>nul 2>nul 
if %errorlevel% equ 0 set ver=Professional 

findstr /e /c:"Home Premium " C:\sysinfo 1>nul 2>nul 
if %errorlevel% equ 0 set ver=Home Premium 

findstr /e /c:"Home Basic " C:\sysinfo 1>nul 2>nul 
if %errorlevel% equ 0 set ver=Home Basic  

del /f /q C:\SP\sysinfo 1>nul 2>nul 
Echo Windows 7 %ver% 

pause  
exit 
+0

Gracias por una secuencia de comandos utilizable, aunque soy fanático de arrojar algo a la raíz de C: y usaría '% temp% \ sysinfo' en su lugar. –

7

He encontrado un camino más corto usando ver así:

podría ser incluso más corto:

ver | find "5.1" >nul && goto ver_winxp 
+0

¡Gracias! Hubiera sido mejor agregar esto como un comentario a http://stackoverflow.com/a/11102816/14420 que hacer una nueva publicación. –

Cuestiones relacionadas