possi1980
Goto Top

Batch-Abfrage - 3 Schlüssel aus Registry abfragen, und nur das jeweils letzte Zeichen auf den Bildschirm ausgeben

Per Batch werden 3 Registry-Schlüssel abgefragt. Die Ausgabe soll in je einer Variablen (x, y, und z) gespeichert werden. Jedoch soll nur das letzte Zeichen auf dem Bildschirm ausgegeben werden; etwa in der Form: "Client CLI123 hat die Version x.y.z installiert."

Hallo zusammen,

zunächst wird der Hostname des Clients verlangt. Für diesen Client soll die Batch dann 3 Werte aus der Registry abfragen, wovon ich aber nur das letzte Zeichen benötige.
Bin im Batch-Programmieren leider nicht wirklich bewnadt, habe mir das Ganze aber so vorgestellt:

@echo off
echo Versions-Abfrage
echo.
echo Bitte IP-Adresse / Hostname eingeben:
set /p iphost=
echo.
echo Bitte warten...

reg query \\%iphost%\HKLM\Software\aaa\bbb /v MajorVer | set maj=
set x=%maj:~-1%
reg query \\%iphost%\HKLM\Software\aaa\bbb /v MinorVer | set min=
set y=%min:~-1%
reg query \\%iphost%\HKLM\Software\aaa\bbb /v HotFix | set hfx=
set z=%hfx:~-1%

echo Der Client %iphost% hat die Version:
echo %x%.%y%.%z%
Pause

Das liefert mir aber folgendes:

Versions-Abfrage

Bitte IP-Adresse / Hostname eingeben:
CLI123

Bitte warten...
Der Client CLI123 hat die Version:
~-1.~-1.~-1
Drücken Sie eine beliebige Taste . . .

Ich befürchte mal, dass der Ansatz schon falsch ist und ich mir das einfacher vorstelle, als es ist. Also: Die vorletzte ausgegebene Zeile sollte dann meinetwegen wie folgt aussehen:

2.6.14

Kann da jemand helfen?

Content-Key: 193545

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

Printed on: April 23, 2024 at 10:04 o'clock

Member: andimue
andimue Oct 31, 2012 at 11:45:13 (UTC)
Goto Top
Hi,
eine möglich Lösung (hier am Beispiel von 7-pdf):

for /f "tokens=* delims= " %a in ('reg query hklm\software\7-pdf\wc /v CurrentVersion ^| find "CurrentVersion"') do set t_temp= %a && set t_lastdigit=%t:~-1%  

Ausgabe:
set t_temp= CurrentVersion       REG_SZ  1.0.3   && set t_lastdigit=3
Member: Possi1980
Possi1980 Oct 31, 2012 at 12:16:38 (UTC)
Goto Top
also, ich habe mal meine Codezeilen 09-14 gelöscht und dann deine stattdessen verwendet. Aber nach Eingabe des Hostnamens schließt sich die cmd-Box direkt wieder. :S
Member: andimue
andimue Oct 31, 2012 at 12:34:42 (UTC)
Goto Top
Posten nochmal deinen kompletten Code und sag uns vllt. auch mal, auf was für einem Betriebssystem du ihn laufen läßt. Du kannst ja auch mal beispielhaft einen deiner Registryeinträge, die du damit abfrägst psoten.
Nur dann kann man dir qualifiziert helfen, denk ich.
Member: Exilschwaelmer
Exilschwaelmer Oct 31, 2012 at 12:41:18 (UTC)
Goto Top
In einem Script muss '%a' in '%%a' geändert werden.
Member: andimue
andimue Oct 31, 2012 at 12:56:42 (UTC)
Goto Top
@Exilschwaelmer: stimmt, das Kommando hab ich an der Kommandozeile eingegeben

@Possi1980: sollte es damit nicht funktionieren wäre der komplette Code + OS interessant
Member: Possi1980
Possi1980 Oct 31, 2012 at 13:25:19 (UTC)
Goto Top
Damit klappt es. Aber ich bekomme den ganzen Schlüssel zurückgeliefert.

Der Client CLI123 hat die Version:
FlagBaseMajorVersion REG_DWORD 0x1

Benötige aber nur das letzte Zeichen aus dem Schlüssel, also quasi nur die 1 nach dem x.

OS ist Win7 Enterprise 64 bit
Member: andimue
andimue Oct 31, 2012 at 13:56:59 (UTC)
Goto Top
Ohne deine Skript kann ich dir leider nicht weiterhelfen
Member: Possi1980
Possi1980 Oct 31, 2012 at 14:03:31 (UTC)
Goto Top
Sorry, hier ist es

@echo off
echo Versions-Abfrage
echo.
echo Bitte IP-Adresse / Hostname eingeben:
set /p iphost=
echo.
echo Bitte warten...

for /f "tokens=* delims= " %%a in ('reg query \\%iphost%\HKLM\Software\Wow6432Node\SMSInventoryExtension /v FlagBaseMajorVersion ^| find "FlagBaseMajorVersion"') do set t_temp= %%a && set t_lastdigit=%t:~-1%  

echo Der Client %iphost% hat die Version:
echo %t_temp%
Pause
Member: mayho33
mayho33 Oct 31, 2012 at 14:10:29 (UTC)
Goto Top
Hi!

