36539
Goto Top

WIN-Betriebssystem, ServicePack und Sprache ermitteln

Hallo,

ich suche eine Möglichkeit sowohl das WIN-Betriebssystem, das ServicePack und die Sprache des OS (nur Deutsch oder Englisch) zu ermitteln und die 3 Angaben in jeweils eigene Variablen zu speichern. Ich möchte das Script in eine Batch einbauen und die Variablen in der Batch weiterverwenden.

Ich habe keine Ahnung von Scriptprogrammierung habe aber mal eine Vorlage "osfind.vbs" gefunden.
strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" _  
    & strComputer & "\root\cimv2")  
Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")  
For Each objOperatingSystem in colOperatingSystems
    Wscript.Echo objOperatingSystem.Caption & " SP " & objOperatingSystem.ServicePackMajorVersion  
Next

Damit kann ich mir das installierte WIN-Betriebsystem inkl. SP-Angabe anzeigen lassen und über
for /f "tokens=*" %%a in ('cscript //nologo "%startpfad%osfind.vbs"') do set "winvers=%%a"  
auch an die Variable %winvers% übergeben und in der Batch weiterverwenden.

Nachteile bisher:
1.
Ich kann damit noch nicht zwischen Deutsch und Englisch unterscheiden
2.
Ich weiß nicht wie ich in VBScript das Betriebssystem, ServicePack und Sprachversion (als DE oder ENG) in eigene/getrennte Variablen übergeben kann.
3.
Schönheitsfehler bei "Wscript.Echo objOperatingSystem.Caption & " SP " & objOperatingSystem.ServicePackMajorVersion"
Ab WIN Vista enthält objOperatingSystem.Caption auch ein Copy- und TM-Zeichen.
Bei der Batchausgabe wird aber das TM nicht korrekt dargestellt.
So kommt es in der Batch z. Bsp. zur Ausgabe von --> Microsoft© Windows VistaT Ultimate SP 1


Für die Sprache habe ich nur das nachfolgende Script gefunden:
strComputer = "."  
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")  
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem")  
For Each objItem In colItems
  WScript.Echo "Country Code: " & objItem.CountryCode  
  WScript.Echo "Locale: " & objItem.Locale  
  WScript.Echo "OS Language: " & objItem.OSLanguage  
  WScript.Echo "Code Set: " & objItem.CodeSet  
Next

Das Script gibt mir nur Zahlenwerte aus, nutz mir also so nichts. Es sei denn ich wüste die Zahlenwerte für DE und ENG aus
"OS Language: " & objItem.OSLanguage.  
Dann könnte ich das Ganze per Vergleich von Zahlenwert auf Wortwert "DE" oder "ENG" in der Variablen tauschen oder gleich direkt über den Zahlenwert weiterbearbeiten.

Enthält die Sprachwert-Variable nicht den Wert "DE" oder "ENG" lasse ich meine Batch abbrechen. Ansonsten wird in Abhängiogkeit vom Wert in der Batch weitergearbeitet.

Könnt ihr mir hierbei bitte helfen und mir aus den vorstehenden Script-fragmenten 1 Script so bauen das es mir in der Batch die schon genannten/gewünschten 3 Variablen liefert?

Vielen Dank
onegasee59

Content-Key: 87812

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

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

Member: AndreasHoster
AndreasHoster May 16, 2008 at 17:10:42 (UTC)
Goto Top
Die OSLanguage Werte findest Du unter http://msdn.microsoft.com/en-us/library/aa394239.aspx

Um es in 3 getrennte Variablen zu speichern, mach doch einfach 3 VB-Skripte die jeweils einen Wert ausgeben.
Member: Biber
Biber May 16, 2008 at 17:59:08 (UTC)
Goto Top
Moin onegasee59,

die beiden VBS-Schnipsel kannst naturlich zu einem zusammendampfen und damit...
strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" _  
    & strComputer & "\root\cimv2")  

Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")  
For Each objOperatingSystem in colOperatingSystems
    Wscript.Echo objOperatingSystem.Caption & " SP " & objOperatingSystem.ServicePackMajorVersion  
Next

Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem")  
For Each objItem In colItems
  WScript.Echo "Country Code: " & objItem.CountryCode  
  WScript.Echo "Locale: " & objItem.Locale  
  WScript.Echo "OS Language: " & objItem.OSLanguage  
  WScript.Echo "Code Set: " & objItem.CodeSet  
Next
... diese reduzierte Ausgabe erhalten:
>cscript //nologo e:\schnipsel\getosdata.vbs
Microsoft Windows XP Professional SP 2
Country Code: 49
Locale: 0407
OS Language: 1031
Code Set: 1252

