flauschbobbel
Goto Top

Teile des Druckernamens auslesen

Hallo Zusammen,

ich habe ein kleines Problem mit meinem Script. Leider bin ich noch ein Anfänger im Script schreiben. Ich möchte automatisiert alle Drucker entfernen, die mit "Drucker_Schalter_" beginnen.

Zunächst überprüfe ich mittels wmic ob solche Drucker überhaupt vorhanden sind um sie im Anschluß zu löschen:

 
	set NoInstDr=True

rem for /f "tokens=1-10 delims=:" %%x in ('wmic printer get DeviceID^|FINDSTR "%DruckerName%"') do (  
for /f  %%x in ('wmic printer get DeviceID^|FINDSTR "%DruckerName%"') do (  
		echo  Druckername aus DeviceID: %%x
		set "DruckerName=%%%x"  
		echo %Druckername%
		REM echo  Druckername aus DeviceID: %%x|findstr /c:"%DruckerName%" >NUL && (  
		call :WRITELOG %LINE%
		call :WRITELOG "Pruefen, ob der Drucker existiert..."  
		set "DruckerName=%DefineDruckerName%%%x"  
		call :WRITELOG "Drucker: %DruckerName% existiert."  
		call :WRITELOG "Entferne %Druckername%..."  
		call :TOTAL_REMOVE_PRINTER
		set NoInstDr=
		set StopSrv=
		)
)

If defined NoInstDr call :WRITELOG "Status NoInstDr: %NoInstDr%  Drucker: %DruckerName% nicht vorhanden."  

Das erste ECHO (Druckername aus DeviceID: %%x) funktioniert noch einwandfrei, es wird mir der/die Drucker mit Drucker_Schalter_<ip-adresse> einwandfrei angezeigt, aber leider nicht in die Variable Druckername übergeben.
Zusätzlich möchte ich die IP-Adresse, die nach "Drucker_Schalter_"steht in eine Variable bernehmen. Ich benötige aber die Variablen um später mittels rundll32 printui.dll,PrintUIEntry /dd ...usw. den Drucker zu entfernen und in der Registry
den IP-Port zu löschen.

Könnt Ihr mir einen Tipp geben? Oder gibt es eine einfachere Möglichkeit?

Hintergrund des gesamten Script ist es alle Drucker auf einem Client die mit Drucker_Schalter_ beginnen zu löschen/deinstallieren und alle Dateien/Registryeinträge zu entfernen.
Also eine Art Deinstallationsroutine.
Das Entfernen der Schlüssel usw. mache ich mit REG DELETE..., das scheint auch zu funktionieren.

Noch eine Frage:
Wie kann ich einen Service mittels eines Scripts löschen?
Den Service um den es geht ist der "BrSplService" (Brother XP spl Service).
Stoppen kann ich ihn, aber wie kann ich den Service löschen?

Danke schon mal im voraus für Eure Unterstützung.

Grüße,
Flauschbobbel

Content-ID: 88742

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

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

Biber
Biber 29.05.2008 um 18:42:06 Uhr
Goto Top
Moin flauschbobbel,

hilft es, wenn Du..
set "DruckerName=%%%x"
ersetzt durch ..
set "DruckerName=%%x"
?

Grüße
Biber
Flauschbobbel
Flauschbobbel 29.05.2008 um 19:58:41 Uhr
Goto Top
Hallo Biber,

leider nein. Das Ergebnis ist das gleiche: "Drucker_Schalter_"
Ich hatte erwartet, dass beim Auslesen das gleiche Ergebnis herauskommt wie bei
"echo Druckername aus DeviceID: %%x "

Hast Du noch weiter Ideen?

Danke und Gruß,
Flauschbobbel
Biber
Biber 29.05.2008 um 20:30:28 Uhr
Goto Top
Na ja,

weiter hatte ich noch nicht reingelesen.

Weil ich auch irgendwie das Gefühl hatte, es ist nur ein Teilausschnitt..

Also:
a) da Drucker-Devicenamen ja durchaus aus mehreren Worten/Token bestehen können, solltest Du schon den kompletten Namen in die Variable %%x übernehmen.
Also "For /f "delims=" %%x in (....) "
b) Durch das Auskommentieren mit REM hast Du eine Klammer-Zu übrig.
Ich fürchte, da sagt der Batch "und tschüss".

Erstmal so weit. Bitte testen.

Grüße
Biber
[Edit] uppps, diesmal hatte ich wohl auch eher Tomaten auf den Augen...
Muss mich wohl erst an diese neue Forumsoptik gewöhnen...[/Edit]
bastla
bastla 29.05.2008 um 20:39:27 Uhr
Goto Top
Hallo Flauschbobbel!

ich hatte erwartet, dass beim Auslesen das gleiche Ergebnis herauskommt wie bei
"echo Druckername aus DeviceID: %%x "
... kann so in der Schleife (Stichwort "delayedExpansion") nicht funktionieren, daher eher:
 
	set NoInstDr=True

