zensbert
Goto Top

Uninstallierte Geräte im Gerätemanager per Batch finden

Hi,
ich würde gerne per Batch erkennen, ob alle Geräte im Gerätemanager installiert sind, oder ob noch Treiber fehlen...
Sprich, sind noch gelbe Ausrufezeichen im Gerätemanager oder nicht?
So als Art End-Test...
Hardwareseitig stetiger Wechsel, das machts schwierig..
eventuell mit nem Zusatz-Prog wie devcon?
jemand eine idee?

Thx

Content-ID: 92561

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

Ausgedruckt am: 26.11.2024 um 12:11 Uhr

67369
67369 21.07.2008 um 22:43:03 Uhr
Goto Top
Geh dir Registry durch und suche nach "Driver" face-smile

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum
zensbert
zensbert 21.07.2008 um 22:55:57 Uhr
Goto Top
ohne das nun überprüft zu haben liegt die vermutung nahe, dass bei der eingabe eines derart präzisen suchbegriffes höchstwahrscheinlich eine gewisse menge an treffern kommt.. gehts genauer, oder war des als scherz gemeint?
67369
67369 21.07.2008 um 23:07:54 Uhr
Goto Top
Deine Vermutung ist richtig. Es war weder ein Scherz noch geht es genauer.

REG QUERY und dann beackern. Du wolltest eine Idee, und nun mach mal.

Wenn du es einfach haben möchtest, sieh im Gerätemanager nach.
zensbert
zensbert 21.07.2008 um 23:21:40 Uhr
Goto Top
Das is halt nich ganz der Gedanke dahinter.. ich brauch halt ne einfache auswertung die auf jede hardware passt... und nicht erst wenn ich jeden treiber stück für stück abhake..
dafür ist zuviel versch. hardware im spiel--
zensbert
zensbert 21.08.2008 um 10:40:02 Uhr
Goto Top
Hmm, es geht vielleicht wirklich mit devcon

und zwar bin ich soweit:
c:\devcon status *\* > C:\drivers.txt

jetzt steht in der TXT unter anderem:
...
PCI\VEN_8086&DEV_27CB&SUBSYS_01AD1028&REV_01\3&172E68DD&0&EB
Name: Intel(R) 82801GB USB Universal Host Controller - 27CB
Driver is running.
PCI\VEN_8086&DEV_27CC&SUBSYS_01AD1028&REV_01\3&172E68DD&0&EF
Name: Intel(R) 82801GB USB2 Enhanced Host Controller - 27CC
Driver is running.
...
PCI\VEN_8086&DEV_27DE&SUBSYS_01AD1028&REV_01\3&172E68DD&0&F2
Name: SoundMAX Integrated Digital Audio
Device has a problem: 31.

Ich habe extra die Soundkarte mal deinstalliert sodass Sie ein Ausrufezeichen im Gerätemanager hat. Dann steht in der TXT= "Device has a problem".. Jetzt müsste ich zum einen eine error variable auf 1 setzen und in einer anderen variable den Namen des Gerätes welches nicht korrekt arbeitet, was hier "SoundMAX Integrated Digital Audio" wäre. kann mir da jemand helfen? es ist ja auch wahrscheinlich, dass mal mehrere geräte nicht korrekt installiert sind... dann bräuchte ich wahrsch. auch mehrere variablen oder nicht?
Mit "findstr /n /C:"problem" "c:\drivers.txt"" gibt er mir die Zeilen-Nummer aus in der "problem" steht. Und zwar in dem Format:
138: Device has a problem: 31.
Kann ich dem jetzt sagen, hol dir die 138, zieh 1 ab um die zeile 137 auszugeben und schmeiss den inhalt in eine variable..?
Ich will halt am ende ne batch haben die sagt:
"SoundMAX Integrated Digital Audio" ist eventuell nicht korrekt installiert.
Und die weiteren Setup-Vorgänge erst nachzieht, wenn alle Treiber installiert sind.

Danke
bastla
bastla 21.08.2008 um 12:37:30 Uhr
Goto Top
Hallo chizophren!

Als erster Ansatz:
@echo off & setlocal
set "Log=%temp%\DeviceErrors.log"  

if exist "%Log%" del "%Log%"  
set /a Errors=0
set Name=
for /f "delims=" %%i in ('d:devcon status *\*') do set "Zeile=%%i" & call :ProcessLine  
if %Errors% gtr 0 (
    cls
    echo %Errors% Fehler gefunden!
    echo\
    type "%Log%"  
)
goto :eof

:ProcessLine
if defined Name goto :Auswertung
echo "%Zeile%"|findstr /i /c:"Name: ">nul || goto :eof  
for /f "tokens=1* delims=: " %%a in ("%Zeile%") do set "Name=%%b"  
goto :eof