Aber bei der Frage nach "Deutsch" oder "Englisch" wirst Du über diesen Weg IMHO nur Näherungswerte bekommen.

Weil Du mit OSLanguage=1031 für Deutsch und 1033 für Englisch/US fast immer richtig liegen wirst, aber irgendwann die Exoten wie 4103 "German - Luxembourg" oder den Wert für "English - Australia" vergisst.

Wenn Du nur die Aussage "Deutsch" oder "Englisch" brauchst, solltest Du vielleicht als Alternative eine Registry-Abfrage (per Reg.exe oder WMI oder whatever) erwägen.
Beispiel:
>reg query "HKCU\Control Panel\International" /v slanguage|find /i "slanguage"  
    slanguage   REG_SZ  DEU
Diese slanguage ist offensichtlich nicht so fein differenziert wie die OSLanguage - für Dich besser.

Ich würde also die OS + SP-Version über den ersten Schnipsel holen und die "DE" bzw "EN"-Angabe aus den HKCU-Einstellungen (s.o.. die ersten zwei Zeichen von slanguage).

Grüße
Biber
Member: miniversum
miniversum May 16, 2008 at 18:24:26 (UTC)
Goto Top
Wenn du diese vbs Dateien nehmen willst kanns tdu sie einfach folgendermasen zusammenbauen und abändern (ungetestet):

strComputer = "."  
s = ""  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" _  
    & strComputer & "\root\cimv2")  
Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")  
For Each objOperatingSystem in colOperatingSystems
    s = objOperatingSystem.Caption & "#SP " & objOperatingSystem.ServicePackMajorVersion & "#"  
Next

strComputer = "."  
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")  
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem")  
For Each objItem In colItems
  if objItem.OSLanguage = 9 then s = s & "ENG"  
  if objItem.OSLanguage = 1031 then s = s & "DE"  
  if objItem.OSLanguage = 1033 then s = s & "ENG"  
Next

Wscript.Echo s
Das liefert dir dann die Infos in einer Zeile mit "#" als Trennzeichen.
Das ganze kannst Du dann in Batch folgendermasen abrufen:
for /f "tokens=1,2,3 delims=#" %%a in ('cscript //nologo "%startpfad%osfind.vbs"') do set "winvers=%%a" & set "winsp=%%b" & set "winlang=%%c"
Mitglied: 36539
36539 May 16, 2008 at 18:25:44 (UTC)
Goto Top
Moin moin Biber,

Die Zahlenwerte würde ich über die Variablen abfangen die Mühe mach ich mir. Ich schreibe die Zahlencodes einfach in eine Zusatzvariable oder Textdatei und lass auf Übereinstimmung abgleichen.

Aber ich hab absolut keinen Plan wie ich aus dem Script die Variablen für Betriebsystem, ServicePack und Länderzahlencode in einzelne Variable bekomme, ohne tatsächlich 3 Scripte zu schreiben. Geht das tatsächlich nicht einfacher?

Gruß
onegasse59
Mitglied: 36539
36539 May 16, 2008 at 18:44:17 (UTC)
Goto Top
Hallo miniversum

Ist ja Irre - Getestet und Funktioniert auf Anhieb Bestens.
Liefert mir genau das wie ich es wollte.

Mit dem Schönheitsfehler unter Vista...
Bei der Batchausgabe wird aber das TM nicht korrekt dargestellt.
So kommt es in der Batch z. Bsp. zur Ausgabe von --> Microsoft© Windows VistaT Ultimate SP 1
...kann ich erstmal leben.
Ich teste mal ob ich mit der Syntax: %winvers:~-99,99%
die beiden letzen Zeichen TM (oder ist das in Wirklichkeit nur eins? )bei %winvers% wegblenden kann.

Ich Bedanke mich herzlichst face-smile face-smile

Gruß
onegasee59
Mitglied: 36539
36539 May 16, 2008 at 19:15:13 (UTC)
Goto Top
Hallo,

Ich teste mal ob ich mit der Syntax: %winvers:~-99,99%
die beiden letzen Zeichen TM (oder ist das> in Wirklichkeit nur eins? )bei %winvers% wegblenden kann.
Denkfehler, nein das geht nicht, da ja nicht "Vista" sondern die Vista Version wie Ultimate, Home Premium usw.
das letzte Wort in der Variable %winvers% ist.

Nochmals Danke an Dich/Euch face-smile
Habt mir schon riesig weitergeholfen.

Gruß
onegasse59