for /f  %%x in ('wmic printer get DeviceID^|FINDSTR "%DruckerName%"') do call :ProcessPrinter "%%x"  
goto :eof

:ProcessPrinter
echo  Druckername aus DeviceID: %~1
set "DruckerName=%~1"  
echo %DruckerName%
for /f "tokens=3 delims=_" %%a in ("%DruckerName%") do set "IP=%%a"  
echo IP: %IP%
...
...

goto :eof
Grüße
bastla

[Edit] Die Verwendung der Variablen %DruckerName% ist mir bei näherer Betrachtung nicht so ganz klar - einerseits wird sie für die Suche benötigt, andererseits soll sie aufgrund des Ergebnisses neu gesetzt werden ... [/Edit]
Flauschbobbel
Flauschbobbel 29.05.2008 um 20:54:49 Uhr
Goto Top
Hallo bastla,

Klasse!! Es funktioniert!!! Herzlichen Dank!

@Biber: Dir ebenfalls herzlichen Dank!

Habt Ihr Spezialisten trotzdem noch einen Tipp zum Thema:
"Wie kann ich einen Service mittels eines Scripts löschen?"
Den Service um den es geht ist der "BrSplService" (Brother XP spl Service).
Stoppen kann ich ihn, aber wie kann ich den Service löschen?

Grüße,
Flauschbobbel
bastla
bastla 29.05.2008, aktualisiert am 18.10.2012 um 18:35:46 Uhr
Goto Top
Hallo Flauschbobbel!

"Wie kann ich einen Service mittels eines Scripts löschen?"
Das sollte (wenn keine saubere Deinstallation möglich ist) lt Starttyp von Diensten per Batch/Script umschalten mit "sc.exe" oder (besser?) mit "service.vbs" (beide aus den W2000 Resource Kit Tools, ersteres seit XP auch Bestandteil des BS) gehen ...

Grüße
bastla
Flauschbobbel
Flauschbobbel 03.06.2008 um 17:51:30 Uhr
Goto Top
Hallo bastla,

ich habe noch ein Verständnisproblem. Schau Dir bitte den Auszug aus meinem Skript an.

Mein Ziel ist es, zunächst zu überprüfen, ob überhaupt ein Drucker zu deinstallieren ist, der meinen Kriterien entspricht. Wenn nicht, soll eine Meldung ausgegeben werden und das Skript beendet sich.
Sind Drucker vorhanden, die meinen Kriterien entsprechen (Identisch mit %DruckerName%), dann sollen zunächst die Drucker gelöscht werden. Das funktioniert ja nun auch einwandfrei mit der for-Schleife.

Sind alle möglichen Drucker gelöscht, das können durchaus mehrere sein, dann soll der Punkt DEINSTALLATION angesprochen werden und einmalig die Treiber deinstalliert werden, der Spooler restartet werden, einige Registry-Keys und Dateien gelöscht werden.

Ich wollte die Abfrage mit der Schaltervariable NoInstDr lösen. Die wird zunächst gesetzt. Im Laufe des Unterprogramms "ProcessPrinter" wir die Variable gelöscht.
Kommt der Batch aus dem Unterprogramm wieder zurück, frage ich die Variable ab. Wenn sie gesetzt ist ist keine weitere Aktion durchzuführen, wenn nicht dann soll das Unterprogramm DEINSTALLATION einmalig durchgeführt werden.

Irgendwie funktioniert es aber nicht bei mir.

Hier der Auszug aus meinem Skript:

:CHECK_PRINTER
::  	Pruefen, ob der Drucker installiert ist.
:: 	Schalter-Variable: NoInstDr 
	set NoInstDr=True

for /f  %%x in ('wmic printer get DeviceID^|FINDSTR "%DruckerName%"') do call :ProcessPrinter "%%x"   

If defined NoInstDr (
	REM Wenn kein Printer zum deinstallieren vorhanden ist
	call :WRITELOG "Status NoInstDr: %NoInstDr%  Kein weiterer Drucker zu deinstallieren."  
	echo Drucker nicht vorhanden
) else ( 
	echo Drucker vorhanden, gehe zur Deinstallation			
 	call :DEINSTALLATION
)
	goto :ENDE


:DEINSTALLATION
	call :DEINSTALL_DRIVER
	call :STOP_START_SPOOLER
	call :DEL_REG_KEYS
	call :DEL_DIR_FILES
	goto :eof


:ProcessPrinter 
	set "DruckerName=%~1"   
	for /f "tokens=3 delims=_" %%a in ("%DruckerName%") do set "IPPortName=IP_%%a"   
	call :WRITELOG "Pruefen, ob der Drucker existiert..."  
	call :WRITELOG "Drucker: %DruckerName% existiert."  
	call :DELETE_PRINTER
	set NoInstDr= 
	goto :eof


