smarties
Goto Top

OS Betriebssystem, XP, Vista, Windows 7, Windows 8 per Batch bestimmen

@edit: Das Batch Script läuft seit Jahren Problemlos auf tausenden Rechnern.
@edit2: jetzt auch für Vista und Windows 7.
@edit3: jetzt auch für Windows 8.

Hi,

Ich benötige eine Batchdatei die die verschiedene Version von Windows unterscheidet.

Bis vor kurzem reichte mir das ganze für NT, 9x, ME, 2000 und XP. Aber nun brauche ich auch zusätzlich noch etwas für Vista und 2003.

Ich habe mir folgendes gedacht, und möchte fragen ob Ihr da etwas besseres habt oder kennt.

Danke


Mit freundlichen Grüßen
smarties

@echo off

rem diese Batch prueft das OS

VER |find /i "Windows 95" >NUL  
IF NOT ERRORLEVEL 1 GOTO 95
VER |find /i "Windows 98" >NUL  
IF NOT ERRORLEVEL 1 GOTO 98
VER |find /i "Windows Millennium" >NUL  
IF NOT ERRORLEVEL 1 GOTO ME
VER | find "XP" > nul  
IF %errorlevel% EQU 0 GOTO XP
VER | find "2000" > nul  
IF %errorlevel% EQU 0 GOTO 2000
VER | find "NT" > nul  
IF %errorlevel% EQU 0 GOTO NT
VER | find "Microsoft Windows [Version 6.0" > nul  
IF %errorlevel% EQU 0 GOTO Vista
VER | find "Microsoft Windows [Version 6.1" > nul  
IF %errorlevel% EQU 0 GOTO W7
VER | find "Microsoft Windows [Version 6.2" > nul  
IF %errorlevel% EQU 0 GOTO W8
VER | find "Microsoft Windows [Version 5" > nul  
IF %errorlevel% EQU 0 GOTO 2003
goto unknown
goto end

:unknown
echo unknown
goto end

:95
echo 95
goto end

:98
echo 98
goto end

:ME
echo ME
goto end

:NT
echo NT
goto end

:2000
echo 2000
goto end

:XP
echo XP
goto end

:Vista
echo Vista
goto end

:W7
echo W7
goto end

:W8
echo W8
goto end

:2003
echo 2003
goto end

:end

Content-ID: 56044

Url: https://administrator.de/contentid/56044

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

Biber
Biber 10.04.2007 um 10:15:22 Uhr
Goto Top
Moin smarties,

im Bereich Batch und Shell haben wir dazu auch eine Musterskizze stehen Getosversion.vbs - Betriebssystem sowie die Versionsnummer per Script bestimmen.

Ich hab dort auch die Vista-Prüfung ergänzt.

Die Skizzen in dem anderen Beitrag sind Deinem Schnipsel (Danke fürs Posten!) vergleichbar.
Heißt: Viel eleganter geht es meines Wissens nicht- es existiert weder eine abprüfbare Umgebungsvariable noch gibt irgendeine Betriebssystemanweisung ein ("ENUM-") Errorlevel 1 bis 12 zurück je nach OS-Version.

Gruss
Biber
smarties
smarties 10.04.2007 um 14:53:53 Uhr
Goto Top
Hi,

danke für Deine Antwort.

Ich habe leider zur Zeit keine Möglichkeit die Batch mit Vista und 2003 zu testen, daher sind das nur angenommenen Werte.

Wäre vielleicht mal jemand so freundlich die Batch unter 2003 und Vista zu testen und mir zu sagen ob das richtige rauskommt?

