Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Teile des Druckernamens auslesen

Frage Entwicklung Batch & Shell

Mitglied: Flauschbobbel

Flauschbobbel (Level 1) - Jetzt verbinden

29.05.2008, aktualisiert 18.10.2012, 5524 Aufrufe, 12 Kommentare

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:

01.
  
02.
	set NoInstDr=True 
03.
 
04.
rem for /f "tokens=1-10 delims=:" %%x in ('wmic printer get DeviceID^|FINDSTR "%DruckerName%"') do ( 
05.
for /f  %%x in ('wmic printer get DeviceID^|FINDSTR "%DruckerName%"') do ( 
06.
		echo  Druckername aus DeviceID: %%x 
07.
		set "DruckerName=%%%x" 
08.
		echo %Druckername% 
09.
		REM echo  Druckername aus DeviceID: %%x|findstr /c:"%DruckerName%" >NUL && ( 
10.
		call :WRITELOG %LINE% 
11.
		call :WRITELOG "Pruefen, ob der Drucker existiert..." 
12.
		set "DruckerName=%DefineDruckerName%%%x" 
13.
		call :WRITELOG "Drucker: %DruckerName% existiert." 
14.
		call :WRITELOG "Entferne %Druckername%..." 
15.
		call :TOTAL_REMOVE_PRINTER 
16.
		set NoInstDr= 
17.
		set StopSrv= 
18.
19.
20.
 
21.
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
Mitglied: Biber
29.05.2008 um 18:42 Uhr
Moin flauschbobbel,

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

Grüße
Biber
Bitte warten ..
Mitglied: Flauschbobbel
29.05.2008 um 19:58 Uhr
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
Bitte warten ..
Mitglied: Biber
29.05.2008 um 20:30 Uhr
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]
Bitte warten ..
Mitglied: bastla
29.05.2008 um 20:39 Uhr
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:
01.
  
02.
	set NoInstDr=True 
03.
 
04.
for /f  %%x in ('wmic printer get DeviceID^|FINDSTR "%DruckerName%"') do call :ProcessPrinter "%%x" 
05.
goto :eof 
06.
 
07.
:ProcessPrinter 
08.
echo  Druckername aus DeviceID: %~1 
09.
set "DruckerName=%~1" 
10.
echo %DruckerName% 
11.
for /f "tokens=3 delims=_" %%a in ("%DruckerName%") do set "IP=%%a" 
12.
echo IP: %IP% 
13.
... 
14.
... 
15.
 
16.
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]
Bitte warten ..
Mitglied: Flauschbobbel
29.05.2008 um 20:54 Uhr
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
Bitte warten ..
Mitglied: bastla
29.05.2008, aktualisiert 18.10.2012
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
Bitte warten ..
Mitglied: Flauschbobbel
03.06.2008 um 17:51 Uhr
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:

01.
:CHECK_PRINTER 
02.
::  	Pruefen, ob der Drucker installiert ist. 
03.
:: 	Schalter-Variable: NoInstDr  
04.
	set NoInstDr=True 
05.
 
06.
for /f  %%x in ('wmic printer get DeviceID^|FINDSTR "%DruckerName%"') do call :ProcessPrinter "%%x"  
07.
 
08.
If defined NoInstDr ( 
09.
	REM Wenn kein Printer zum deinstallieren vorhanden ist 
10.
	call :WRITELOG "Status NoInstDr: %NoInstDr%  Kein weiterer Drucker zu deinstallieren." 
11.
	echo Drucker nicht vorhanden 
12.
) else (  
13.
	echo Drucker vorhanden, gehe zur Deinstallation			 
14.
 	call :DEINSTALLATION 
15.
16.
	goto :ENDE 
17.
 
18.
 
19.
:DEINSTALLATION 
20.
	call :DEINSTALL_DRIVER 
21.
	call :STOP_START_SPOOLER 
22.
	call :DEL_REG_KEYS 
23.
	call :DEL_DIR_FILES 
24.
	goto :eof 
25.
 
26.
 
27.
:ProcessPrinter  
28.
	set "DruckerName=%~1"  
29.
	for /f "tokens=3 delims=_" %%a in ("%DruckerName%") do set "IPPortName=IP_%%a"  
30.
	call :WRITELOG "Pruefen, ob der Drucker existiert..." 
31.
	call :WRITELOG "Drucker: %DruckerName% existiert." 
32.
	call :DELETE_PRINTER 
33.
	set NoInstDr=  
34.
	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
Bitte warten ..
Mitglied: bastla
03.06.2008 um 19:39 Uhr
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:
01.
set "NoInstDr="
Grüße
bastla
Bitte warten ..
Mitglied: Flauschbobbel
03.06.2008 um 20:33 Uhr
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
Bitte warten ..
Mitglied: bastla
03.06.2008 um 21:03 Uhr
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
01.
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
Bitte warten ..
Mitglied: Flauschbobbel
03.06.2008 um 22:11 Uhr
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
Bitte warten ..
Mitglied: bastla
03.06.2008 um 22:24 Uhr
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:
01.
... 
02.
if defined NoInstDr goto :KeineDeinst 
03.
 
04.
echo Drucker vorhanden, gehe zur Deinstallation 
05.
call :DEINSTALLATION  
06.
goto :ENDE 
07.
 
08.
:KeineDeinst 
09.
REM Wenn kein Printer zum deinstallieren vorhanden ist 
10.
call :WRITELOG "Status NoInstDr: %NoInstDr%  Kein weiterer Drucker zu deinstallieren." 
11.
echo Drucker nicht vorhanden 
12.
goto :ENDE 
13.
 
14.
...
Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

Batch & Shell
Eventlog Druckjobs mit VBS auslesen (2)

Frage von joni2000de zum Thema Batch & Shell ...

Batch & Shell
gelöst Appx aus Image auslesen und entfernen (9)

Frage von Markus2016 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...