Der erste Teil, also wenn kein Drucker zum deinistallieren vorhanden ist, wird sauber ausgeführt.
Finden sich Drucker zur Deinstallation werden die Drucker einwandfrei gelöscht (Unterprogarmm ProcessPrinter), die Schaltervariable wird auch gelöscht, aber es wird nicht in das Unterprogramm DEINSTALLATION gesprungen.
Kannst Du mir erklären warum?
Die Variable NoInstDr ist doch nicht mehr gesetzt. Dann müsste doch der "else"-Teil ausgeführt werden?

Grüße,
Flauschbobbel
bastla
bastla 03.06.2008 um 19:39:52 Uhr
Goto Top
Hallo Flauschbobbel!

Ob das Leerzeichen am Ende der Zeile 33 durch die Forumssoftware eingefügt wurde, kann ich nicht sagen - jedenfalls gehört dort aber keines hin (da damit die Variable erhalten bleibt). Sicherstellen kannst Du das durch diese Schreibweise:
set "NoInstDr="  
Grüße
bastla
Flauschbobbel
Flauschbobbel 03.06.2008 um 20:33:36 Uhr
Goto Top
Hallo bastla,

danke, habe ich geändert. Aber leider wird trotzdem das Unterprogramm DEINSTALLATION nicht ausgeführt. Hast Du noch eine Idee?

Grüße,
Flauschbobbel
bastla
bastla 03.06.2008 um 21:03:17 Uhr
Goto Top
Hallo Flauschbobbel!

Du kannst zum Test in Zeile 7 bzw am Beginn und Ende von ":ProcessPrinter" ein "set NoInstDr" setzen, um Dir den Status anzeigen zu lassen - aber wenn das Unterprogramm aufgerufen wird, müsste auch die Variable gelöscht werden. Noch genauer nachvollziehen kannst Du den Ablauf, wenn Du in Zeile 5 ein "echo on" einbaust und eine neue Zeile 16 mit "echo off" einfügst - es werden dann alle Befehle zuerst angezeigt und dann erst ausgeführt. Wenn Du jetzt noch den ganzen Batch zB mit
Batch.cmd>D:\Log.txt
startest, kannst Du den Ablauf gut nachvollziehen.
Noch eine andere Sache: Die Verwendung der Variablen %DruckerName% ist mir weiterhin nicht klar - einerseits wird sie für die Suche (Zeile 6) benötigt, andererseits im Unterprogramm ":ProcessPrinter" neu gesetzt - eigentlich müssten das verschiedene Variablen sein ...

Grüße
bastla
Flauschbobbel
Flauschbobbel 03.06.2008 um 22:11:43 Uhr
Goto Top
Hallo bastla,

habe ich gemacht. Die Variable wird im Unterprogramm sauber gelöscht.
Daher verstehe ich nicht, wenn die Routine aus dem Unterprogramm ProcessPrinter zurückkommt ist die Variable nicht gesetzt. Daher müsste doch der 2. Teil der "If defined"-Abfrage greifen und in das Unterprogramm DEINSTALLATION gehen, oder?

Zum Thema %DruckerName%:
Unsere Drucker in den Standorten heißen alle "Drucker_Schalter_<ip-adresse>".
Zu Beginn des Skripts ist die Variable mit "Drucker_Schalter_" gesetzt. Danach suche ich in ('wmic printer get DeviceID^|FINDSTR "%DruckerName%"'). Wenn ein solcher Drucker existiert, lese ich die IP-Adresse aus und setze die Variable neu, z.B. auf "Drucker_Schalter_192.168.1.225" und lösche dann in einem Unterprogramm den Drucker mit diesem Namen. Sicher hast Du Recht, ich hätte 2 unterschiedliche Variablen nehmen können, ich dachte aber es wäre so eine gute Lösung. Anscheinend aber nicht...

Grüße,
Flauschbobbel
bastla
bastla 03.06.2008 um 22:24:08 Uhr
Goto Top
Hallo Flauschbobbel!

Wenn (aufgrund des eingefügten "set NoInstDr") vor der "If defined NoInstDr"-Abfrage eine Meldung der Art "Die Umgebungsvariable "NoInstDr" ist nicht definiert." kommt, kann ich mir das Nicht-Ausführen des "Else"-Zweiges eigentlich nicht erklären ...

Anyhow: Versuchen wir's mit einem (zugegeben nicht wirklich schönen) Sprung:
...
if defined NoInstDr goto :KeineDeinst

echo Drucker vorhanden, gehe zur Deinstallation
call :DEINSTALLATION 
goto :ENDE

:KeineDeinst
REM Wenn kein Printer zum deinstallieren vorhanden ist
call :WRITELOG "Status NoInstDr: %NoInstDr%  Kein weiterer Drucker zu deinstallieren."  
echo Drucker nicht vorhanden
goto :ENDE

...
Grüße
bastla