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
@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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 56044
Url: https://administrator.de/contentid/56044
Ausgedruckt am: 21.11.2024 um 22:11 Uhr
11 Kommentare
Neuester Kommentar
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
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
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
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
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.
<OT>Hallo, Frank *wink*</OT>
Du kannst dich aber mal hiermit versuchen.
<OT>Hallo, Frank *wink*</OT>
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
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