jschneider
Goto Top

parsen einer Ausgabe (Drucker auslesen)

Hallo

ich mal wieder face-wink

ich möchte die aktuellen Drucker eines Benutzers auslesen und entsprechend formatiert weiterverarbeiten

das nehm ich zum auslesen
reg  query "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices" >> c:\temp\drucker\drucker.log  

die ausgabe hierzu sieht dann so aus

Listing of [Software\Microsoft\Windows NT\CurrentVersion\\Devices]

REG_SZ   	\\vshqprt01\GND0783-HPLJ4000-PS	winspool,Ne00:
REG_SZ   	\\vshqprt01\GND0783-HPLJ4000-PCL	winspool,Ne01:
REG_SZ   	\\[Public]\GND0783_HPLJ4000N	winspool,Ne02:



wenn ich die drucker.log mit folgendem code parse

For /f "tokens=4-5 delims=\ " %%a in (c:\temp\drucker\drucker.log) do (  
@echo %%a  >> %logfile%)

funktioniert das nicht danz sauber, da mir anstatt:

\\vshqprt01\Drucker0783-HPLJ4000-PS
\\vshqprt01\Farbdrucker0784-HPLJ4000-PCL
\\[Public]\Drucker0785_HPLJ4000N


folgende ausgabe gegeben wird:

Microsoft
Drucker0783-HPLJ4000-PS winspool,Ne00:
FarbdruckerDrucker0784-HPLJ4000-PCL winspool,Ne01:
Drucker0785_HPLJ4000N winspool,Ne02:


hülfe

face-wink

Content-Key: 72302

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

Ausgedruckt am: 28.03.2024 um 21:03 Uhr

Mitglied: bastla
bastla 30.10.2007 um 14:42:18 Uhr
Goto Top
Hallo jschneider!

Wie wäre es einfach mit
for /f "tokens=2" %%a in (c:\temp\drucker\drucker.log) do @echo %%a  >> %logfile%  

Abgesehen davon lässt sich das besser testen, wenn die (erwünschten bzw unerwünschten) Ergebnisse sich aus dem angegebenen Beispiel ableiten lassen - mein Ergebnis sieht nämlich so aus:
\\vshqprt01\GND0783-HPLJ4000-PS
\\vshqprt01\GND0783-HPLJ4000-PCL
\\[Public]\GND0783_HPLJ4000N

Grüße
bastla
Mitglied: jschneider
jschneider 30.10.2007 um 14:47:29 Uhr
Goto Top
hi bastla - du schon wieder face-wink


einen fehler hab ich drin in meinem posting

ich möchte nicht

\\vshqprt01\GND0783-HPLJ4000-PS

sondern

GND0783-HPLJ4000-PS

raushaben
Mitglied: bastla
bastla 30.10.2007 um 15:09:34 Uhr
Goto Top
Hallo jschneider!

Dann machen wir's halt so (und eliminieren gleich auch die Überschriftszeile, aus welcher das - natürlich nur in diesem Zusammenhang unerwünschte face-wink - "Microsoft" stammte):
for /f "tokens=4 delims=\ " %%i in ('findstr "REG_SZ" c:\temp\drucker\drucker.log') do @for /f %%a in ('echo %%i') do @echo %%a  
Der Grund, warum bei Deinem Ansatz "winspool,Ne00:" nicht abgeschnitten wurde, liegt im Trennzeichen "Tab" - daher ließe sich das Ganze noch kürzer so schreiben:
for /f "tokens=3 delims=\	 " %%a in ('findstr "REG_SZ" c:\temp\drucker\drucker.log') do @echo %%a  
wobei nach "delims=" neben "\" und dem Leerzeichen auch ein Tab-Zeichen eingegeben werden muss. In der ersten Version oben enthält die zweite Zerlegung mit "for" keine "delims"-Angabe, wodurch automatisch Leerzeichen und Tab als Trennzeichen verwendet werden.

Grüße
bastla

P.S.:
hi bastla - du schon wieder face-wink
Na ja, ich komm' gelegentlich hier vorbei ... face-wink
Mitglied: Biber
Biber 30.10.2007 um 20:01:34 Uhr
Goto Top
Einspruch, Euer Ehren,

das reicht so nicht mit einer FOR-Anweisung.
Und ich bekomme es auch nicht als Oneliner (ohne call-Block) hin.

Bei der Ausgabe von reg.exe 3.0 (bei XP) werden Netzwerkdrucker und z.B. PDF-Drucker aufgelistet.