Danke.
jschneider
jschneider 10.10.2007 um 16:27:52 Uhr
Goto Top
zumindest für Vista kann ich dir grünes Licht geben
zensbert
zensbert 05.09.2008 um 21:24:30 Uhr
Goto Top
oder mit in einer Batch:
FOR /F "tokens=2* delims=	 " %%A IN ('REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName') DO SET BS=%%B  
echo %BS%|findstr "Vista">nul && Echo Vista erkannt!  
smarties
smarties 05.09.2008 um 22:27:23 Uhr
Goto Top
Zitat von @zensbert:
oder mit in einer Batch:
> FOR /F "tokens=2* delims=	 " %%A IN ('REG QUERY  
> "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v  
> ProductName') DO SET BS=%%B  
> echo %BS%|findstr "Vista">nul && Echo Vista  
> erkannt!
> 
Danke für Deine Antwort nach über 1 Jahr ??

Aber inzwischen funktioniert die Batch, so wie sie oben steht, bei allen Windows-Versionen einwandfrei. Das habe ich bereits auf tausenden Kunden-PC getestet.
Soidberg
Soidberg 10.07.2009 um 11:45:06 Uhr
Goto Top
Hallo,

das ganze funktioniert sehr gut mit den bereits inkludierten OS-Versionen. Ich muss in einer Batch allerdings auch Windows Server 2008 unterbringen.

Das Problem ist das Windows Server 2008 sich per "VER" als "Microsoft Windows [Version 6" ausgibt und somit als Vista identifiziert wird.

Ich muss allerdings zwischen Server und Clients unterscheiden. Alle Server (egal welches OS) müssen unebrührt bleiben.

Gibt es eventuell einen Ordner oder einen anderen Anhaltspunkt mit dem sich das ganze identifizieren lässt?

LG Soidberg
80220
80220 10.07.2009 um 11:57:34 Uhr
Goto Top
Vista selbst kannst du anhand der Existenz der Umgebungsvariablen LOCALAPPDATA erkennen, die gibt es bei den Vorversionen nicht. Wodurch sich in Vista Server- und Clientversionen anhand von Umgebungsvariablen einfach erkennbar unterscheiden, weiß ich nicht.

Du kannst dich aber mal hiermit versuchen. face-big-smile

<OT>Hallo, Frank *wink*</OT>
smarties
smarties 22.07.2009 um 14:35:43 Uhr
Goto Top
Hi,

was genau gibt Server 2008 denn aus wenn Du ver eingibst?

Vista gibt z.B folgendes aus:
Microsoft Windows [Version 6.0.6002]

Mit freundlichen Grüßen
smarties
Soidberg
Soidberg 22.07.2009 um 17:25:45 Uhr
Goto Top
Zitat von @smarties:
Hi,

was genau gibt Server 2008 denn aus wenn Du ver eingibst?

Vista gibt z.B folgendes aus:
Microsoft Windows [Version 6.0.6002]

Mit freundlichen Grüßen
smarties

Hy, siehe hier:

Das Problem ist das Windows Server 2008 sich per "VER" als "Microsoft Windows [Version 6" ausgibt und somit >als Vista identifiziert wird.

Ich habe nun einen anderen "gefundenen" Schnipsel verwendet:

@ECHO On

:: CHECKOS
call :FncWinVer -e "2000" "2003" "2008" && goto SERVER  
call :FncWinVer -e ":::::64" && goto SERVER  
for /F "tokens=1-6 delims=:" %%a in ("%_x%") do (  
  echo Operating System... %%a  
  echo Version............ %%b  
  echo Product Suite...... %%c  
  echo Localization....... %%d  
  echo Service Pack....... %%e  
  echo Architecture....... %%f  
)

goto START

::FUNKTIONSROUTINE
:FncWinVer
setlocal EnableDelayedExpansion & set "_#SP=SP0" & set "_#OSEX1=NonSuite" & set "_#TMP=" & set "_#EL=0" & set "_#Prd=unknown system"  
  if exist "%systemroot%\system32\prodspec.ini" ( ::Name und Sprache ermitteln; NT3 bis Windows 2008  
    for /F "tokens=1* delims==" %%a in ('type "%systemroot%\system32\prodspec.ini"') do (  
      if /i "%%a" == "Product"      set _#Prd=%%b  
      if /i "%%a" == "Localization" set _#Lang=%%b  
    )
  ) else ( ::ab Vista
    set _#Lang=%LC_LANG%
    set _#TmpPrdFile=%TMP:"=%\%~n0_Prd%RANDOM%.tmp  &::Da der ProductName, z.B. "Vista (TM)", auch Klammern enthalten kann...  
    for /f "tokens=2,* delims=	 " %%a in ('%SYSTEMROOT%\system32\reg.exe query  
                                            "HKLM\Software\Microsoft\Windows NT\CurrentVersion"  
                                            /v "ProductName" 2^>NUL ^| find /i "ProductName"') do (echo."%%b") > "!_#TmpPrdFile!"  
    set /p "_#Prd=" < "!_#TmpPrdFile!" &::... wird die Variablen-Zuweisung ueber diesen Umweg vorgenommen.  
    set "_#Prd=!_#Prd:(=!" & set "_#Prd=!_#Prd:)=!" & set "_#Prd=!_#Prd:"=!"  
    del "!_#TmpPrdFile!"  
  )
  
  if exist "%windir%\SysWOW64" ( set "_#Bit=64 bit" ) else ( set "_#Bit=32 bit" )  

  set "_#Prd=%_#Prd:NT Workstation 4.=NT4 Workstation 4.%" & set "_#Prd=%_#Prd:NT Server 4.=NT4 Server 4.%"  
  set "_#Prd=%_#Prd:NT Workstation 3.=NT3 Workstation 3.%" & set "_#Prd=%_#Prd:NT Server 3.=NT3 Server 3.%"  
  
  if not exist "%SYSTEMROOT%\system32\reg.exe" ( ::NT3, NT4 und w2k kennen keine reg.exe, daher...  
    set _#TmpRegFile=%TMP:"=%\%~n0_RegExport%RANDOM%.tmp  
    %SYSTEMROOT%\regedit.exe /E "!_#TmpRegFile!" "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion"  
    type "!_#TmpRegFile!" > "!_#TmpRegFile!_ANSI-Format"  
    rem Von den ca. 60.000 rekursiv exportierten Registry-Zeilen die ersten 100 Zeilen extrahieren...
    (for /L %%i in (1,1,100) do set /p "_x=" & echo.!_x!) <"!_#TmpRegFile!_ANSI-Format" >"!_#TmpRegFile!"  
    rem ...damit die nun folgende for-Schleife wesentlich schneller abgearbeitet werden kann:
    for /f "tokens=1,2,4 delims==	 " %%a in ('type "!_#TmpRegFile!"') do (  
        if /i %%a == "CSDVersion"         set _#SP=SP%%c  
        if /i %%a == "CurrentVersion"     set _#Ver=%%b  
        if /i %%a == "CurrentBuildNumber" set _#Build=%%b  
    )
    del "!_#TmpRegFile!" "!_#TmpRegFile!_ANSI-Format"  
    set _#OSEX1=NT3_NT4_or_2000=Product Suite can not be identified
  ) else ( ::Windows XP, 2003 oder hoeher... (reg.exe ist schneller und kann MULTI_SZ "ProductSuite" auslesen) 
    for /f "tokens=1,3,5 delims=	 " %%a in ('%SYSTEMROOT%\system32\reg.exe query  
                                              "HKLM\Software\Microsoft\Windows NT\CurrentVersion" 2^>NUL') do (  
      if /i "%%a" == "CSDVersion"         set _#SP=SP%%c  
      if /i "%%a" == "CurrentVersion"     set _#Ver=%%b  
      if /i "%%a" == "CurrentBuildNumber" set _#Build=%%b  
    )
    for /f "tokens=2,* delims=	 " %%a in ('%SYSTEMROOT%\system32\reg.exe query  
                                            "HKLM\System\CurrentControlSet\Control\ProductOptions"  
                                            /v "ProductSuite" 2^>NUL ^| find /i "ProductSuite"') do set _#TMP=%%b  
    if defined _#TMP set _#TMP=!_#TMP:\0\0=!
    if defined _#TMP set _#TMP=!_#TMP:\0=, !
    if defined _#TMP if not "!_#TMP!" == ", " set _#OSEX1=!_#TMP!  
  )

  set _#TMP=%_#Prd:*Terminal Server Edition=Found_%
  if "%_#TMP:~0,6%" == "Found_" ( ::zur Vereinheitlichung: unter NT4 den Prd-TS-Eintrag nach ProductSuite verschieben  
    set _#Prd=%_#Prd: Terminal Server Edition=%
    set _#OSEX1=Terminal Server Edition, %_#OSEX1%
  )

  set "_#OS_Info=%_#Prd%:%_#Ver% Build %_#Build%:%_#OSEX1%:%_#Lang%:%_#SP%:%_#Bit%" & set "_#OS_Info=!_#OS_Info:"=!"  
  
  if "%~1" == "" (  
    echo %_#OS_Info%
    goto :LEB_FncWinVer_END
  ) else if "%~1" == "-s" (  
    endlocal & set "%~2=%_#OS_Info%" & exit /b %_#EL%  
  ) else if not "%~1" == "-e" (  
    set _#EL=2 & goto :LEB_FncWinVer_END
  ) 
  set _#EL=1
  :LOOP_FncWinVer_NextOS   ::Option -e gefunden (es soll gestestet werden, ob das aktuelle Betriebssystem bestimmte Bedingungen erfuellt)
    shift
    set "_#InfoLST=%_#OS_Info%:#END#" & set "_#ParLST=%~1:#END#"  
    :LOOP_FncWinVer_NextDetail
      set "_#InfoITM=%_#InfoLST%"                 &rem die OS-Info-Liste (z.B. "Windows XP Professional:5.1 Build 2600:...") auseinandernehmen...  
      set "_#InfoLST=%_#InfoLST:*:=%"             &rem "*:=" loescht alles bis zum Aufkommen des ersten ":"-Zeichens; uebrig bleibt der rechte Teilstring  
      if not "%_#InfoITM%" == "%_#InfoLST%" (  
        set "_#InfoITM=!_#InfoITM::%_#InfoLST%=!" &rem InfoITM=erster Eintrag (entspricht urspruengliche Liste abzueglich rechtem Teilstring)  
      )
      set "_#ParITM=%_#ParLST%"                   &rem Den Suchstring (z.B. "XP:::SP2:#END#") auseinandernehmen...  
      set "_#ParLST=%_#ParLST:*:=%"               &rem "*:=" loescht alles bis zum Aufkommen des ersten ":"-Zeichens; uebrig bleibt der rechte Teilstring  
      if not "%_#ParITM%" == "%_#ParLST%" (  
        set "_#ParITM=!_#ParITM::%_#ParLST%=!"    &rem ParITM=erster Eintrag (entspricht urspruengliche Liste abzueglich rechtem Teilstring)  
      )
      if defined _#InfoITM if defined _#ParITM if not "%_#ParITM%"  == "#END#" (  
        set "_#InfoITM=!_#InfoITM:*%_#ParITM%=Found_!"  
        if "!_#InfoITM:~0,6!" == "Found_" ( ::die Bedingung "ParITM kommt in InfoITM vor" ist fuer dieses Item erfuellt  
          set "_#EL=0"   
        ) else ( ::die erste Unstimmigkeit des Parameters wurde im aktuellen Item entdeckt
          set "_#EL=1"   
          set "_#ParITM=#END#"                   &rem Weitersuchen nicht erforderlich; auf zum naechsten Parameter  
        )
      )
    if not "%_#ParITM%"  == "#END#" if not "%_#InfoITM%" == "#END#" goto :LOOP_FncWinVer_NextDetail  
  if not "%~2" == "" if not "%_#EL%" == "0" goto LOOP_FncWinVer_NextOS  
  :LEB_FncWinVer_END
 endlocal & exit /b %_#EL%


:SERVER
cls
echo.
echo Server oder 64-Bit System gefunden! Vorgang wird abgebrochen!
ping -n 4 127.0.0.1 > NUL
goto eof


:START
cls
echo.
echo Worstation 32-Bit gefunden, UPDATEVORGANG von Adobe Reader wird nun gestartet...

LG Soidberg
smarties
smarties 23.12.2009 um 23:41:48 Uhr
Goto Top
Hi,

ich habe die Erkennung für Windows 7 ergänzt.

Gruß
smarties
smarties
smarties 15.01.2013 aktualisiert um 12:21:28 Uhr
Goto Top
Hi,

ich habe die Erkennung für Windows 8 ergänzt.

Gruß
smarties