krusher
Goto Top

Registry Einträge mit bestimmten Werten vergleichen

Hallo erstmal,
Also ich möchte gerne per batchfile automatisch vergleichen ob Windows XP, Vista oder 7 installiert ist.
wenn XP installiert ist führe script x aus wenn Vista script y und wenn 7 führe script z aus.

Also ich denke mal das ich dafür den registry Eintrag exportieren muss. und dann ein einer IF abfrage vergleichen muss.

falls noch Infos benötigt werden einfach bescheid sagen.
schonmal danke im vorraus^^

Content-Key: 141621

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

Printed on: April 19, 2024 at 01:04 o'clock

Mitglied: 77559
77559 Apr 28, 2010, updated at Oct 18, 2012 at 16:41:54 (UTC)
Goto Top
Hallo krusher,

ich kämpfe zwar auch schon mal mit der Forum-Suchfunktiom aber oft stehen unter deinem Beittrag sinnvolle Lösungshinweise.
Um das Rad nicht neu zu erfinden sieh die mal diese Anleitung an: Batch - Betriebssysteminformationen abfragen...

Gruß
LotPings
Member: krusher
krusher Apr 28, 2010 at 08:11:59 (UTC)
Goto Top
Also ich bin jetzt mal auf den Befehl <COMP> gestossen. womit ich zwei Dateien miteinander vergleichen kann.
Ist es möglich das ich für Win- XP,Vista und 7 eine Textdatei erstelle und dann einfach nur noch beim starten des Programms die
Aktuelle Version Exportiere und die Aktuelle Version dann jeweils mit allen vergleiche.
also ich mein das so:

1: @echo off
2: reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v "ProductName" > d:\version.txt
3:
4: comp d:\version.txt d:\XP.txt /A /N=3

hier hänge ich jetzt fest. der gibt mir wohl das zurück
--->
Vergleichen von d:\version.txt und d:\XP.txt
Unterschied festegestellt bei Zeile 3
Datei1 = 7
Datei 2 = X
Unterschied festegestellt bei Zeile 3
Datei 1 =
Datei 2 = P
Unterschied festegestellt bei Zeile 3
Datei1 = P
Datei 2 =
Unterschied festegestellt bei Zeile 3
Datei1 = r
Datei 2 =
Unterschied festegestellt bei Zeile 3
Datei1 = 0
Datei 2 =
Unterschied festegestellt bei Zeile 3
Datei1 = f
Datei 2 =

Datei hat nur 2 Zeilen.

nur wie werte ich das ausgebene jetzt aus. ich müsste ja vorzugsweise true oder falls erhalten. oder 1 und 0 damit ich damit weiter händeln kann.
dann könnte ich den wert 1 oder 0 in einer variable schreiben und dann anhand einer if abfrage sagen ob er die nächste datei vergleicht oder direkt mit goto zu einer anderen
stelle im queltext springt.
Member: krusher
krusher Apr 28, 2010 at 08:13:10 (UTC)
Goto Top
sry war noch am tippen hab den post zu spät gesehen. ich schau mir das an. danke. aber gesucht hatte ich, anscheind wohl nicht richtig
Member: krusher
krusher Apr 28, 2010 at 08:38:57 (UTC)
Goto Top
Also ich habe mich da jetzt mal durchgewuzelt. und habe mir anhand der infos dieses script geschrieben:

@echo off
call :FncWinVer -e "XP" && echo XP
call :FncWinVer -e "Vista" && echo Vista
call :FncWinVer -e "7" && echo 7


goto :EOF


:FncWinVer ::Version 2.0.1
::Parameters: [-e | -s] [...]
::Options: -e <Name> [Name2] When the Operating System is one of the name, function returns true (0)
:: Name can be "NT3", "NT4", "2000", "2003", "2008", "XP", "Vista"
:: For Detail-Information use e.g. "XP Professional:::German:SP2" (see Example)
:: -s <VarNameToReturnOSString>
::Example: if "%OS%" == "" echo The OS is DOS, Win3.x or Win9x & goto :EOF (you can not use batch-functions)
:: call :FncWinVer (print OS-Version, e.g. "Windows XP Professional:5.1 Build 2600:NonSuite:German:SP2:32 bit")
:: call :FncWinVer -s _x (set _x=OS-Version)
:: for /F "tokens=1-6 delims=:" %%a in ("%_x%") do (
:: echo Operating System... %%a &rem e.g. "Windows XP Professional"
:: echo Version............ %%b &rem e.g. "5.1 Build 2600"
:: echo Product Suite...... %%c &rem e.g. "Terminal Server, ..."
:: echo Localization....... %%d &rem e.g. "German"
:: echo Service Pack....... %%e &rem e.g. "SP2"
:: echo Architecture....... %%f &rem e.g. "32 bit"
:: )
:: call :FncWinVer -e "NT" "XP" && (
:: echo The Operating System is Windows NT3 or NT4 or XP
:: call :FncWinVer -e "XP::::SP2" && echo The OS is Windows XP with Service Pack 2
:: call :FncWinVer -e "XP Professional:::SP2" && echo The OS is Windows XP Profssional with SP2
:: call :FncWinVer -e "XP Professional::German:SP2" && echo The OS is German Windows XP Prof with SP2
:: call :FncWinVer -e "XP Pro::Ger:SP2" && echo The OS is German Windows XP Prof with SP2
:: )
echo The OS is not Windows NT4 or XP (&&=is true;
(
:: echo This is Windows 2003 with SP2 or higher - also can be Windows 2008, etc.
:: )
:: call :FncWinVer -e "::Terminal Server::" && echo This is a Terminal Server
:: call :FncWinVer -e ":5.1:::" && echo This is Version 5.1
:: call :FncWinVer -e ":Build 2600:::" && echo This is Build 2600
:: call :FncWinVer -e ":5.1 Build 2600:::" && echo This is Version 5.1 Build 2600
:: call :FncWinVer -e ":5.1 Build 2600" && echo This is Version 5.1 Build 2600
::Return: 0=Operating System found; 1=Operating System not found; 2=syntax error
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=!_#Prdface-sad=!" & set "_#Prd=!_#Prdface-smile=!" & 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 "_#TMP=!_#InfoITM:*%_#ParITM%=Found_!" &rem das ist _wesentlich_ schneller als find.exe, ignoriert aber Gross-/Kleinschreibung
if "!_#TMP:~0,6!" == "Found_" ( ::gefunden; nun muss die Ueberpruefung noch einmal case-sensitiv durchgefueht werden...
echo "!_#InfoITM!" | find "!_#ParITM!" >NUL && set "_#EL=0" && rem "ParITM kommt in InfoITM vor" ist fuer dieses Item erfuellt
) 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%#
Member: krusher
krusher Apr 28, 2010 at 09:24:17 (UTC)
Goto Top
habs dann doch hinbekommen. muss jetzt nur noch die werte in eine variable kriegen
Mitglied: 77559
77559 Apr 28, 2010 at 09:34:52 (UTC)
Goto Top
Schön wenn es geholfen hat,

in Zukunft solltest du bitte:
  • formatiere deinen Code unbedingt mit den dafür vorgesehenen
  • Lange unveränderte Code Segmnte nicht erneut posten, ein Hinweis reicht.
  • Diesen Beitrag auf erledigt setzen.
  • Wenn du ernst genommen werden willst, nicht zu viele Antworten auf deine eigenen Beiträge schreiben face-wink

Gruß
LotPings