rony
Goto Top

Druckerinfos via VBScript auslesen - GOTO Syntax

Hallo Leute

Ich muss zugeben, ich kenne mich mit VB überhaupt nicht aus, obwohl mich das Thema tierisch interessieren würde. Aber die Zeit ... face-smile
Auf jeden Fall habe ich in diesem Forum ein Script gefunden *https://www.administrator.de/installierte_Drucker_auslesen.html*, das ich mir als Vorlage genommen habe und dieses nun anpassen/optimieren möchte.

Ausgangslage:
Ich möchte alle relevanten Infos der installieren Drucker auslesen und auf einem Share in eine INI-Datei schreiben, damit ich mittels dieser INI-Datei die Druckertreiber wieder installieren kann, wenn der Rechner mal neu aufgesetzt wird.

Mein Script sieht in etwa so aus:
DIM Druckernummer
On Error Resume Next
strComputer = "."  
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")  
Set colItems = objWMIService.ExecQuery("Select * from Win32_Printer",,48)  
For Each objItem in colItems

IF objItem.Name="SnagIt 8" then GoTo auslassen  
IF objItem.Name="PDF Drucker (eDoc PDF Printer)" then GoTo auslassen  

Druckernummer=Druckernummer+1
Wscript.Echo ""  
Wscript.Echo ""  
Wscript.Echo "[Drucker"&Druckernummer&"]"  
Wscript.Echo "Name=" & objItem.Name  
Wscript.Echo "DriverName=" & objItem.DriverName  
Wscript.Echo "PrintProcessor=" & objItem.PrintProcessor  
Wscript.Echo "PrintJobDataType=" & objItem.PrintJobDataType  
Wscript.Echo "PortName=" & objItem.PortName  

auslassen:
Next

Um die Daten in eine INI zu bekommen starte ich dieses Script wie folgt:
cscript "Printer auslesen.vbs" > C:\temp\Printer_%ComputerName%.ini


Das Resultat sollte dann etwa so aussehen:
Microsoft (R) Windows Script Host, Version 5.7
Copyright (C) Microsoft Corporation 1996-2001. Alle Rechte vorbehalten.



[Drucker1]
Name=HP 2000C TEST
DriverName=HP 2000C
PrintProcessor=WinPrint
PrintJobDataType=RAW
PortName=IP_xx.x.xxx.xxx


[Drucker2]
Name=SnagIt 8
DriverName=SnagIt 8 Printer
PrintProcessor=WinPrint
PrintJobDataType=RAW
PortName=C:\Dokumente und Einstellungen\All Users\Anwendungsdaten\TechSmith\SnagIt 8\PrinterPortFile


[Drucker3]
Name=PDF Drucker (eDoc PDF Printer)
DriverName=eDocPrinter PDF Pro
PrintProcessor=WinPrint
PrintJobDataType=RAW
PortName=eDocPDF

etc.

Nun aber endlich zu meinem Problem face-smile
1. Ich möchte nur die Infos der physische Drucker auslesen, nicht aber die der "Softwaredrucker" (wie etwas SnagIt oder PDF Drucker)
Aus diesem Grund habe ich die Goto-Sprungmarke "> GoTo auslassen" eingebaut, aber das nimmt mir das Script übel! Offenbar ist es überrascht über mein GoTo face-wink

Fehler:
Zeile: 8
Zeichen: 33
Fehler: Expected statement
Code: 800A0400
Quelle: Microsoft VBScript compilation error

Ich hab's auch schon mit >>> IF objItem.Name="SnagIt 8" then Next <<< probiert, allerdings mitdem selben Resultat.