Muss es BATCH sein beim Auslesen der Registry? Ich finde da VBSCRIPT wesentlich komfortabler:

Dim objShell : Set objShell = WScript.CreateObject("Wscript.Shell")
Dim objFso : Set objFso = WScript.CreateObject("Scripting.FileSystemObject")
Dim CDir : CDir = objFso.GetParentFolderName(WScript.ScriptFullName)

Dim Name, Version, Location
Name = objShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F83216024FF}\DisplayName")
Version = objShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F83216024FF}\DisplayVersion")
Location = objShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F83216024FF}\InstallLocation")

WScript.Echo Name & " " & Version & " " & Location

Auf Wunsch kannst du auch einfach mit Left(), Right(), MID() oder Replace() arbeiten und die Ausgabe anpassen.

Lässt sich dann auch aus einer BATCH heraus aufrufen:

Start cscript "meineVBS.vbs" (gibt die Ausgabe in der Console aus)
start wscript "meineVBS.vbs" (Ausgabe in einer Massagebox)

je nachdem was von System her eingestellt ist schaut die Ausgabe ohne cscript, wscript unterschiedlich aus.
Member: andimue
andimue Oct 31, 2012 at 14:23:18 (UTC)
Goto Top
probier mal:

@echo off
echo Versions-Abfrage
echo.
echo Bitte IP-Adresse / Hostname eingeben:
set /p iphost=
echo.
echo Bitte warten...

for /f "tokens=* delims= 	" %%a in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MediaPlayer\Setup /v PlaylistsVersion ^| find "PlaylistsVersion"') do (  
set "t_temp= %%a"   
set "t_lastdigit=%t_temp:~-1%"  
)

echo Der Client %iphost% hat die Version:
echo %t_lastdigit%
Pause

Hinter "delims=" ist ein Blank und ein Tab drin !
Member: bastla
bastla Oct 31, 2012 updated at 14:41:38 (UTC)
Goto Top
@ andimue
Hinter "delims=" ist ein Blank und ein Tab drin !
Nur als Anmerkung: Blank und TAB sind einerseits ohnehin Default, andererseits willst Du ja offensichtlich die gesamte Zeile - dann genügt auch
for /f "delims=" %%a in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MediaPlayer\Setup /v PlaylistsVersion ^| find "PlaylistsVersion"') do (
Das Entnehmen des letzten Zeichens solltest du allerdings nicht innerhalb der "for"-Schleife, sondern erst danach durchführen (Stichwort: "delayedExpansion") - daher solltest Du so:
for /f "delims=" %%a in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MediaPlayer\Setup /v PlaylistsVersion ^| find "PlaylistsVersion"') do set "t_temp=%%a"   
set "t_lastdigit=%t_temp:~-1%"  
eher Erfolg haben ...

Grüße
bastla
Member: Possi1980
Possi1980 Oct 31, 2012 updated at 14:46:37 (UTC)
Goto Top
Das liefert mir leider auch wieder nur folgende Ausgabe: ~-1

Ok, mit dem unteren Code hat es nun endlich geklappt. Den Rest bastel ich mir dann so zusammen.
Vielen Dank erstmal für die ganze Hilfe. Wünsche allen einen schönen Feiertag morgen!
Member: pieh-ejdsch
pieh-ejdsch Oct 31, 2012 updated at 16:05:33 (UTC)
Goto Top
moin,

wenn da nur das x ist:
set "Key=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MediaPlayer\Setup"  
for /f "Tokens=1,2 delims=x" %%a in (' reg query %key% ') do for /f %%a in ("%%a") do set "%%a=%%b"  
 
echo %MajorVer%.%MinorVer%.%HotFix%
Pause 

Gruß Phil
Member: andimue
andimue Nov 02, 2012 at 09:33:25 (UTC)
Goto Top
@bastla:

Danke für den Tipp und natürlich hast du recht mit der "delayedexpansion". Interessanterweise hab ich es, wie von mir beschrieben ausprobiert und es hat funktioniert.
Liegt möglicherweise daran, dass nur 1 Schleifendurchlauf gemacht wurde, ab dem 2.Loop hätte es dann wohl nicht mehr funktioniert, oder?

Aber auf jeden Fall vielen Dank für den Hinweis face-smile
Member: bastla
bastla Nov 02, 2012 at 10:50:58 (UTC)
Goto Top
Hallo andimue!
Liegt möglicherweise daran, dass nur 1 Schleifendurchlauf gemacht wurde, ab dem 2.Loop hätte es dann wohl nicht mehr funktioniert, oder?
Es dürfte überhaupt nicht funktionieren - allerdings hast Du auch kein "setlocal" verwendet, sodass "%t_temp%" vermutlich noch den Inhalt des vorhergegangenen Tests hatte ...

Grüße
bastla
Member: andimue
andimue Nov 02, 2012 at 11:49:28 (UTC)
Goto Top
Hallo bastla,

auch da hast du wieder zu 100% den Nagel auf den Kopf getroffen. %t_temp% wird natürlich während der for-Schleife überhaupt nicht mehr verändert und da die Variable vorher nicht definiert war klappt es überhaupt nicht. Es hat nur geklappt, weil die Variable t_temp aus einem vorherigen Test schon versorgt war.
So ist das halt mit quick & dirty

Wird Zeit, dass das Wochenende kommt ...

Freundliche Grüße
Andi