Echt-Ausgabe von Reg.exe 3.0; nur Server/Druckernamen verallgemeinert:
! REG.EXE VERSION 3.0

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices
    PDF-ConverterPro    REG_SZ  winspool,Ne00:
    Microsoft XPS Document Writer       REG_SZ  winspool,Ne01:
    \\xxxxxxxxxxx001\xxxxxxxxxxx001     REG_SZ  winspool,Ne02:
    \\yyyyyyyyyyy001\yyyyyyyyyyy010     REG_SZ  winspool,Ne03:
    \\aaaaaaaaaa015\aaaaaaabiblub       REG_SZ  winspool,Ne04:
    \\bbbbbbbbb955\bbbbG834 - PeterPanzer       REG_SZ  winspool,Ne05:
    \\cccccccc0003.xxx.yy.biz\uuuuuuuuu016      REG_SZ  winspool,Ne06:
    \\dddddddd0011.xxx.yy.biz\vvvvvvvvv501-PCL  REG_SZ  winspool,Ne07:
    \\eeeeeeeee005\eeeee130     REG_SZ  winspool,Ne08:
    \\zzzzzzzzzzl3\HP Color LaserJet 5500 PCL6  REG_SZ  winspool,Ne10:
    \\zzzzzzzzzzl3\PLW021_HP1055CM      REG_SZ  winspool,Ne11:

Alle Druckerzeilen beginnen mit 5 leading spaces.
Und ich sehe keinen anderen Weg, als erst die Zeile mit den TABs zu trennen.
Dann ist der Drucker = Token 1 entweder etwas wie
[    PDF-ConverterPro    ]
[    Microsoft XPS Document Writer       ]
...-oder-
[    \\zzzzzzzzzzl3\HP Color LaserJet 5500 PCL6  ]

Wenn ich die sauber trennen will, egal ob "\" enthalten oder nicht, brauche ich mehr als eine Zeile.
Und die leading blanks (die stehen bleiben, wenn kein "\" im Token1 vorkommt), bekomme ich nur über einen "call:" weg.

Die Reg-Ausgabe von oben ist gefaked..*gg

:: ------snipp DispPrinternames.bat
@echo off & Setlocal 
Set Key="HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices"  
:: delims in der nächsten Zeile ist ein TAB
@for /f "skip=4 delims=	" %%i in ('reg  query %key%') do @(   
  For /f "delims=\ tokens=1-3" %%a in ("%%i") do @(  
    if [%%b]== (call :disp %%a )else echo %%c
))
Goto :eof
:disp 
@echo %*
:: ------snapp DispPrinternames.bat
Ausgabe damit as should do:
PDF-ConverterPro
Microsoft XPS Document Writer
.....
HP Color LaserJet 5500 PCL6
PLW021_HP1055CM
Gruß
Biber
Mitglied: bastla
bastla 30.10.2007 um 20:26:11 Uhr
Goto Top
@Biber
... as should do ...
Bei mir war's nur ein works as designed ... face-wink

Grüße
bastla
Mitglied: bastla
bastla 30.10.2007 um 21:00:39 Uhr
Goto Top
... und übrigens: Einspruch gegen den Einspruch (bzw gegen den "Fake"-Vorwurf):

Die "COMPMGMT_REGISTRY_reg.exe" aus den "Windows NT 4.0 Resource Kit Support Tools" (sp4rk_i386.exe, Version 4.71.0819.0) etwa liefert tatsächlich das dargestellte Format.

Grüße
bastla
Mitglied: Biber
Biber 30.10.2007 um 21:07:18 Uhr
Goto Top
OMG, bastla,

warst du vorhin bei eBay oder auf einem Garagen-Flohmarkt oder wo hast Du dieses Schätzchen noch aufgetrieben...?

Okay, okay, ich ziehe den Fake-Vorwurf reumütig zurück. Einspruch stattgegeben.

Und ich sage auch nichts zu M$s PraktikantInnen, die ausgerechnet bei den paar nützlichen Batch-Befehlen wie Reg.exe uder Shutdown.exe oder Date/t von Version zu Version die Eingabe- und Ausgabeformate ändern....

Schönen Abend Dir...
Biber
Mitglied: bastla
bastla 30.10.2007 um 21:27:03 Uhr
Goto Top
Hallo Biber!

Ich hatte mich ja auch über das Format der "reg"-Ausgabe gewundert, da mein erster Ansatz natürlich auch ohne die "Temp"-Datei auskommen sollte ...

Da ich nun leider nicht über Deine Erfahrung und detaillierte Kenntnis der diversen MS-Hervorbringungen verfüge (aber ganz gerne mal etwas für schlechte Zeiten zurücklege - etwa alle Sysinternals-Tools in der letzten Version der "Vor-MS-Ära" face-wink) hat es dann doch etwas gedauert, bis ich das Teil ausgegraben hatte - ist übrigens gar nicht sooo face-wink alt (Dateidatum 20.04.1998).

Im übrigen ist natürlich Deine Zerlegung viel sauberer, da mein Ansatz nur für die im Beispiel angeführten Netzwerkdrucker zuverlässig funktioniert, daher sollte es dann folgende Version mit der "historischen reg.exe" tun:
@echo off & setlocal
set Key="HKCU\Software\Microsoft\Windows NT\CurrentVersion\Devices"  
:: delims in der nächsten Zeile ist ein TAB
for /f "skip=3 tokens=2 delims=	" %%i in ('reg query %Key%') do (   
  for /f "tokens=1-2 delims=\" %%a in ("%%i") do (  
    if [%%b]== (echo %%a) else echo %%b
  )
)

Auch Dir einen schönen Abend
bastla