:Auswertung
echo %Name%
echo "%Zeile%"|findstr /c:"problem">nul && goto :Fehler  
echo "%Zeile%"|findstr /c:"stopped">nul && goto :Fehler  
set Name=
goto :eof

:Fehler
>>"%Log%" echo %Name%;%Zeile%  
set /a Errors+=1
set Name=
goto :eof
Zum Testen werden gestoppte Treiber als "Fehler" behandelt.

Grüße
bastla
zensbert
zensbert 21.08.2008 um 13:42:59 Uhr
Goto Top
Ja das klappt gut.. aber ich würde das gerne in eine bestehende batch integrieren..
aber ich habe probleme wenn ich deine modifiziere.. könnte es mir nun so vorstellen dass meine batch deine aufruft jedoch müsste meine batch dann wissen ob deine fehler gefunden hat, weil diese dann zu der prozedur driver soll.. geht dass, das man da in die log irgendwas mit reinschreibt, und meine nach diesem string sucht?

:Driver
title Treiberberprfung
color f0
Echo.
Echo Warnung!
Echo.
Echo Folgende Ger„te scheinen nicht korrekt installiert!
Echo ---------------------------------------------------
ECHO.
type "%temp%\DeviceErrors.log"   
Echo.
Echo Bitte erst alle Treiber installieren!
pause > nul
exit 
bastla
bastla 21.08.2008 um 14:07:34 Uhr
Goto Top
Hallo chizophren!

Einerseits sollte sich mein Batch recht einfach integrieren lassen (an Deinen bisherigen Batch anhängen, wobei die Zeile 1 auf
:TreiberCheck
zu ändern wäre, und entsprechend mit
call :TreiberCheck
aufrufen.

Die Überprüfung, ob Fehler gefunden wurden, lässt sich übrigens auf ein
if exist "%temp%\DeviceErrors.log"  
reduzieren, da ja am Anfang eine ev noch vorhandene alte Logdatei ohnehin gelöscht wird und nur beim Auftreten eines Fehlers neu erstellt wird.

Grüße
bastla
zensbert
zensbert 21.08.2008 um 14:31:04 Uhr
Goto Top
werd ich nachher mal machen, aber das sieht schon alles sehr gut aus... 1000 dank!
netlord
netlord 18.08.2014 um 17:14:22 Uhr
Goto Top
Hallo

auch wenn der Thread schon ein bisschen älter ist ;) - ich stehe vor einem sehr ähnlichen Problem.

Die Batch da oben hat mir sehr geholfen, aber ich habe noch ein paar Fragen dazu:

- wieso heisst es in Zeile 7 'd:devcon status *\*'?
devcon.exe ist doch nicht zwangsläufig im root von laufwerk d:...
- ich hätte ganz gerne neben den devicenamen auch noch die pci-id
wie kann ich zwei zeilen ausgeben?

Danke schon mal ;)
bastla
bastla 20.08.2014 um 19:02:10 Uhr
Goto Top
Hallo netlord!

Den Pfad zur "devcon.exe" kannst Du passend angeben - schematisch sähe das dann inkl. Anzeige der ID etwa so aus:
@echo off & setlocal
set "Log=%temp%\DeviceErrors.log"  

if exist "%Log%" del "%Log%"  
set /a Errors=0
set "Name="  
for /f "delims=" %%i in ('"d:\Pfad zu devcon.exe\devcon" status *\*') do set "Zeile=%%i" & call :ProcessLine  
if %Errors% gtr 0 (
    cls
    echo %Errors% Fehler gefunden!
    echo\
    type "%Log%"  
)
goto :eof

:ProcessLine
if defined Name goto :Auswertung
echo "%Zeile%"|findstr /i /c:"Name: ">nul && (  
    for /f "tokens=1* delims=: " %%a in ("%Zeile%") do set "Name=%%b"  
) || (
    if not defined ID set "ID=%Zeile%"  
)
goto :eof

:Auswertung
echo ID:  "%ID%"  
echo Name: %Name%
echo "%Zeile%"|findstr /c:"problem">nul && goto :Fehler  
echo "%Zeile%"|findstr /c:"stopped">nul && goto :Fehler  
set "ID="  
set "Name="  
goto :eof

:Fehler
>>"%Log%" echo %Name%;"%ID%";%Zeile%  
set /a Errors+=1
set "ID="  
set "Name="  
goto :eof
Grüße
bastla
netlord
netlord 21.08.2014 um 10:01:05 Uhr
Goto Top
Perfekt

danke bastla - auf das mit den Pipes bin ich nicht gekommen....

gruß
netlord