parsen einer Ausgabe (Drucker auslesen)
Hallo
ich mal wieder
ich möchte die aktuellen Drucker eines Benutzers auslesen und entsprechend formatiert weiterverarbeiten
das nehm ich zum auslesen
die ausgabe hierzu sieht dann so aus
wenn ich die drucker.log mit folgendem code parse
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
ich mal wieder
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 72302
Url: https://administrator.de/contentid/72302
Ausgedruckt am: 25.11.2024 um 18:11 Uhr
8 Kommentare
Neuester Kommentar
Hallo jschneider!
Wie wäre es einfach mit
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:
Grüße
bastla
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
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 - "Microsoft" stammte):
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:
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.:
Dann machen wir's halt so (und eliminieren gleich auch die Überschriftszeile, aus welcher das - natürlich nur in diesem Zusammenhang unerwünschte - "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
for /f "tokens=3 delims=\ " %%a in ('findstr "REG_SZ" c:\temp\drucker\drucker.log') do @echo %%a
Grüße
bastla
P.S.:
hi bastla - du schon wieder
Na ja, ich komm' gelegentlich hier vorbei ...
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:
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
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
Ausgabe damit as should do:
Gruß
Biber
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
PDF-ConverterPro
Microsoft XPS Document Writer
.....
HP Color LaserJet 5500 PCL6
PLW021_HP1055CM
Biber
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
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
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" ) hat es dann doch etwas gedauert, bis ich das Teil ausgegraben hatte - ist übrigens gar nicht sooo 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:
Auch Dir einen schönen Abend
bastla
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" ) hat es dann doch etwas gedauert, bis ich das Teil ausgegraben hatte - ist übrigens gar nicht sooo 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