2. Über welchen Paramter könnte ich besser prüfen, ob es ich im einen "Software-Drucker" handelt (damit ich nicht jeden "Software-Drucker" im Script aufnehmen muss?
Also so was wie: IF objItem.Type="Software" then ..... oder so...

3. Für die Installation eines TCP/IP-Printer-Ports brächte ich neben dem Portnamen auf die Port-IP.
Also so was wie: Wscript.Echo "PortAdresse=" & objItem.PortIPAdress (erfunden)
Kennt jemand so einen Parameter?

Ich bin sicher, dass das nur kleine Anfängerfehler sind und entschuldige mich hier gleich mal dafür, dass ich als VB-Neuling so dumme Fragen stelle face-wink

Besten Dank für eure Hilfe.


[Edit Biber] Ein paar Code-Tags ergänzt [/Edit]

Content-Key: 122707

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

Printed on: April 25, 2024 at 06:04 o'clock

Mitglied: 76109
76109 Aug 13, 2009 at 16:21:51 (UTC)
Goto Top
Hallo Rony!

Die GoTo-Anweisung steht Dir in VBS leider nicht zur Verfügung.

Alternativ kannst Du es in etwa so machen:
For Each...

Ausgabe = True
If objItem.Name="SnagIt 8" Then Ausgabe = False  
If objItem.Name="PDF Drucker (eDoc PDF Printer)" Then Ausgabe = False  

If Ausgabe = True Then
   ....
   ....
End If

Next

Gruß Dieter
Member: bastla
bastla Aug 13, 2009 at 16:51:46 (UTC)
Goto Top
Hallo Rony!

Nur auf die Schnelle eine Anmerkung zum Starten des Scripts: Wenn Du
cscript //nologo "Printer auslesen.vbs" > C:\temp\Printer_%ComputerName%.ini
verwendest, fallen die störenden Kopfzeilen weg ...
Doch noch was: Das einsame
DIM Druckernummer
wirkt irgendwie niedlich face-wink - mein Standpunkt dazu: Entweder alle Variablen deklarieren (und dann natürlich "Option Explicit" verwenden), oder keine ...

Grüße
bastla

P.S.: Zum Posten von Code hätten wir hier passende ...
Member: Rony
Rony Aug 14, 2009 at 06:26:33 (UTC)
Goto Top
Hallo ihr beiden - ihr seid ja von der ganz schnellen Truppe! - Besten Dank für die super schnellen Infos!

@ didi1954
Dass es für VB keinen GoTo-Befehl gibt, konnte ich fast nicht glauben, wurde mir aber bereits mehrfach bestätigt *ärger*. So ne ähnliche Lösung habe ich auch schon ausprobiert, nur war ich der Meinung, dass das auch schlanker und schöner gehen müsste, eben mit Goto oder so...

Aber was ist mit dem Befehl *Next*? Den kennt VB doch sicher.
IF objItem.Name="SnagIt 8" then Next  
Dabei erhalte ich ebenfalls eine Fehlermeldung (Fehler: Unexpected 'Next'statement - Code: 800A041F). Was mache ich da denn falsch?

@ bastla
Super, die Kopfzeilen stören mich wirklich > guter Tip!
Was den Rest betrifft, wie gesagt, ich bin halt wirklich ein blutiger Anfänger. Aber für solche Infos bin ich immer dankbar. Also auch dir besten Dank!

@ alle Andern
Da wären noch die Fragen 2 und 3. Kann mir da jemand weiterhelfen?

Gruss
Rony
Mitglied: 60730
60730 Aug 14, 2009, updated at Oct 18, 2012 at 16:39:02 (UTC)
Goto Top
Servus,

ich bezweifel mal, das dir der Ansatz wirklich etwas mehr als reine Information bringt.

Anbei kein vbs, sondern eine Batch, die ich mal zur Umstellung gebraucht habe.

if not exist \\server\Freigabe\!user2printer\printserver\%computername%.reg regedit /e \\server\Freigabe\!user2printer\printserver\%computername%.reg "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print"  

if not exist \\server\Freigabe\!user2printer\%computername%-%username%.reg regedit /e \\server\Freigabe\!user2printer\%computername%-%username%.reg HKEY_CURRENT_USER\Printers\Connections

Damit kannst du die Drucker zumindestens genauer durchleuchten und einrichten.

Wenn du einen Printserver hast - dann rate ich dir - installier dort alle Drucker, die es im Netz gibt und via:

find "%computername%" "\\server\freigabe\hp2035.log" && goto end  
reg query "HKLM\Software\Microsoft\Windows NT\Currentversion\Print\Printers\HP Laserjet P2035" && echo HP2035 auf %computername% installiert>>\\server\freigabe\hp2035.log && goto end  
rundll32 printui.dll,PrintUIEntry /if /b "HP LaserJet P2035" /f "\\server\freigabe\HP2030.INF" /r "lpt1:" /m "HP LaserJet P2035"  
:end

kannst du dann nach einer Neuinstallation gezielt Druckertreiber verteilen.

Wobei das obige Beispiel / letze Script genau 3 Tage alt ist, weil wir gerade den HP 2035 überall ausrollen.

Von daher - wenn - du dir schon die Mühe machst, dann auch so, dass es nacher "mühelos" läuft face-wink

Das ist ein funktionierender "Ansatz", den man rel. einfach umstricken kann.


Gruß

  • edit
  • Nachtrag - die Scripte sind selbstverfreilich Psexec Scripte !
Sareks ähnlicher Fred
  • /edit
Member: bastla
bastla Aug 14, 2009 at 09:24:52 (UTC)
Goto Top
Hallo Rony!
... dass das auch schlanker und schöner gehen müsste ...
Schlanker: etwas, schöner: ?
On Error Resume Next
Ausnahme = "#SnagIt 8#PDF Drucker (eDoc PDF Printer)#Microsoft XPS Document Writer#Microsoft Office Document Image Writer#"  

strComputer = "."  
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")  
Set colItems = objWMIService.ExecQuery("Select * from Win32_Printer",,48)  
For Each objItem in colItems
    If InStr(1, Ausnahme, "#" & objItem.Name & "#", vbTextCompare) = 0 Then  
        Druckernummer=Druckernummer+1
        WScript.Echo
        WScript.Echo
        WScript.Echo "[Drucker"&Druckernummer&"]"  
        WScript.Echo "Name=" & objItem.Name  
        WScript.Echo "DriverName=" & objItem.DriverName  
        WScript.Echo "PrintProcessor=" & objItem.PrintProcessor  
        WScript.Echo "PrintJobDataType=" & objItem.PrintJobDataType  
        WScript.Echo "PortName=" & objItem.PortName  
    End If
Next
Das Trennzeichen "#" soll natürlich im Druckernamen nicht vorkommen, daher bei Bedarf in den Zeilen 2 und 8 austauschen ...

Zu den Fragen 2 und 3 habe ich leider weiterhin keine Antwort ... face-sad

Grüße
bastla
Member: Rony
Rony Aug 14, 2009 at 09:41:51 (UTC)
Goto Top
Hallo TimoBeil

So eine ähnliche Lösung habe ich auch schon mal in Betracht gezogen. Aber da wir die Drucker lokal installiert haben, bringt mir das nicht so viel.

Eine INI-Datei wäre für uns die einfachste Lösung, da ich diese mit der Softwareverteilung auslesen und damit die Druckertreiber installieren kann.

So was wie:
REM *** Port erstellen ...
cscript portmgr.vbs -a -h %PortName% -p %PortAdresse% -t %PrintJobDataType% -n 9100

REM Installation eines Treibers via einer INF-Datei auf einem Share ...
cscript %vbsPfad%\prnmgr.vbs -a -f "%INFFILE%" -b "%Name%" -m "%DriverName%" -r %PortName%  

Aber trotzdem besten Dank für deine Bemühungen!