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

Abfrage einer IP-Adresse und Vergleich mit IP-Adressen aus einer Excelliste

Frage Entwicklung Batch & Shell

Mitglied: Flauschbobbel

Flauschbobbel (Level 1) - Jetzt verbinden

21.04.2008, aktualisiert 30.09.2008, 9172 Aufrufe, 28 Kommentare

Hallo ihr Spezialisten der Scripte,

ich kämpfe schon wieder als Neuling mit den Batch-Commands. Irgendwie krieg ich es nicht auf die Reihe. Hier mein Problem:

In meiner Registry habe ich in einem bestimmten Bereich viele Informationen über den aktuell installierten Clients, von welchen SW-Verteilserver er bedient wurde usw. Unter anderem auch die IP-Adresse des Clients, die SubnetMask, Router usw.
Zusätzlich habe ich nun noch eine Excel-Liste, in der die zu installierenden Drucker-IP-Adressen hinterlegt sind.

Die Excel Liste (.csv) ist in etwa wie folgt aufgebaut:

Standort-ID;bla;bla;IP-Adr1;IP-Adr2;IP-Adr3;IP-Adr4;bla
4711;bla;bla; 10.23.11.31 ; 10.23.11.32;---;---;bla
1234;bla;bla; 10.41.12.34 ; 10.41.12.45;---;---;bla
0815;bla;bla; 160.54.194.23 ; ---;---;---;bla
4342;bla;bla; 160.55.20.28 ;160.55.20.29;160.55.20.31;---;bla


Ich möchte nun folgendens tun:

- Abfragen, welche IP-Adresse hat mein Client (alle Clients habe statische IP-Adr.)

- Wenn mein Client in einem identischen Subnetz ist, wie die zu installierenden Drucker aus der Excelliste, dann sollen die Drucker installiert werden. (Als Beispiel mein Client am Standort 1234 hätte die IP 10.41.12.5, dann sollen auf diesem Client alle Drucker mit der IP 10.41.12.34 und 10.41.12.45 installiert werden. Ein weiterer Client am gleichen Standort mit der IP 10.41.12.6 soll ebenfalls alle Drucker mit der IP 10.41.12.34 und 10.41.12.45 erhalten.)

- Wenn mein Client NICHT in einem identischen Subnetz ist, wie die zu installierenden Drucker aus der Excelliste, dann installiere die Drucker nicht und beende das Script.

D.h. der Client muss meine komplette Liste (mit ca 900 Zeilen) durchgehen und jede Zeile Überprüfen, ob in dieser Zeile ein oder mehere Drucker-IP-Adressen stehen, die auf dem Client zu installieren sind.
In jeder Zeile dieser Excelliste können bis zu 4 IP-Adressen von zu installierenden Druckern stehen.
Das Script soll mittels SW-Verteilung (ManageSoft) auf alle Clients verteilt werden und auf allen Clients laufen.
Zusätzlich muss ich noch sicherstellen, dass, wenn das Script mehrmals verteilt wird zunächst prüft, ob auf diesem Client bereits der Drucker installiert wurde. Hier dachte ich daran, den installierten Standard TCP/IP-Port in der Registry abzufragen. Wenn der schon existiert, dann ist das Script gelaufen und kann sich beenden. Seht Ihr das auch so?

Das Installieren der Printer funktioniert soweit gut, ich kämpfe mit der obigen Abfrage und habe keinen richtigen Ansatz. Ich muss doch vermutlich auch noch auf Basis der Subnet-Mask errechnen in welchem Subnetz die Clients/Printer sind, oder? Es gibt ja noch die Netzmaske 255.255.255.128, usw.

Ich hoffe ihr habe eine Tip für mich?

Herzlichen Dank schon mal im Voraus!
Flauschbobbel
28 Antworten
Mitglied: bastla
21.04.2008 um 21:13 Uhr
Hallo Flauschbobbel!

Für erste Tests unter den einfachsten Voraussetzungen (nur eine IP-Adresse, Maske 255.255.255.0) etwa so:
01.
@echo off & setlocal 
02.
set "Liste=D:\Druckerliste.csv" 
03.
 
04.
::IP auslesen 
05.
for /f "tokens=2 delims=:" %%i in ('ipconfig^|findstr "IP-Ad"') do ( 
06.
	::IP zerlegen in %%a.%%b.%%c.%%d 
07.
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do ( 
08.
		::Drucker auslesen 
09.
		for /f "tokens=1-8 delims=;" %%m in ('findstr "%%a.%%b.%%c." "%Liste%"') do ( 
10.
			::Drucker installieren 
11.
			echo Installiere mit Daten: %%m %%n %%o %%p %%q %%r %%s %%t 
12.
13.
14.
)
Für jede Zeile, in welcher passende IP-Adressen enthalten sind, wird der Teil "::Drucker installieren" (hier wird sich vermutlich ein Unterprogrammaufruf mit "call" anbieten) ausgeführt - wenn keine entsprechende Zeile gefunden wurde, wird dieser Teil gar nicht erreicht ...

Grüße
bastla
Bitte warten ..
Mitglied: Flauschbobbel
22.04.2008 um 18:57 Uhr
Hallo bastla,

ich habe mal an Deinem Vorschlag rumgespielt. (siehe beigefügtes Script)

- Wie kann ich denn die Variablen %%m %%n %%o %%p in das Unterprogramm für die Weiterverarbeitung übergeben?
Ich möchte die Variable in ipadr in den Unterprogrammen weiterverarbeiten.
- Zusätzlich suche ich noch nach einer Abfrage, wenn eine oder mehrere Variablen "leer" sind (%%n %%o %%p), also nur die erste Variable %%m eine IP-Adresse aus der Liste enthält, dann soll das Script weitermachen

Wenn ich es so mache wie in dem Beispiel von mir, zeigt er mir nicht den Inhalt der Variablen an:

01.
@echo off 
02.
set "InputListe=D:\users\local\scripts\RO_TEST.csv" 
03.
 
04.
::IP auslesen 
05.
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do ( 
06.
                ::IP zerlegen in %%a.%%b.%%c.%%d 
07.
                for /f "tokens=1-4 delims=. " %%a in ("%%i") do ( 
08.
 		::drucker auslesen 
09.
 		for /f "tokens=10-14 delims=;" %%m in ('findstr "%%a.%%b.%%c." "%InputListe%"') do ( 
10.
 			:: Drucker installieren 
11.
 			echo Installiere mit Daten %%m %%n %%o %%p 
12.
 			call :DruckerInstall 
13.
14.
15.
16.
 
17.
goto ende 
18.
 
19.
:DruckerInstall 
20.
echo Unterprogramm: Installiere mit Daten %%m %%n %%o %%p %%q %%r %%s %%t 
21.
:: Drucker installieren 
22.
set ipadr1=%%m 
23.
echo IP1:%ipadr1% 
24.
echo %%m 
25.
set "ipadr2=%%n" 
26.
echo IP2:%ipadr2% 
27.
echo %%n 
28.
set "ipadr3=%%o" 
29.
echo IP3:%ipadr3% 
30.
echo %%o 
31.
set "ipadr4=%%p" 
32.
echo IP4:%ipadr4% 
33.
echo %%p 
34.
echo Installiere mit Daten %%m %%n %%o %%p 
35.
echo schluss unterprogramm 
36.
goto :eof 
37.
 
38.
goto irgendwohin 
39.
echo test 
40.
pause 
41.
 
42.
:irgendwohin 
43.
echo. 
44.
:ende 
45.
echo totales ende 
46.
 
47.
set ipadr1= 
48.
set ipadr2= 
49.
set ipadr3= 
50.
set ipadr4=

BTW, hast Du noch einen Tipp am Rande?:
Wie ist es möglich den Befehl während der Ausführung im Batch nicht zu sehen?
Der aufgeführte Befehl "REG QUERY..." wird trotz >>NUL angezeigt.

01.
@echo off 
02.
:: Beispiel 
03.
set IPPortName=IP_192.168.1.255 
04.
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName% >>NUL 
05.
echo %errorlevel%
Danke und viele Grüße,
Flauschbobbel
Bitte warten ..
Mitglied: bastla
22.04.2008 um 20:39 Uhr
Hallo Flauschbobbel!

Falls es keinen besonderen Grund gibt, die 4 möglichen IP-Adressen getrennt zu speichern, bietet sich eine weitere Schleife an, in welcher jeweils eine der übergebenen Adressen verarbeitet wird:
01.
@echo off 
02.
set "InputListe=D:\users\local\scripts\RO_TEST.csv" 
03.
 
04.
::IP auslesen 
05.
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do ( 
06.
	::IP zerlegen in %%a.%%b.%%c.%%d 
07.
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do ( 
08.
		::drucker auslesen 
09.
		for /f "tokens=10-14 delims=;" %%m in ('findstr "%%a.%%b.%%c." "%InputListe%"') do ( 
10.
			:: Drucker installieren 
11.
			echo Installiere mit Daten %%m %%n %%o %%p 
12.
			call :DruckerInstall "%%m %%n %%o %%p" 
13.
14.
15.
16.
 
17.
goto ende 
18.
 
19.
:DruckerInstall 
20.
echo Unterprogramm: Installiere mit Daten %~1 
21.
:: so viele Drucker installieren, wie Adressen vorhanden 
22.
for %%i in (%~1) do ( 
23.
	echo Installiere IP: %%i 
24.
25.
echo schluss unterprogramm 
26.
goto :eof 
27.
 
28.
:ende 
29.
echo totales ende
Um dennoch allen %ipadrX% vorweg Werte zuzuweisen, müsste die "call"-Zeile ohne Anführungszeichen geschrieben werden und das Unterprogramm etwa so beginnen:
01.
if "%1" neq "" set ipadr1=%1 
02.
if "%2" neq "" set ipadr2=%2 
03.
...
Im weiteren Verlauf müsstest Du dann aber nochmals vor der Verwendung einer Variablen prüfen, ob ihr ein Wert zugewiesen wurde (wobei das für %ipadr1% eigentlich immer gelten sollte):
01.
if defined ipadr1 echo Installation mit IP: %ipadr1%
Zu Deinem Randproblem: Es sollte schon genügen, nach dem letzten %-Zeichen der Zeile das schließende Anführungszeichen zu setzen ...

Grüße
bastla
Bitte warten ..
Mitglied: Flauschbobbel
22.04.2008 um 21:05 Uhr
Hallo bastla,

es spricht nichts gegen Deinen Vorschlag eine weitere Schleife einzubauen, in welcher jeweils eine der übergebenen Adressen verarbeitet wird. Ich werde das mal so versuchen.

Zu meinem "Randproblem" habe ich noch eine Frage:
Ich habe die Anführungszeichen gesetzt, sorry hatte ich wohl übersehen, aber:
Wenn der RegistryKey NICHT vorhanden ist, dann wird die Befehlszeile "REG QUERY.... findstr /i "%IPPortName%" >>NUL " NICHT am Bildschirm angezeigt.
Ist der RegistryKey vorhanden, wird die Befehlszeile angezeigt.
Ich möchte aber, das die Befehlszeile in beiden Fällen nicht angezeigt wird.
Hast Du hierzu noch eine Idee?

Grüße,
Flauschbobbel
Bitte warten ..
Mitglied: bastla
22.04.2008 um 21:16 Uhr
Hallo Flauschbobbel!

Wenn der RegistryKey NICHT vorhanden ist, dann wird die Befehlszeile ... NICHT am Bildschirm angezeigt.
Es kann gar nichts angezeigt werden, da ja "findstr" keine Ausgabe liefern kann, wenn es keine Zeile mit dem gesuchten Inhalt gibt, allerdings ...

Ist der RegistryKey vorhanden, wird die Befehlszeile angezeigt.
... kann ich das Problem (auch mit anderen Keys getestet) mit hinzugefügtem Anführungszeichen - die Zeile sieht dann so aus:
01.
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%" >>NUL
nicht nachvollziehen ...

Grüße
bastla
Bitte warten ..
Mitglied: Flauschbobbel
22.04.2008 um 21:27 Uhr
Hallo bastla,

Info zu meinem Randproblem:
Ich kann es nicht erklären. Aber obwohl meine Zeile identisch mit Deiner war, habe ich Deine Befehlszeile mittels copy/paste in mein script übernommen. Ergebnis: Es funktioniert!
Danke!

An Deinem anderen Vorschlag arbeite ich noch. Ich melde mich und gebe Feedback.

Grüße,
Flauschbobbel
Bitte warten ..
Mitglied: Flauschbobbel
23.04.2008 um 20:07 Uhr
Hallo bastla,

wie kann ich in beigefügten Beispiel die Info von %~1 der Variable ipadr übergeben?
Bei den "echo Installiere IP %%i" wird die IP-Adresse noch einwandfrei angezeigt.
Ich möchte aber den Wert der Variable %ipadr% übergeben, siehe Beispiel.
Das funktioniert bei mir irgendwie nich korrekt. Die Variable ist zunächst leer.(sieh meinen ersten "echo %ipadr%" -Befehl)
Im weiteren Verlauf des Scripts, also z.B. im Unterprogramm ist sie aber richtig gesetzt.
Kannst Du mir das erklären?

Zusätzlich möchte ich, dass zunächst alle IP-Adressen der Drucker (max 4) in der entsprechenden Zeile geprüft werden, ob
die IP-Adresse bzw. der TCP/IP-Port in der Registry schon existiert, dass sich mein Script dann
sofort beendet (weil ich dann annehmen muss, dass das Script schon mal gelaufen ist und die Ports in der Registry angelegt hat).
Wenn ggf eine IP-Adresse nicht vorhanden ist, dann soll sie natürlich installiert werden.
Kannst Du mir hier einen Ansatz geben? Mein Beispiel funktioniert noch nicht richtig, denn selbst wenn der IP-Port vorhanden ist, versucht
mein Script trotzdem immer noch die Installation. Wie kann ich das realisieren?

Danke und viele Grüße,
Flauschbobbel

01.
@echo off 
02.
 
03.
set "InputListe=D:\users\local\scripts\RO_TEST.csv" 
04.
 
05.
::IP auslesen 
06.
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do ( 
07.
	::IP zerlegen in %%a.%%b.%%c.%%d 
08.
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do ( 
09.
		::Drucker auslesen 
10.
		for /f "tokens=10-14 delims=;" %%m in ('findstr "%%a.%%b.%%c." "%InputListe%"') do ( 
11.
			:: Drucker installieren 
12.
			echo Installiere mit Daten %%m %%n %%o %%p >>NUL 
13.
			call :ProcessLine "%%m %%n %%o %%p" 
14.
15.
16.
17.
 
18.
goto ende 
19.
 
20.
:ProcessLine 
21.
echo Unterprogramm: Installiere mit Daten %~1 
22.
:: so viele Drucker installieren, wie Adressen vorhanden 
23.
for %%i in (%~1) do ( 
24.
	echo Installiere IP %%i 
25.
 
26.
	set ipadr= 
27.
	set IPPortName= 
28.
 
29.
	set "ipadr=%%i"  
30.
	set "IPPortName=IP_%%i" 
31.
 
32.
:: BEI DIESEM ECHO IST DIE VARIABLE LEER 
33.
	echo %ipadr% 
34.
	echo %IPPortName% 
35.
 
36.
	call :Check_IP 
37.
	call :Installiere 
38.
39.
echo schluss unterprogramm 
40.
goto :eof 
41.
 
42.
goto ende 
43.
 
44.
:Check_IP 
45.
	echo check IP... 
46.
:: BEI DIESEM ECHO SIND DIE VARIABLEN RICHTIG GESETZT. Warum?? 
47.
	echo %ipadr% 
48.
	echo %IPPortName% 
49.
 
50.
	REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%" >>NUL 
51.
	if %errorlevel%==0 ( 
52.
		echo %errorlevel% 
53.
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% bereits eingetragen 	 
54.
	 	echo %date% %time% - %LINE%							 
55.
 		goto :eof 
56.
	) else ( 
57.
	 	echo %errorlevel% 
58.
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden  
59.
60.
 
61.
	echo. 										 
62.
	goto :eof 
63.
 
64.
 
65.
:Installiere 
66.
	echo installiere... 
67.
:: BEI DIESEM ECHO SIND DIE VARIABLEN RICHTIG GESETZT. Warum?? 
68.
	echo %ipadr% 
69.
	echo %IPPortName% 
70.
	goto :eof 
71.
 
72.
:ende 
73.
echo totales ende 
74.
	set ipadr= 
75.
	set IPPortName= 
76.
 
Bitte warten ..
Mitglied: bastla
23.04.2008 um 21:54 Uhr
Hallo Flauschbobbel!

Ich möchte aber den Wert der Variable %ipadr% übergeben, siehe Beispiel.
Das tust Du ja auch - es kann nur innerhalb der Schleife ohne "verzögerte Variablenauflösung" / "delayedexpansion" der neue Wert (noch) nicht verwendet werden - aber Du hast ja, wenn tatsächlich der Bedarf besteht, innerhalb der Schleife ohnehin mit %%i die IP-Adresse zur Verfügung.
Zur "delayedexpansion": Bei Schleifen wird der Wert von Variablen grundsätzlich nur zu Beginn ermittelt, sodass eine Änderung des Wertes einer Variablen (inkludiert das Zuweisen eines Wertes zu einer neuen Variablen wie in Deinem Beispiel) nicht "bemerkt" wird.

Es gibt zwar die Möglichkeit, mit "setlocal enabledelayedexpansion" zu erzwingen, dass jede Variable auch innerhalb der Schleife nicht bereits am Anfang, sondern "verzögert" aufgelöst wird (und damit tatsächlich den aktuellen Wert liefert), allerdings hat diese Funktionalität eine Nebenwirkung: Da Variablen in diesem Fall nicht mehr in der Form %Variable%, sondern als !Variable! zu schreiben sind, wird das "!" zum Sonderzeichen und daher innerhalb von Texten nicht mehr als "gewöhnliches" Zeichen interpretiert und verschwindet ganz einfach. Beispiel:
01.
@echo off & setlocal enabledelayedexpansion 
02.
for %%i in (Ohne Rufzeichen! ausgegeben.) do ( 
03.
        set "Text=%%i" 
04.
        echo !Text! 
05.
)
Selbst wenn Du ziemlich sicher sein solltest, dass in Deinem Batch daraus kein Problem entstünde, brauchst Du die "delayedexpansion" eigentlich nicht (siehe oben).
Im weiteren Verlauf des Scripts, also z.B. im Unterprogramm ist sie aber richtig gesetzt.
Kannst Du mir das erklären?
Beim Aufruf eines Unterprogrammes wird eine neue CMD-Instanz gestartet, und hier ist dann der neue Variablenwert bereits "bekannt".

Mein Beispiel funktioniert noch nicht richtig, denn selbst wenn der IP-Port vorhanden ist, versucht mein Script trotzdem immer noch die Installation.
Du prüfst zwar im Unterprogramm "Check_IP", gibst aber das Ergebnis nicht an das Hauptprogramm zurück, sodass ":Installiere" auf jeden Fall ausgeführt wird. Abhilfe kann hier eine "Schalter"-Variable schaffen - diese wird zunächst gesetzt, und, wenn im Unterprogramm die IP gefunden wird, gelöscht. Nach der Rückkehr ins Hauptprogramm ist dann am Zustand dieser Variablen ("defined" oder "not defined") das Ergebnis der Überprüfung abzulesen:
01.
set "Inst=True" 
02.
call :Check_IP 
03.
if defined Inst call :Installiere 
04.
... 
05.
 
06.
:Check_IP 
07.
... 
08.
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%">NUL && set Inst= 
09.
... 
10.
goto :eof


Etwas reduziert könnte der Batch dann bis hierher so aussehen:
01.
@echo off & setlocal 
02.
set "InputListe=D:\users\local\scripts\RO_TEST.csv" 
03.
 
04.
::IP auslesen 
05.
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do ( 
06.
	::IP zerlegen in %%a.%%b.%%c.%%d 
07.
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do ( 
08.
		::Drucker auslesen 
09.
		for /f "tokens=10-14 delims=;" %%m in ('findstr "%%a.%%b.%%c." "%InputListe%"') do ( 
10.
			:: Drucker installieren 
11.
			echo Installiere mit Daten %%m %%n %%o %%p >>NUL 
12.
			call :ProcessLine "%%m %%n %%o %%p" 
13.
14.
15.
16.
 
17.
goto :ende 
18.
 
19.
:ProcessLine 
20.
echo Unterprogramm: Installiere mit Daten %~1 
21.
:: so viele Drucker installieren, wie Adressen vorhanden 
22.
for %%i in (%~1) do ( 
23.
	echo Bearbeite IP: %%i 
24.
 
25.
	set "ipadr=%%i"  
26.
	set "IPPortName=IP_%%i" 
27.
	::Schalter setzen 
28.
	set "Inst=True" 
29.
	 
30.
	call :Check_IP 
31.
	::nur bei noch gesetztem Schalter installieren 
32.
	if defined Inst call :Installiere 
33.
34.
echo schluss unterprogramm 
35.
goto :eof 
36.
 
37.
:Check_IP 
38.
echo check IP... 
39.
 
40.
::Falls die IP in der Registry gefunden wird, "Inst"-Schalter loeschen 
41.
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%">NUL && set Inst= 
42.
if not defined Inst ( 
43.
	echo %date% %time% - Standard TCP/IP-Port %IPPortName% bereits eingetragen 	 
44.
 	echo %date% %time% - %LINE%							 
45.
) else ( 
46.
	echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden  
47.
48.
echo\ 
49.
goto :eof 
50.
 
51.
:Installiere 
52.
echo installiere... 
53.
 
54.
echo %ipadr% 
55.
echo %IPPortName% 
56.
 
57.
goto :eof 
58.
 
59.
:ende 
60.
echo totales ende
Grüße
bastla
Bitte warten ..
Mitglied: Flauschbobbel
24.04.2008 um 16:21 Uhr
Hallo bastla,

ich habe bei Deinem Vorschlag noch ein Problem:
Wenn in meiner csv-Datei die IP-Adressen wie folgt eingetragen sind (sollte zwar nicht vorkommen, aber ich möchte das als Fehler abfangen),

... ;192.168.1.225;193.168.1.226;193.168.1.255;; ...
... ;10.168.1.225;10.168.1.226;192.168.1.255;; ...

dann werden trotzdem alle 3 IP-Adressen installiert, obwohl der Client die IP-Adresse 192.168.1.30 hat.
Ich hatte es so verstanden, dass wenn der Client die IP 192.168.1.xxx hat, auch nur alle Printer mit der 192.168.1.xxx
installiert werden. Dann dürften nach meinem Verständnis die Drucker mit der IP 193.xxx.xxx.xxx aus der Liste nicht installiert werden.

Daran schliesst sich mein nächstes Problem an:
In der Liste können Einträge wie z.B.

... ;192.168.1.225;beantragt;;; ...

vorkommen. Dann legt das Script einen TCP/IP-Port in der Registry mit "IP_beantragt" an
und dementsprechend einen Printer mit dem Namen beantragt an.

Hast Du noch einen Tip zu folgender Idee vob mir:
Wenn der IP-Port in der Registry nicht (oder nicht mehr) existiert, aber der Drucker unter "Drucker und Faxgeräte"
noch vorhanden ist, dann sollte der IP-Port installiert werden. Es könnte sein, dass die Installation ursprünglich sauber
gelaufen ist, aber irgendjemand den IP-Port in der Registry gelöscht hat.
Wie kann ich das bei der Abfrage realisieren?
Wenn der IP-Port existiert und der Printer installiert ist => alles OK, weiter zum nächsten
Wenn der IP-Port existiert und der Printer nicht istalliert ist => nur Printer installieren
Wenn der IP-Port nicht existiert und der Printer installiert ist => nur IP-Port installieren/eintragen in der Registry

Kannst Du mir noch einen Tip geben für was "echo\" steht? Was bedeutet der "\"?

Danke und viele Grüße,
Flauschbobbel


01.
 
02.
@echo off & setlocal 
03.
 
04.
set "InputListe=D:\users\local\scripts\RO_TEST.csv" 
05.
 
06.
::IP auslesen 
07.
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do ( 
08.
	::IP zerlegen in %%a.%%b.%%c.%%d 
09.
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do ( 
10.
		::Drucker auslesen 
11.
		for /f "tokens=10-14 delims=;" %%m in ('findstr "%%a.%%b.%%c." "%InputListe%"') do ( 
12.
			:: Drucker installieren 
13.
			echo Installiere mit Daten %%m %%n %%o %%p >>NUL 
14.
			call :ProcessLine "%%m %%n %%o %%p" 
15.
16.
17.
18.
 
19.
goto ende 
20.
 
21.
:ProcessLine 
22.
echo Unterprogramm: Installiere mit Daten %~1 
23.
:: so viele Drucker installieren, wie Adressen vorhanden 
24.
for %%i in (%~1) do ( 
25.
	echo Bearbeite IP %%i 
26.
 
27.
	set "ipadr=%%i"  
28.
	set "IPPortName=IP_%%i" 
29.
	::Schalter setzen 
30.
	set "Inst=True" 
31.
 
32.
	call :Check_IP 
33.
	::nur bei noch gesetztem Schalter installieren 
34.
	if defined Inst call :Installiere 
35.
36.
echo schluss unterprogramm 
37.
goto :eof 
38.
 
39.
:Check_IP 
40.
	echo check IP... 
41.
 
42.
:: Falls die IP in der Registry gefunden wird, "Inst"-Schalter loeschen 
43.
	REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%" >>NUL && set Inst= 
44.
 
45.
	if not defined Inst ( 
46.
		echo %errorlevel% 
47.
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% bereits eingetragen 	 
48.
	 	echo %date% %time% - %LINE%							 
49.
 		goto :eof 
50.
	) else ( 
51.
	 	echo %errorlevel% 
52.
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden  
53.
54.
 
55.
	echo\ 										 
56.
	goto :eof 
57.
 
58.
:Installiere 
59.
echo installiere... 
60.
	echo %ipadr% 
61.
	echo %IPPortName% 
62.
	goto :eof 
63.
 
64.
:ende
Bitte warten ..
Mitglied: Flauschbobbel
27.04.2008 um 18:48 Uhr
Hallo Zusammen,

hat jemand eine Idee die mir weiterhelfen könnte?

Danke schon mal im Voraus.
Grüße,
Flauschbobbel
Bitte warten ..
Mitglied: Biber
27.04.2008 um 19:49 Uhr
Moin flauschbobbel,

zu ein oder zwei Teilproblemen hätte ich Tipps.

Die Hauptprobleme mit der "gültigen" IP-Adresse solltest Du so abstellen können:
ÄNDERE: ...'findstr "%%a.%%b.%%c." ...
SETZE: ...'findstr /C:"%%a.%%b.%%c."

Zitat aus "Findstr /?" :
/C:Zeichenfolge Sucht nach Zeichenfolge buchstabengetreu.
Momentan wird offensichtlich nach "%%a" und [beliebigesZeichen] und %%b und [beliebigesZeichen] und %%c und [beliebigesZeichen]" gesucht.
Trifft ja auch manchmal...

Der "Echo\"-Befehl gibt eine leere Zeile aus.
Genauer gesagt würde ein "Echo" ohne Parameter ja nur eine Statusmeldung "ECHO ist an"/"ECHO ist aus". liefern - ebenso ein "Echo [Leerzeichen]".
Umgehen kann man/frau das seit knapp 100 Jahren undokumentiert, aber verlässlich seit DOS 2.11,
indem direkt nach dem Wort "ECHO" eines der Zeichen . \ / ? : , ; [ ] eingeben wird.

Grüße
Biber
Bitte warten ..
Mitglied: bastla
27.04.2008 um 22:24 Uhr
Hallo Flauschbobbel!

Vorweg: Sorry - hatte leider Deinen Beitrag vom Donnerstag nicht mitbekommen ...

Dass zu viele Ports installiert werden, liegt daran, dass jede Zeile nur daraufhin untersucht wird, ob mindestens eine der enthaltenen IP-Adressen im Netz des Rechners liegt - diese Abfrage muss dann aber auch noch für jede einzelne Adresse durchgeführt werden (ist im Entwurf unten jetzt berücksichtigt).

Das Thema "Drucker da, Port aber nicht" muss ich leider etwas vertagen ...

Wie Biber schon angemerkt hat, kann anstelle von "echo." mit gleichem Erfolg auch "echo\" geschrieben werden - zu letzterer Schreibweise bin ich übergegangen, nachdem ich von Problemen mit der "."-Schreibweise gelesen hatte ...
Neuer Entwurf:
01.
@echo off & setlocal 
02.
set "InputListe=D:\users\local\scripts\RO_TEST.csv" 
03.
 
04.
::IP auslesen 
05.
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do ( 
06.
	::IP zerlegen in %%a.%%b.%%c.%%d 
07.
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do ( 
08.
		::Drucker auslesen 
09.
		for /f "tokens=10-14 delims=;" %%m in ('findstr /C:"%%a.%%b.%%c." "%InputListe%"') do ( 
10.
			:: Drucker installieren 
11.
			echo Installiere mit Daten %%m %%n %%o %%p >>NUL 
12.
			::Zweiter Parameter = Netzanteil der IP-Adresse des aktuellen Rechners  
13.
			call :ProcessLine "%%m %%n %%o %%p" "%%a.%%b.%%c." 
14.
15.
16.
17.
 
18.
goto :ende 
19.
 
20.
:ProcessLine 
21.
echo Unterprogramm: Installiere mit Daten %~1 
22.
:: so viele Drucker installieren, wie Adressen vorhanden 
23.
for %%i in (%~1) do ( 
24.
	echo Bearbeite IP %%i 
25.
	::Adresse in IP-Range? 
26.
	echo %%i|findstr /C:%2 >nul && ( 
27.
		set "ipadr=%%i"  
28.
		set "IPPortName=IP_%%i" 
29.
		::Schalter setzen 
30.
		set "Inst=True" 
31.
 
32.
		call :Check_IP 
33.
		::nur bei noch gesetztem Schalter installieren 
34.
		if defined Inst call :Installiere 
35.
36.
37.
echo schluss unterprogramm 
38.
goto :eof 
39.
 
40.
:Check_IP 
41.
	echo check IP... 
42.
 
43.
:: Falls die IP in der Registry gefunden wird, "Inst"-Schalter loeschen 
44.
	REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%" >NUL && set Inst= 
45.
 
46.
	if not defined Inst ( 
47.
		echo %errorlevel% 
48.
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% bereits eingetragen 	 
49.
	 	echo %date% %time% - %LINE%							 
50.
) else ( 
51.
	 	echo %errorlevel% 
52.
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden  
53.
54.
 
55.
	echo\ 										 
56.
	goto :eof 
57.
 
58.
:Installiere 
59.
echo installiere... 
60.
echo %ipadr% 
61.
echo %IPPortName% 
62.
goto :eof 
63.
 
64.
:ende
Grüße
bastla
Bitte warten ..
Mitglied: Flauschbobbel
28.04.2008 um 20:00 Uhr
Hallo bastla, hallo biber,

vielen Dank zunächst für Eure Unterstützung. bastla, ich habe Deinen Vorschlag soweit umgesetzt und bin recht zufrieden mit dem bisherigen Ergebnis. Nun hat sich heute aber ein neues Problem hierbei ergeben. Ich habe unterschiedliche Subnet-Masks
in meinen verschiedenen Lokationen. Bsp.:

Lokation A: Subnet Mask 255.255.255.0
Lokation B: Subnet Mask 255.255.255.128
In meiner Excelliste (.csv) werde ich eine entsprechende Spalte anlegen, in der die Subnetmask der jeweiligen Lokation hervorgeht. Bsp:

... ;SubnetMask;IP1;IP2;IP3;IP4;; ...
... ;255.255.255.0;192.168.1.225;193.168.1.226;193.168.1.255;; ...
... ;255.255.255.128;10.168.1.225;10.168.1.226;192.168.1.255;; ...

Aber, wie muss ich denn die Abfrage gestalten, wenn ich auch hier nach der entsprechenden Subnet-Masks abfragen muss?
(Muss ich das denn überhaupt, denn ich bin ja mit meinem im gleichen Subnetz, oder?)
Kann man die bisherige Abfrage miteinander verbinden oder muss man getrennt danach fragen?


01.
@echo off & setlocal 
02.
set "InputListe=D:\users\local\scripts\RO_TEST.csv" 
03.
 
04.
::IP auslesen 
05.
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do ( 
06.
	::IP zerlegen in %%a.%%b.%%c.%%d 
07.
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do ( 
08.
		::Drucker auslesen 
09.
		for /f "tokens=10-14 delims=;" %%m in ('findstr /C:"%%a.%%b.%%c." "%InputListe%"') do ( 
10.
			:: Drucker installieren 
11.
			echo Installiere mit Daten %%m %%n %%o %%p >>NUL 
12.
			::Zweiter Parameter = Netzanteil der IP-Adresse des aktuellen Rechners  
13.
			call :ProcessLine "%%m %%n %%o %%p" "%%a.%%b.%%c." 
14.
15.
16.
17.
 
18.
goto :ende 
19.
 
20.
:ProcessLine 
21.
echo Unterprogramm: Installiere mit Daten %~1 
22.
:: so viele Drucker installieren, wie Adressen vorhanden 
23.
for %%i in (%~1) do ( 
24.
	echo Bearbeite IP %%i 
25.
	::Adresse in IP-Range? 
26.
	echo %%i|findstr /C:%2 >nul && ( 
27.
		set "ipadr=%%i"  
28.
		set "IPPortName=IP_%%i" 
29.
		::Schalter setzen 
30.
		set "Inst=True" 
31.
 
32.
		call :Check_IP 
33.
		::nur bei noch gesetztem Schalter installieren 
34.
		if defined Inst call :Installiere 
35.
36.
37.
echo schluss unterprogramm 
38.
goto :eof 
39.
 
40.
:Check_IP 
41.
	echo check IP... 
42.
 
43.
:: Falls die IP in der Registry gefunden wird, "Inst"-Schalter loeschen 
44.
	REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%" >NUL && set Inst= 
45.
 
46.
	if not defined Inst ( 
47.
		echo %errorlevel% 
48.
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% bereits eingetragen 	 
49.
	 	echo %date% %time% - %LINE%							 
50.
) else ( 
51.
	 	echo %errorlevel% 
52.
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden  
53.
54.
 
55.
	echo\ 										 
56.
	goto :eof 
57.
 
58.
:Installiere 
59.
echo installiere... 
60.
echo %ipadr% 
61.
echo %IPPortName% 
62.
goto :eof 
63.
 
64.
:ende 
65.
 

Hast Du zum Thema "Drucker da, Port aber nicht" zumindest eine grobe Idee?
Mein Gedanke war:

Wenn der IP-Port in der Registry nicht (oder nicht mehr) existiert, aber der Drucker unter "Drucker und Faxgeräte"
noch vorhanden ist, dann sollte der IP-Port installiert werden. Es könnte sein, dass die Installation ursprünglich sauber
gelaufen ist, aber irgendjemand den IP-Port in der Registry gelöscht hat.
Wie kann ich das bei der Abfrage realisieren?
Wenn der IP-Port existiert und der Printer installiert ist => alles OK, weiter zum nächsten
Wenn der IP-Port existiert und der Printer nicht istalliert ist => nur Printer installieren
Wenn der IP-Port nicht existiert und der Printer installiert ist => nur IP-Port installieren/eintragen in der Registry


Und zum guten Schluß habe ich noch ein "kosmetisches Problem" mit der Logfiles meines Scripts:
Wie Du im nachfolgenden Ausschnitt aus meinem Logfile siehst, habe ich nach den REG ADD-Befehlen (die ich mittes
einem echo-Befehl einfach nur im Logfile zur Dokumentation anzeigen will) und
der Meldung "Der Vorgang wurde erfolgreich ausgeführt." (die Meldung kommt ja vom System) jeweils eine Leerzeile.
Ebenso beim Befehl net stop Spooler. Lässt sich das beim Schreiben des Logfiles irgendwie umgehen?

01.
---- Ausschnitt aus dem Original-Logfile ----- 
02.
									 
03.
28.04.2008 11:10:15,00 - Standard TCP/IP-Port IP_192.168.1.244 in die Registry eintragen...  
04.
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" 							 
05.
 
06.
Der Vorgang wurde erfolgreich ausgeführt. 
07.
28.04.2008 11:10:15,04 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v Protocol /t REG_DWORD /d 00000001 	 
08.
 
09.
Der Vorgang wurde erfolgreich ausgeführt. 
10.
28.04.2008 11:10:15,09 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v Version /t REG_DWORD /d 00000001 	 
11.
 
12.
Der Vorgang wurde erfolgreich ausgeführt. 
13.
28.04.2008 11:10:15,14 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v HostName /t REG_SZ /d "" 		 
14.
 
15.
Der Vorgang wurde erfolgreich ausgeführt. 
16.
28.04.2008 11:10:15,18 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v IPAddress /t REG_SZ /d 192.168.1.244 	 
17.
 
18.
Der Vorgang wurde erfolgreich ausgeführt. 
19.
28.04.2008 11:10:15,25 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v HWAddress /t REG_SZ /d "" 		 
20.
 
21.
Der Vorgang wurde erfolgreich ausgeführt. 
22.
28.04.2008 11:10:15,29 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v PortNumber /t REG_DWORD /d 9100 	 
23.
 
24.
Der Vorgang wurde erfolgreich ausgeführt. 
25.
28.04.2008 11:10:15,34 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v "SNMP Community" /t REG_SZ /d "public"  
26.
 
27.
Der Vorgang wurde erfolgreich ausgeführt. 
28.
28.04.2008 11:10:15,39 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v "SNMP Enabled" /t REG_DWORD /d 00000001  
29.
 
30.
Der Vorgang wurde erfolgreich ausgeführt. 
31.
28.04.2008 11:10:15,45 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v "SNMP Index" /t REG_DWORD /d 00000001  
32.
 
33.
Der Vorgang wurde erfolgreich ausgeführt. 
34.
28.04.2008 11:10:15,50 - Druckerwarteschlage anhalten... 				 
35.
28.04.2008 11:10:15,50 - net stop spooler 							 
36.
 
37.
Druckwarteschlange wurde erfolgreich beendet. 
38.
 
39.
28.04.2008 11:10:15,62 - Druckerwarteschlage starten... 				 
40.
28.04.2008 11:10:15,64 - net start spooler 						 
41.
Druckwarteschlange wird gestartet. 
42.
Druckwarteschlange wurde erfolgreich gestartet. 
43.
 
44.
---- Ende Ausschnitt aus dem Original-Logfile -----


Hier das Skript zu obigem Output:

01.
---- Ausschnitt (der Upnterprogramme) aus dem Original-Skript -----  
02.
... 
03.
 
04.
:: ---------------------------------------------------------------------- 
05.
:CREATE_TCPIP_PORT 
06.
:: ---------------------------------------------------------------------- 
07.
 
08.
::  	Standard TCP/IP-Port in die Registry eintragen  
09.
 
10.
	echo %date% %time% - Standard TCP/IP-Port %IPPortName% in die Registry eintragen... >> %AddPrntLog% 
11.
	echo REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" 							>> %AddPrntLog% 
12.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" 								>> %AddPrntLog% 
13.
	echo %date% %time% - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v Protocol /t REG_DWORD /d 00000001 	>> %AddPrntLog% 
14.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v Protocol /t REG_DWORD /d 00000001 			>> %AddPrntLog% 
15.
	echo %date% %time% - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v Version /t REG_DWORD /d 00000001 	>> %AddPrntLog% 
16.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v Version /t REG_DWORD /d 00000001 			>> %AddPrntLog% 
17.
	echo %date% %time% - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v HostName /t REG_SZ /d "" 		>> %AddPrntLog% 
18.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v HostName /t REG_SZ /d "" 				>> %AddPrntLog% 
19.
	echo %date% %time% - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v IPAddress /t REG_SZ /d %ipadr% 	>> %AddPrntLog% 
20.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v IPAddress /t REG_SZ /d %ipadr% 				>> %AddPrntLog% 
21.
	echo %date% %time% - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v HWAddress /t REG_SZ /d "" 		>> %AddPrntLog% 
22.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v HWAddress /t REG_SZ /d "" 				>> %AddPrntLog% 
23.
	echo %date% %time% - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v PortNumber /t REG_DWORD /d 9100 	>> %AddPrntLog% 
24.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v PortNumber /t REG_DWORD /d 9100 			>> %AddPrntLog% 
25.
	echo %date% %time% - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v "SNMP Community" /t REG_SZ /d "public" >> %AddPrntLog% 
26.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v "SNMP Community" /t REG_SZ /d "public" 			>> %AddPrntLog% 
27.
	echo %date% %time% - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v "SNMP Enabled" /t REG_DWORD /d 00000001 >> %AddPrntLog% 
28.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v "SNMP Enabled" /t REG_DWORD /d 00000001 		>> %AddPrntLog% 
29.
	echo %date% %time% - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v "SNMP Index" /t REG_DWORD /d 00000001 >> %AddPrntLog% 
30.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v "SNMP Index" /t REG_DWORD /d 00000001 			>> %AddPrntLog% 
31.
	goto :eof 
32.
 
33.
:: ---------------------------------------------------------------------- 
34.
:STOP_START_SPOOLER 
35.
:: ---------------------------------------------------------------------- 
36.
 
37.
:: 	Druckerwarteschlange anhalten/starten 
38.
 
39.
	echo %date% %time% - Druckerwarteschlage anhalten... 				>> %AddPrntLog% 
40.
	echo %date% %time% - net stop spooler 						>> %AddPrntLog%	 
41.
	net stop spooler 								>> %AddPrntLog% 
42.
	if %errorlevel% == 2 echo Druckerwarteschlange bereits gestoppt 		>> %AddPrntLog% 
43.
	echo %date% %time% - Druckerwarteschlage starten... 				>> %AddPrntLog% 
44.
	echo %date% %time% - net start spooler 						>> %AddPrntLog% 
45.
	net start spooler 								>> %AddPrntLog% 
46.
	goto :eof 
47.
 
48.
... 
49.
---- Ende Ausschnitt aus dem Original-Skript -----


Ich hätte gerne die Ausgabe wie folgt:
01.
28.04.2008 11:10:15,00 - Standard TCP/IP-Port IP_192.168.1.244 in die Registry eintragen...  
02.
28.04.2008 11:10:15,00 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" 							 
03.
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt. 
04.
28.04.2008 11:10:15,04 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v Protocol /t REG_DWORD /d 00000001 	 
05.
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt. 
06.
28.04.2008 11:10:15,09 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v Version /t REG_DWORD /d 00000001 	 
07.
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt. 
08.
28.04.2008 11:10:15,14 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v HostName /t REG_SZ /d "" 		 
09.
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt. 
10.
28.04.2008 11:10:15,18 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v IPAddress /t REG_SZ /d 192.168.1.244 	 
11.
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt. 
12.
28.04.2008 11:10:15,25 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v HWAddress /t REG_SZ /d "" 		 
13.
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt. 
14.
28.04.2008 11:10:15,29 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v PortNumber /t REG_DWORD /d 9100 	 
15.
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt. 
16.
28.04.2008 11:10:15,34 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v "SNMP Community" /t REG_SZ /d "public"  
17.
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt. 
18.
28.04.2008 11:10:15,39 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v "SNMP Enabled" /t REG_DWORD /d 00000001  
19.
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt. 
20.
28.04.2008 11:10:15,45 - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" /v "SNMP Index" /t REG_DWORD /d 00000001  
21.
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt. 
22.
28.04.2008 11:10:15,50 - Druckerwarteschlage anhalten... 				 
23.
28.04.2008 11:10:15,50 - net stop spooler 							 
24.
28.04.2008 11:10:15,00 - Druckwarteschlange wurde erfolgreich beendet. 
25.
28.04.2008 11:10:15,62 - Druckerwarteschlage starten... 				 
26.
28.04.2008 11:10:15,64 - net start spooler 						 
27.
28.04.2008 11:10:15,00 - Druckwarteschlange wird gestartet. 
28.
28.04.2008 11:10:15,00 - Druckwarteschlange wurde erfolgreich gestartet.
Gibt es da vielleicht eine Möglichkeit?


Sorry, wenn ich noch ein Anliegen habe:
Ich möchte zuvor abfragen ob die 2 benötigten Unterverzeichnisse \DrvPS und \DrvPCL6 vorhanden sind.
Wenn sie vorhanden sind, dann soll irgendwas passieren, wenn eins von beiden oder beide fehlen, dann soll das Script beendet werden.
Aber so funktioniert es irgendwie nicht richtig. Kannst Du mir hier auch nochmals unter die Arme greifen?

01.
@echo off 
02.
	set scriptdir=%~dp0 
03.
::	Prüfen ob die notwendigen Installationsverzeichnisse vorhanden sind 
04.
if not exist %scriptdir%\DrvPS\ echo ERROR: Verzeichnis %scriptdir%\DrvPS\ nicht vorhanden! 
05.
if not exist %scriptdir%\DrvPCL6\ ( 
06.
	echo ERROR: Verzeichnis %scriptdir%\DrvPCL6\ nicht vorhanden! 
07.
	goto ende 
08.
09.
:IRGENDWAS 
10.
echo verzeichnisse sind da 
11.
pause 
12.
 
13.
:ENDE 
14.
echo schluss

Danke und viele Grüße,
Flauschbobbel
Bitte warten ..
Mitglied: bastla
28.04.2008 um 21:32 Uhr
Hallo Flauschbobbel!

Fangen wir mit der Kosmetik an: Um die von Dir gewünschte Ausgabe (annähernd) zu erreichen, musst Du selbst die erforderlichen Meldungen hinsichtlich des Erfolges (auf Basis des Errorlevels) erstellen (ggf den Errrolevel in einer anderen Variable zwischenspeichern):
01.
	echo %date% %time% - Standard TCP/IP-Port %IPPortName% in die Registry eintragen... >> %AddPrntLog% 
02.
	echo %date% %time% - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" >> %AddPrntLog% 
03.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" >nul 2>&1 
04.
	if %errorlevel%==0 ( 
05.
		echo %date% %time% - Der Vorgang wurde erfolgreich ausgeführt. 	>> %AddPrntLog% 
06.
	) else ( 
07.
		echo %date% %time% - Der Vorgang wurde mit Fehler %errorlevel% beendet. >> %AddPrntLog% 
08.
09.
 
10.
:: and so on ... 
11.
	 
12.
	echo %date% %time% - Druckwarteschlage anhalten... 				>> %AddPrntLog% 
13.
	echo %date% %time% - net stop spooler 						>> %AddPrntLog%	 
14.
	net stop spooler >nul 2>&1 
15.
	if %errorlevel%==0 echo %date% %time% - Druckwarteschlange wurde erfolgreich beendet. >> %AddPrntLog% 
16.
	if %errorlevel%==2 echo %date% %time% - Druckwarteschlange bereits gestoppt 		>> %AddPrntLog% 
17.
	echo %date% %time% - Druckwarteschlage starten... 				>> %AddPrntLog% 
18.
	echo %date% %time% - net start spooler 						>> %AddPrntLog% 
19.
	net start spooler >nul 2>&1 
20.
	if %errorlevel%==0 echo %date% %time% - Druckwarteschlange wurde erfolgreich gestartet. >> %AddPrntLog%
Das Prüfen der Unterverzeichnisse könnte etwa so aussehen:
01.
@echo off & setlocal 
02.
set "scriptdir=%~dp0" 
03.
::	Prüfen ob die notwendigen Installationsverzeichnisse vorhanden sind 
04.
set OK=True 
05.
if not exist "%scriptdir%\DrvPS\" ( 
06.
	echo ERROR: Verzeichnis %scriptdir%\DrvPS\ nicht vorhanden! 
07.
	set OK= 
08.
09.
if not exist "%scriptdir%\DrvPCL6\" ( 
10.
	echo ERROR: Verzeichnis %scriptdir%\DrvPCL6\ nicht vorhanden! 
11.
	set OK= 
12.
13.
if not defined OK goto :ende 
14.
 
15.
:IRGENDWAS 
16.
echo verzeichnisse sind da 
17.
pause 
18.
 
19.
:ENDE 
20.
echo schluss
Was den Rest anlangt, muss ich Dich noch vertrösten ...

Grüße
bastla
Bitte warten ..
Mitglied: bastla
28.04.2008 um 22:15 Uhr
... aber wenn Du durchwegs XP-Rechner hast, könntest Du zwischenzeitlich zB die Informationen aus
01.
wmic printer get DeviceID, DriverName
auf Verwertbarkeit prüfen.

Weitere abrufbare Eigenschaften findest Du über
01.
wmic printer list /?
Grüße
bastla
Bitte warten ..
Mitglied: bastla
29.04.2008 um 10:26 Uhr
Hallo Flauschbobbel!

Noch eine Frage zu den "Subnet Masks" - genügt es, wenn ich von einer Adressierung ab /24 (also erste 3 Stellen sind immer "255.255.255") ausgehe?

Grüße
bastla
Bitte warten ..
Mitglied: Flauschbobbel
29.04.2008 um 16:50 Uhr
Hallo bastla,

ja, ich denke es genügt wenn Du von einer Adressierung ab /24 (also erste 3 Stellen sind immer "255.255.255") ausgehst.
Ich habe die aktuelle Liste mit den einzelnen SubnetMask noch nicht. Kann man das ggf später noch anpassen?
Sorry, aber ich arbeite nur in einem Teilsegment und habe noch nicht den kompletten Überblick, da ich erst vor
kurzem im Unternehmen angefangen habe.

Ebenfalls sorry für meine verspätete Antwort, ich war auf einer geschäftlichen Veranstaltung und konnte erst eben meine Emails checken.

Danke für Deinen Tip. Habe mit wmic mal rumgespielt (siehe Abschnitt CHECK_PRINTER) und bin recht zufrieden,
bis auf ein kleines Problem:

Hier mein kleines Szenario (Habe als Beispiel nur eine Zeile aus meiner Excelliste herausgenommen):
IP-Ports in der Registry: IP_192.168.1.225, IP_192.168.1.226 und IP_192.168.1.255
Die Druckernamen setzen sich zusammen aus Drucker_Schalter_<ipadr>, in dem Beispiel also Drucker_Schalter_192.168.1.225,
Drucker_Schalter_192.168.1.226 und Drucker_Schalter_192.168.1.255

Ist kein Drucker und kein IP-Port vorhanden werden Drucker und IP-Port auf Basis meiner Excelliste (.csv) einwandfrei installiert.
Im Beispiel also
Drucker_Schalter_192.168.1.225 zum IP-Port IP_192.168.1.225
Drucker_Schalter_192.168.1.226 zum IP-Port IP_192.168.1.226
Drucker_Schalter_192.168.1.255 zum IP-Port IP_192.168.1.255

Ist der IP-Port (IP_192.168.1.225) vorhanden, aber z.B. der Drucker_Schalter_192.168.1.225 fehlt,
dann wird nach meinem Script zwar der fehlende Drucker Drucker_Schalter_192.168.1.225 nachinstalliert,
aber auch die Drucker_Schalter_192.168.1.226 und IP_192.168.1.255, jeweils mit (Kopie 1) als Name.

Unter Drucker und Faxgeräte sieht das dann so aus:
Drucker_Schalter_192.168.1.225 zum IP-Port IP_192.168.1.225
Drucker_Schalter_192.168.1.226 zum IP-Port IP_192.168.1.226
Drucker_Schalter_192.168.1.226 (Kopie 1) zum IP-Port IP_192.168.1.226
Drucker_Schalter_192.168.1.255 zum IP-Port IP_192.168.1.255
Drucker_Schalter_192.168.1.255 (Kopie 1) zum IP-Port IP_192.168.1.255

Das gleiche Spiel habe ich auch, wenn alle meine Drucker vorhanden sind (Drucker_Schalter_192.168.1.225,
Drucker_Schalter_192.168.1.226 und Drucker_Schalter_192.168.1.255) und ich lösche als Test in der Registry z.B. den IP-Port
IP_192.168.1.225.

Dann laüft das Script einwandfrei an, stellt fest es existiert der Drucker Drucker_Schalter_192.168.1.225, schaut nach,
existiert der IP-Port, stellt fest, der Port fehlt, insalliert den IP-Port aber auch alle danachfolgenden Drucker.
D.h. mein Ergebnis sieht wieder so aus:
Unter Drucker und Faxgeräte:
Drucker_Schalter_192.168.1.225 zum IP-Port IP_192.168.1.225
Drucker_Schalter_192.168.1.226 zum IP-Port IP_192.168.1.226
Drucker_Schalter_192.168.1.226 (Kopie 1) zum IP-Port IP_192.168.1.226
Drucker_Schalter_192.168.1.255 zum IP-Port IP_192.168.1.255
Drucker_Schalter_192.168.1.255 (Kopie 1) zum IP-Port IP_192.168.1.255

Ich finde im Moment mein Problem nicht. Kannst Du mir bitte helfen?
Ich habe das Script in gekürzter Form beigefügt. Die Unterprogramme CREATE_IP_PORT,
Start/Stop Spooler usw. laufen ja soweit, daher nur die gekürzte Fassung. Die Teile auf
die es bei der Abfrage ankommt habe ich komplett dringelassen.

Kann ich das Script Deiner Meinung nach noch optimieren/vereinfachen/besser strukturieren?

Grüße,
Flauschbobbel



01.
 
02.
@echo off & setlocal 
03.
 
04.
:: ====================================================================== 
05.
:: 
06.
:: C O N F I G	/  Modifikationen und Einstellungen 
07.
:: 
08.
:: ====================================================================== 
09.
 
10.
::	Script und Logfile 
11.
	set STitle=AddPrntr.cmd 
12.
	set LINE=---------------------------------------------------------------------- 
13.
	set scriptdir=%~dp0 
14.
	set AddPrntLog=%temp%\AddPrntr_%ComputerName%.log 
15.
	set AddPrntLogOld=%temp%\AddPrntr_%ComputerName%.old 
16.
 
17.
::	Schalter-Variable fuer Testprint 
18.
::	Ist diese mit dem Wert True gesetzt, wird nach erfolgreicher Installation  
19.
::	des Standard-TCP/IP-Ports und des Druckers eine Testseite gedruckt. 
20.
::	Nur für Testzwecke. 
21.
	set TstPrnt= 
22.
 
23.
 
24.
::	Druckerinstallation 
25.
	set "INFdir_PS=%scriptdir%DrvPS\" 
26.
	set "INFdir_PCL6=%scriptdir%DrvPCL6\" 
27.
	set "INFfile_PS=%INFdir_PS%ricsetup.inf" 
28.
	set "INFfile_PCL6=%INFdir_PCL6%OEMSETUP.INF" 
29.
	set ModellDruckerTreiber_PS="RICOH Aficio SP 4100N PS" 
30.
	set ModellDruckerTreiber_PCL6="RICOH Aficio SP 4110N PCL 6" 
31.
 
32.
::  	Hier ggf. die zu installierende Druckersprache (PS oder PCL6) auswählen. 
33.
::  	Als Standard wird PCL6 verwendet. 
34.
:: 
35.
	set INFfile=%INFfile_PCL6% 
36.
	set ModellDruckerTreiber=%ModellDruckerTreiber_PCL6% 
37.
 
38.
 
39.
:: 	Namenskonvention der Druckernamen 
40.
:: 	Drucker_Schalter_<IP-Adr>  
41.
::  
42.
	set DefineDruckerName=Drucker_Schalter_ 
43.
	set DefineDruckerNr=0 
44.
 
45.
 
46.
::	Excelliste (.csv) als Inputinformationen für dieses Installationsscript 
47.
:: 
48.
	set "InputListe=%scriptdir%RO_TEST.csv" 
49.
 
50.
  
51.
 
52.
:: ====================================================================== 
53.
:: 
54.
:: M A I N 
55.
:: 
56.
:: ====================================================================== 
57.
 
58.
::	Wenn bereits ein .LOG existiert, kopieren auf .OLD  
59.
	if exist %AddPrntLog% copy /Y %AddPrntLog% %AddPrntLogOld% >NUL 
60.
 
61.
::	Startline im Logfile 
62.
	echo %date% %time% - %LINE%							> %AddPrntLog% 
63.
	echo %date% %time% - Start %sTitle% on Node %ComputerName%			>> %AddPrntLog% 
64.
	echo %date% %time% - %LINE%							>> %AddPrntLog% 
65.
 
66.
 
67.
::	Prüfen, ob das Schreiben der Log-Datei erfolgreich war 
68.
	if not exist %AddPrntLog% goto fehler_logfile 
69.
 
70.
 
71.
::	Prüfen ob die notwendigen Installationsverzeichnisse/Dateien vorhanden sind 
72.
	set OK=True 
73.
	if not exist "%INFfile%" ( 
74.
		echo %date% %time% - ERROR: Datei %INFfile% nicht vorhanden!		>> %AddPrntLog% 
75.
		set OK= 
76.
77.
	if not exist "%InputListe%" ( 
78.
		echo %date% %time% - ERROR: Excel-Inputdatei %InputListe% nicht vorhanden! >> %AddPrntLog% 
79.
		set OK= 
80.
81.
	if not defined OK goto :FEHLER_SOURCEFILES 
82.
 
83.
 
84.
::	Info über die Lokation der Input-Dateien ins Logfile eintragen 
85.
	echo %date% %time% - Installationsource der INF-Datei: %INFfile% 		>> %AddPrntLog%	 
86.
	echo %date% %time% - Excel-Inputliste: %InputListe% 				>> %AddPrntLog% 
87.
 
88.
 
89.
::	IP-Adresse des Clients auslesen,  
90.
::  	IP-Adressen der zu installierenden Drucker aus Excelliste  
91.
::	auslesen und für Nutzung zusammensetzen 
92.
 
93.
::IP des Client auslesen 
94.
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do ( 
95.
	::IP des Clients zerlegen in %%a.%%b.%%c.%%d 
96.
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do ( 
97.
		::Drucker aus der Excelliste auslesen 
98.
		for /f "tokens=10-14 delims=;" %%m in ('findstr /c:"%%a.%%b.%%c." "%InputListe%"') do ( 
99.
			::Drucker installieren 
100.
			echo Installiere mit Daten %%m %%n %%o %%p >>NUL 
101.
			::Zweiter Parameter = Netzanteil der IP-Adresse des aktuellen Rechners 
102.
			call :PROCESSLINE "%%m %%n %%o %%p" "%%a.%%b.%%c" 
103.
104.
105.
106.
 
107.
	call :CLEANUP 
108.
	goto ENDE 
109.
 
110.
 
111.
:: ---------------------------------------------------------------------- 
112.
:: 
113.
::     **********     Unterprogramme Processline    ********** 
114.
:: 
115.
:: ---------------------------------------------------------------------- 
116.
 
117.
:: ---------------------------------------------------------------------- 
118.
:ProcessLine 
119.
:: ---------------------------------------------------------------------- 
120.
echo Unterprogramm: Installiere mit Daten %~1 >NUL 
121.
:: so viele Drucker installieren, wie Adressen vorhanden 
122.
for %%i in (%~1) do ( 
123.
	echo Bearbeite IP %%i >NUL 
124.
	::Adresse in IP-Range? 
125.
	echo %%i|findstr /c:%2 >NUL && ( 
126.
		set "ipadr=%%i"  
127.
		set "IPPortName=IP_%%i" 
128.
		::Schalter setzen 
129.
		REM Schalter-Variable - diese wird zunaechst gesetzt, und,  
130.
		REM wenn im Unterprogramm die IP gefunden wird, geloescht.  
131.
		REM Nach Rueckkehr ins Hauptprogramm ist dann am Zustand der  
132.
		REM Variablen  defined  oder  not defined  das Ergebnis  
133.
		REM der Ueberpruefung abzulesen. 
134.
		set "InstIP=True" 
135.
 
136.
		set InstDr= 
137.
 
138.
		call :CHECK_PRINTER 
139.
		call :CHECK_IP_PORT 
140.
		::nur bei noch gesetztem Schalter installieren 
141.
		if defined InstIP call :INSTALLATION 
142.
		if not defined InstDR call :INSTALLATION_ONLY_PRINTER 
143.
 
144.
145.
146.
goto :eof 
147.
 
148.
 
149.
 
150.
:: ---------------------------------------------------------------------- 
151.
:CHECK_IP_PORT 
152.
:: ---------------------------------------------------------------------- 
153.
:: 
154.
::  	Prüfen, ob der Standard TCP/IP-Port bereits existiert  
155.
::     	und in der Registry eingetragen ist 
156.
:: 
157.
::     	Wenn dem so ist, ist das Scripts bereits auf diesem Client gelaufen  
158.
::	und kann beendet werden 
159.
:: 
160.
::	ERRORLEVEL=0 Standard TCP/IP-Port existiert in der Registry 
161.
::	ERRORLEVEL=1 Standard TCP/IP-Port existiert nicht in der Registry 
162.
:: 
163.
 
164.
	echo IM CHECK_IP_PORT 
165.
 
166.
	echo %date% %time% - %LINE%									>> %AddPrntLog% 
167.
	echo %date% %time% - Pruefen, ob der Standard TCP/IP-Port %IPPortName% bereits existiert... 	>> %AddPrntLog% 
168.
	echo %date% %time% - REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v IPAddress >> %AddPrntLog% 
169.
 
170.
::	Falls die IP in der Registry gefunden wird, InstIP-Schalter loeschen 
171.
	REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%">NUL && set InstIP= 
172.
 
173.
	if not defined InstIP ( 
174.
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% bereits eingetragen 		>> %AddPrntLog% 
175.
		rem goto :CHECK_PRINTER 
176.
 		goto :eof 
177.
	) else ( 
178.
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden 		>> %AddPrntLog% 
179.
180.
 
181.
	echo\												>> %AddPrntLog% 
182.
	goto :eof 
183.
 
184.
 
185.
:: ---------------------------------------------------------------------- 
186.
:CHECK_PRINTER 
187.
:: ---------------------------------------------------------------------- 
188.
:: 
189.
::  	Prüfen, ob der Drucker bereits installiert ist 
190.
:: 
191.
::     	Wenn dem so ist, ist das Scripts bereits auf diesem Client gelaufen  
192.
::	und kann beendet werden 
193.
:: 
194.
:: 	Schalter-Variable InstDr - diese wird zunaechst nicht gesetzt, und,  
195.
:: 	wenn im Unterprogramm ein Drucker gefunden wird, gesetzt.  
196.
:: 	Nach Rueckkehr ins Hauptprogramm und bei der Abfrage der Unterprogramme  
197.
::	ist dann am Zustand der Variablen  defined  oder  not defined   
198.
::	das Ergebnis der Ueberpruefung abzulesen. 
199.
 
200.
	echo IM CHECK_PRINTER 
201.
 
202.
::	set InstDr= 
203.
 
204.
for /f "tokens=1 delims=:" %%x in ('wmic printer get DeviceID^|FINDSTR "%DruckerName%"') do ( 
205.
		echo  Druckername aus DeviceID: %%x|findstr /c:"%DruckerName%%ipadr%" && ( 
206.
		echo Drucker %DruckerName%%ipadr% existiert. 
207.
		set "InstDr=True" 
208.
209.
210.
 
211.
echo InstDr: %InstDr% 
212.
echo Drucker: %DruckerName%%ipadr%. 
213.
rem set ipadr= 
214.
 
215.
	echo\												>> %AddPrntLog% 
216.
	goto :eof 
217.
 
218.
 
219.
:: ---------------------------------------------------------------------- 
220.
:INSTALLATION 
221.
:: ---------------------------------------------------------------------- 
222.
 
223.
	set DruckerName=%DefineDruckerName%%ipadr% 
224.
 
225.
	call :CREATE_TCPIP_PORT 
226.
	call :STOP_START_SPOOLER 
227.
	if defined InstIP goto :eof 
228.
 
229.
:: ---------------------------------------------------------------------- 
230.
:INSTALLATION_ONLY_PRINTER 
231.
:: ---------------------------------------------------------------------- 
232.
	echo INSTALLATION_ONLY_PRINTER 
233.
 
234.
	call :ADD_PRINTER_DRIVER 
235.
	call :ADD_LOGICAL_PRINTER 
236.
	call :SETTING_PRINTER 
237.
	If defined TstPrnt call :PRINT_TESTPAGE 
238.
	goto :eof 
239.
 
240.
 
241.
:: ---------------------------------------------------------------------- 
242.
:CREATE_TCPIP_PORT 
243.
:: ---------------------------------------------------------------------- 
244.
 
245.
echo IM CREATE_TCPIP_PORT 
246.
 
247.
::  	Standard TCP/IP-Port in die Registry eintragen  
248.
::	mit REG ADD Befehlen.... 
249.
	goto :eof 
250.
 
251.
 
252.
:: ---------------------------------------------------------------------- 
253.
:STOP_START_SPOOLER 
254.
:: ---------------------------------------------------------------------- 
255.
 
256.
:: 	Druckerwarteschlange anhalten/starten 
257.
 
258.
	echo %date% %time% - Druckerwarteschlage anhalten... 				>> %AddPrntLog% 
259.
	echo %date% %time% - Druckerwarteschlage starten... 				>> %AddPrntLog% 
260.
	goto :eof 
261.
 
262.
 
263.
 
264.
 
265.
:: ---------------------------------------------------------------------- 
266.
:ADD_PRINTER_DRIVER 
267.
:: ---------------------------------------------------------------------- 
268.
 
269.
	echo IM ADD_PRINTER_DRIVER 
270.
 
271.
	goto :eof 
272.
 
273.
 
274.
:: ---------------------------------------------------------------------- 
275.
:ADD_LOGICAL_PRINTER 
276.
:: ---------------------------------------------------------------------- 
277.
 
278.
	echo IM ADD_LOGICAL_PRINTER 
279.
	goto :eof 
280.
 
281.
 
282.
:: ---------------------------------------------------------------------- 
283.
:SETTING_PRINTER 
284.
:: ---------------------------------------------------------------------- 
285.
 
286.
	echo IM SETTING_PRINTER 
287.
	set DruckerName=%DefineDruckerName%%ipadr% 
288.
	goto :eof 
289.
 
290.
 
291.
:: ---------------------------------------------------------------------- 
292.
:PRINT_TESTPAGE 
293.
:: ---------------------------------------------------------------------- 
294.
 
295.
:: 	Testseite ausdrucken / NUR WAEHREND DER TESTS !!!! 
296.
	set DruckerName=%DefineDruckerName%%ipadr% 
297.
	echo %date% %time% - Testseite auf %DefineDruckerName%%ipadr% ausdrucken... 	>> %AddPrntLog% 
298.
	goto :eof 
299.
 
300.
:: ---------------------------------------------------------------------- 
301.
:CLEANUP 
302.
:: ---------------------------------------------------------------------- 
303.
:: 
304.
::  	Aufraeumen von nicht mehr benötigten Dateien 
305.
:: 
306.
	echo %date% %time% - %LINE%							>> %AddPrntLog% 
307.
	echo %date% %time% - Loeschen nicht mehr benoetigter Dateien... 		>> %AddPrntLog% 
308.
:: 	del %AddPrntLogOld%								>> %AddPrntLog% 
309.
	goto :eof 
310.
 
311.
 
312.
:: ---------------------------------------------------------------------- 
313.
:CLEAR_VARIABLES 
314.
:: ---------------------------------------------------------------------- 
315.
 
316.
	set AddPrntLog= 
317.
	set AddPrntLogOld= 
318.
	set LINE= 
319.
	set STitle= 
320.
	set InputListe= 
321.
	set scriptdir= 
322.
	set ipadr= 
323.
	set IPPortName= 
324.
 
325.
	set INFdir_PS= 
326.
	set INFdir_PCL6= 
327.
	set INFfile= 
328.
	set INFfile_PS= 
329.
	set INFfile_PCL6= 
330.
	set ModellDruckerTreiber= 
331.
	set ModellDruckerTreiber_PS= 
332.
	set ModellDruckerTreiber_PCL6= 
333.
	set DruckerName= 
334.
	set DefineDruckerNr= 
335.
	set DefineDruckerName= 
336.
	goto :eof 
337.
 
338.
:: ---------------------------------------------------------------------- 
339.
::     **********  Ende Unterprogramme Processline  ********** 
340.
:: ---------------------------------------------------------------------- 
341.
 
342.
 
343.
:: 
344.
:: ---------------------------------------------------------------------- 
345.
:: *** Fehler-Ausgänge des Scripts 
346.
:: ---------------------------------------------------------------------- 
347.
:FEHLER_LOGFILE 
348.
echo %date% %time% - Errorlevel : %errorlevel%						>> %AddPrntLog% 
349.
echo %date% %time% - ERROR: Fehler beim Anlegen der Log-Datei %AddPrntLog% !		>> %AddPrntLog% 
350.
echo %date% %time% - ERROR: %sTitle% kann nicht fortgesetzt werden.			>> %AddPrntLog% 
351.
echo ERROR: Fehler beim Anlegen der Log-Datei %AddPrntLog% !	 
352.
echo ERROR: %sTitle% kann nicht fortgesetzt werden. 
353.
goto ENDE_AUSGANG 
354.
 
355.
:FEHLER_SOURCEFILES 
356.
echo %date% %time% - Errorlevel : %errorlevel%						>> %AddPrntLog% 
357.
echo %date% %time% - ERROR: Fehlende Input-Dateien (%INFfile% oder %InputListe%) !	>> %AddPrntLog% 
358.
echo %date% %time% - ERROR: %sTitle% kann nicht fortgesetzt werden.			>> %AddPrntLog% 
359.
goto ENDE 
360.
 
361.
:: ---------------------------------------------------------------------- 
362.
:ENDE 
363.
:: ---------------------------------------------------------------------- 
364.
 
365.
::	Bottomline im Logfile 
366.
	echo %date% %time% - %LINE%							>> %AddPrntLog% 
367.
	echo %date% %time% - Ende %sTitle% on Node %ComputerName%     			>> %AddPrntLog% 
368.
	echo %date% %time% - %LINE%							>> %AddPrntLog% 
369.
 
370.
	call :CLEAR_VARIABLES 
371.
 
372.
:: ---------------------------------------------------------------------- 
373.
:ENDE_AUSGANG 
374.
:: ---------------------------------------------------------------------- 
375.
 
Bitte warten ..
Mitglied: bastla
29.04.2008 um 23:26 Uhr
Hallo Flauschbobbel!

... sorry für meine verspätete Antwort ...
Na, in dieser Hinsicht hast Du ja noch einiges gut ...
Zu Deinem Entwurf:

Die Festlegung des Druckernamens erfolgte zwar an mehreren Stellen, aber etwas spät (Du willst ihn ja eigentlich schon bei der Auswertung der "wmic"-Abfrage verwenden) - ist in der neuen Version korrigiert; ebenso, dass die IP-Adresse ev doppelt angefügt worden wäre.

Außerdem habe ich die Verwendung des Schalters "InstDR" umgekehrt - wenn er im Unterprogramm gesetzt wird, bekommt das aufrufende Programm diese Tatsache nicht mit.

Das Löschen der Variablen am Ende wäre reiner Luxus - das "setlocal" am Anfang sorgt ohnehin dafür, dass neu hinzugekommene Variablen das Ende des Batches "nicht überleben".

Neu hinzugekommen ist die Berücksichtigung der "Subnet Mask", wobei die für den Client gültige Maske ja ohnehin ebenfalls per "ipconfig" ausgelesen werden kann - eine Erfassung in der .csv-Datei ist daher nicht nötig.

Die Schleife im Hauptprogramm ließ sich etwas vereinfachen, indem das Auslesen der Client-Daten (IP-Adresse, Maske) vorweg erfolgt und die Ergebnisse in Variablen für die weiteren Programmteile zur Verfügung gehalten werden.

Im Unterprogramm ":INSTALLATION" war die Abfrage "if defined InstIP" überflüssig, da dieses Unterprogramm ja ohnehin nur bei gesetztem Schalter "InstIP" aufgerufen wird.

Noch ein Detail (aber eher nur kosmetischer Natur): Die Variable %STitle% erhält jetzt ihren Wert aus Name und Typ der Batchdatei (ist etwas flexibler).

So sieht's nun aus:
01.
@echo off & setlocal 
02.
 
03.
:: ====================================================================== 
04.
:: 
05.
:: C O N F I G	/  Modifikationen und Einstellungen 
06.
:: 
07.
:: ====================================================================== 
08.
 
09.
::	Script und Logfile 
10.
	set STitle=%~nx0 
11.
	set LINE=---------------------------------------------------------------------- 
12.
	set scriptdir=%~dp0 
13.
	set AddPrntLog=%temp%\AddPrntr_%ComputerName%.log 
14.
	set AddPrntLogOld=%temp%\AddPrntr_%ComputerName%.old 
15.
 
16.
 
17.
::	Schalter-Variable fuer Testprint 
18.
::	Ist diese mit dem Wert True gesetzt, wird nach erfolgreicher Installation  
19.
::	des Standard-TCP/IP-Ports und des Druckers eine Testseite gedruckt. 
20.
::	Nur für Testzwecke. 
21.
	set TstPrnt= 
22.
 
23.
 
24.
::	Druckerinstallation 
25.
	set "INFdir_PS=%scriptdir%DrvPS\" 
26.
	set "INFdir_PCL6=%scriptdir%DrvPCL6\" 
27.
	set "INFfile_PS=%INFdir_PS%ricsetup.inf" 
28.
	set "INFfile_PCL6=%INFdir_PCL6%OEMSETUP.INF" 
29.
	set ModellDruckerTreiber_PS="RICOH Aficio SP 4100N PS" 
30.
	set ModellDruckerTreiber_PCL6="RICOH Aficio SP 4110N PCL 6" 
31.
 
32.
::  	Hier ggf. die zu installierende Druckersprache (PS oder PCL6) auswählen. 
33.
::  	Als Standard wird PCL6 verwendet. 
34.
:: 
35.
	set INFfile=%INFfile_PCL6% 
36.
	set ModellDruckerTreiber=%ModellDruckerTreiber_PCL6% 
37.
 
38.
 
39.
:: 	Namenskonvention der Druckernamen 
40.
:: 	Drucker_Schalter_<IP-Adr>  
41.
::  
42.
	set DefineDruckerName=Drucker_Schalter_ 
43.
	set DefineDruckerNr=0 
44.
 
45.
 
46.
::	Excelliste (.csv) als Inputinformationen für dieses Installationsscript 
47.
:: 
48.
	set "InputListe=%scriptdir%RO_TEST.csv" 
49.
 
50.
 
51.
:: ====================================================================== 
52.
:: 
53.
:: M A I N 
54.
:: 
55.
:: ====================================================================== 
56.
 
57.
::	Wenn bereits ein .LOG existiert, kopieren auf .OLD  
58.
	if exist %AddPrntLog% copy %AddPrntLog% %AddPrntLogOld% >NUL 
59.
 
60.
::	Startline im Logfile 
61.
	echo %date% %time% - %LINE%							> %AddPrntLog% 
62.
	echo %date% %time% - Start %sTitle% on Node %ComputerName%			>> %AddPrntLog% 
63.
	echo %date% %time% - %LINE%							>> %AddPrntLog% 
64.
 
65.
 
66.
::	Prüfen, ob das Schreiben der Log-Datei erfolgreich war 
67.
	if not exist %AddPrntLog% goto fehler_logfile 
68.
 
69.
 
70.
::	Prüfen ob die notwendigen Installationsverzeichnisse/Dateien vorhanden sind 
71.
	set OK=True 
72.
	if not exist "%INFfile%" ( 
73.
		echo %date% %time% - ERROR: Datei %INFfile% nicht vorhanden!		>> %AddPrntLog% 
74.
		set OK= 
75.
76.
	if not exist "%InputListe%" ( 
77.
		echo %date% %time% - ERROR: Excel-Inputdatei %InputListe% nicht vorhanden! >> %AddPrntLog% 
78.
		set OK= 
79.
80.
	if not defined OK goto :FEHLER_SOURCEFILES 
81.
 
82.
 
83.
::	Info über die Lokation der Input-Dateien ins Logfile eintragen 
84.
	echo %date% %time% - Installationsource der INF-Datei: %INFfile% 		>> %AddPrntLog%	 
85.
	echo %date% %time% - Excel-Inputliste: %InputListe% 				>> %AddPrntLog% 
86.
 
87.
 
88.
::	IP-Adresse des Clients auslesen,  
89.
::  	IP-Adressen der zu installierenden Drucker aus Excelliste  
90.
::	auslesen und für Nutzung zusammensetzen 
91.
 
92.
:: IP des Clients auslesen 
93.
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do ( 
94.
	::IP des Clients zerlegen in %%a.%%b.%%c = Netzanteil = %CI13% und %%d = Hostanteil = %CI4% (diese Variable steht fuer: 4. Stelle der Client-IP) 
95.
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do set "CI13=%%a.%%b.%%c" & set "CI4=%%d" 
96.
97.
:: Subnet Mask des Clients auslesen 
98.
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR /i "mask"') do ( 
99.
	::Subnet Mask des Clients zerlegen in %%a.%%b.%%c (255.255.255 wird vorausgesetzt) sowie Anteil %%d  
100.
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do set "S13=%%a.%%b.%%c" & set "S4=%%d" 
101.
102.
 
103.
:: Faktor fuer Subnet-Berechnung = Anzahl der möglichen Adressen je Subnetz 
104.
set /a SNF=256-%S4% 
105.
:: Subnet-Index des Clients berechnen 
106.
set /a CSNI=%CI4%/%SNF% 
107.
 
108.
:: Drucker-Datensatz aus der Excelliste auslesen - zumindest Netzanteil (Teile 1 bis 3 der IP-Adresse) muss uebereinstimmen 
109.
for /f "tokens=10-14 delims=;" %%m in ('findstr /c:"%CI13%." "%InputListe%"') do ( 
110.
	:: Drucker installieren - bis zu 4 Adressen uebergeben 
111.
	echo Installiere mit Daten %%m %%n %%o %%p 
112.
	call :PROCESSLINE "%%m %%n %%o %%p" 
113.
114.
 
115.
	call :CLEANUP 
116.
	goto ENDE 
117.
 
118.
 
119.
:: ---------------------------------------------------------------------- 
120.
:: 
121.
::     **********     Unterprogramm Processline    ********** 
122.
:: 
123.
:: ---------------------------------------------------------------------- 
124.
 
125.
:: ---------------------------------------------------------------------- 
126.
:ProcessLine 
127.
:: ---------------------------------------------------------------------- 
128.
echo Unterprogramm: Installiere mit Daten %~1 >NUL 
129.
:: so viele Drucker installieren, wie Adressen vorhanden 
130.
for %%i in (%~1) do ( 
131.
	echo Bearbeite IP %%i >NUL 
132.
	::Werte fuer Installation festlegen 
133.
	set "ipadr=%%i"  
134.
	set "IPPortName=IP_%%i" 
135.
	set "DruckerName=%DefineDruckerName%%%i" 
136.
	 
137.
	::Adresse in IP-Range (Stellen 1-3 der Client-IP in Drucker-IP enthalten)? 
138.
	echo %%i|findstr /c:"%CI13%." >NUL && ( 
139.
	 
140.
		::Pruefen auf selbes Subnet 
141.
		set "SubnetOK=True" 
142.
		call :CHECK_SUBNET "%%i" 
143.
		 
144.
		::Wenn Drucker im selben Subnet wie Client, weiter pruefen ... 
145.
		if defined SubnetOK ( 
146.
			REM Schalter setzen 
147.
			REM Schalter-Variable - diese wird zunaechst gesetzt, und,  
148.
			REM wenn im Unterprogramm die IP gefunden wird, geloescht.  
149.
			REM Nach Rueckkehr ins Hauptprogramm ist dann am Zustand der  
150.
			REM Variablen  "defined"  oder  "not defined"  das Ergebnis  
151.
			REM der Ueberpruefung abzulesen. 
152.
			set "InstDR=True" 
153.
			call :CHECK_PRINTER 
154.
 
155.
			set "InstIP=True" 
156.
			call :CHECK_IP_PORT 
157.
 
158.
			:: nur bei noch gesetztem Schalter installieren 
159.
			if defined InstIP call :INSTALLATION 
160.
			if defined InstDR call :INSTALLATION_ONLY_PRINTER 
161.
			 
162.
		) else ( 
163.
			echo %date% %time% - Drucker-IP %%i nicht im selben Subnet wie Client-IP %CI13%.%CI4%		>> %AddPrntLog% 
164.
165.
166.
167.
goto :eof 
168.
 
169.
:: ---------------------------------------------------------------------- 
170.
::     **********  Ende Unterprogramme Processline  ********** 
171.
:: ---------------------------------------------------------------------- 
172.
 
173.
 
174.
:CHECK_SUBNET 
175.
::Hostanteil Drucker-IP ermitteln 
176.
for /f "tokens=4 delims=." %%a in (%1) do set PI4=%%a 
177.
::Subnet-Index Drucker berechnen 
178.
set /a PSNI=%PI4%/%SNF% 
179.
::Subnet-Indizes Drucker und Client vergleichen; wenn ungleich, Schalter loeschen 
180.
if %PSNI% neq %CSNI% set SubnetOK= 
181.
goto :eof 
182.
 
183.
:: ---------------------------------------------------------------------- 
184.
:CHECK_IP_PORT 
185.
:: ---------------------------------------------------------------------- 
186.
:: 
187.
::  	Prüfen, ob der Standard TCP/IP-Port bereits existiert  
188.
::     	und in der Registry eingetragen ist 
189.
:: 
190.
::     	Wenn dem so ist, ist das Scripts bereits auf diesem Client gelaufen  
191.
::	und kann beendet werden 
192.
:: 
193.
::	ERRORLEVEL=0 Standard TCP/IP-Port existiert in der Registry 
194.
::	ERRORLEVEL=1 Standard TCP/IP-Port existiert nicht in der Registry 
195.
:: 
196.
echo IM CHECK_IP_PORT 
197.
 
198.
echo %date% %time% - %LINE%									>> %AddPrntLog% 
199.
echo %date% %time% - Pruefen, ob der Standard TCP/IP-Port %IPPortName% bereits existiert... 	>> %AddPrntLog% 
200.
echo %date% %time% - REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v IPAddress >> %AddPrntLog% 
201.
 
202.
::	Falls die IP in der Registry gefunden wird, InstIP-Schalter loeschen 
203.
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%">NUL && set InstIP= 
204.
 
205.
if not defined InstIP ( 
206.
	echo %date% %time% - Standard TCP/IP-Port %IPPortName% bereits eingetragen 		>> %AddPrntLog% 
207.
	::goto :CHECK_PRINTER 
208.
		goto :eof 
209.
) else ( 
210.
	echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden 		>> %AddPrntLog% 
211.
212.
 
213.
echo\												>> %AddPrntLog% 
214.
goto :eof 
215.
 
216.
:: ---------------------------------------------------------------------- 
217.
:CHECK_PRINTER 
218.
:: ---------------------------------------------------------------------- 
219.
:: 
220.
::  	Prüfen, ob der Drucker bereits installiert ist 
221.
:: 
222.
::     	Wenn dem so ist, ist das Scripts bereits auf diesem Client gelaufen  
223.
::	und kann beendet werden 
224.
:: 
225.
:: 	Schalter-Variable InstDr - diese wird zunaechst nicht gesetzt, und,  
226.
:: 	wenn im Unterprogramm ein Drucker gefunden wird, gesetzt.  
227.
:: 	Nach Rueckkehr ins Hauptprogramm und bei der Abfrage der Unterprogramme  
228.
::	ist dann am Zustand der Variablen  defined  oder  not defined   
229.
::	das Ergebnis der Ueberpruefung abzulesen. 
230.
 
231.
echo IM CHECK_PRINTER 
232.
 
233.
::	set InstDr= 
234.
 
235.
for /f "tokens=1 delims=:" %%x in ('wmic printer get DeviceID^|FINDSTR "%DruckerName%"') do ( 
236.
		echo  Druckername aus DeviceID: %%x|findstr /c:"%DruckerName%" && ( 
237.
		echo Drucker %DruckerName% existiert. 
238.
		set InstDr= 
239.
240.
241.
 
242.
echo InstDr: %InstDr% 
243.
echo Drucker: %DruckerName% 
244.
 
245.
echo\												>> %AddPrntLog% 
246.
goto :eof 
247.
 
248.
:: ---------------------------------------------------------------------- 
249.
:INSTALLATION 
250.
:: ---------------------------------------------------------------------- 
251.
	call :CREATE_TCPIP_PORT 
252.
	call :STOP_START_SPOOLER 
253.
	goto :eof 
254.
 
255.
:: ---------------------------------------------------------------------- 
256.
:INSTALLATION_ONLY_PRINTER 
257.
:: ---------------------------------------------------------------------- 
258.
	echo INSTALLATION_ONLY_PRINTER 
259.
 
260.
	call :ADD_PRINTER_DRIVER 
261.
	call :ADD_LOGICAL_PRINTER 
262.
	call :SETTING_PRINTER 
263.
	If defined TstPrnt call :PRINT_TESTPAGE 
264.
	goto :eof 
265.
 
266.
:: ---------------------------------------------------------------------- 
267.
:CREATE_TCPIP_PORT 
268.
:: ---------------------------------------------------------------------- 
269.
echo IM CREATE_TCPIP_PORT 
270.
 
271.
::  	Standard TCP/IP-Port in die Registry eintragen  
272.
::	mit REG ADD Befehlen.... 
273.
	goto :eof 
274.
 
275.
:: ---------------------------------------------------------------------- 
276.
:STOP_START_SPOOLER 
277.
:: ---------------------------------------------------------------------- 
278.
:: 	Druckerwarteschlange anhalten/starten 
279.
 
280.
	echo %date% %time% - Druckerwarteschlage anhalten... 				>> %AddPrntLog% 
281.
	echo %date% %time% - Druckerwarteschlage starten... 				>> %AddPrntLog% 
282.
	goto :eof 
283.
 
284.
:: ---------------------------------------------------------------------- 
285.
:ADD_PRINTER_DRIVER 
286.
:: ---------------------------------------------------------------------- 
287.
	echo IM ADD_PRINTER_DRIVER 
288.
	goto :eof 
289.
 
290.
:: ---------------------------------------------------------------------- 
291.
:ADD_LOGICAL_PRINTER 
292.
:: ---------------------------------------------------------------------- 
293.
	echo IM ADD_LOGICAL_PRINTER 
294.
	goto :eof 
295.
 
296.
:: ---------------------------------------------------------------------- 
297.
:SETTING_PRINTER 
298.
:: ---------------------------------------------------------------------- 
299.
	echo IM SETTING_PRINTER 
300.
	goto :eof 
301.
 
302.
:: ---------------------------------------------------------------------- 
303.
:PRINT_TESTPAGE 
304.
:: ---------------------------------------------------------------------- 
305.
:: 	Testseite ausdrucken / NUR WAEHREND DER TESTS !!!! 
306.
	echo %date% %time% - Testseite auf %DefineDruckerName%%ipadr% ausdrucken... 	>> %AddPrntLog% 
307.
	goto :eof 
308.
	 
309.
:: ---------------------------------------------------------------------- 
310.
:CLEANUP 
311.
:: ---------------------------------------------------------------------- 
312.
:: 
313.
::  	Aufraeumen von nicht mehr benötigten Dateien 
314.
:: 
315.
	echo %date% %time% - %LINE%							>> %AddPrntLog% 
316.
	echo %date% %time% - Loeschen nicht mehr benoetigter Dateien... 		>> %AddPrntLog% 
317.
:: 	del %AddPrntLogOld%								>> %AddPrntLog% 
318.
	goto :eof 
319.
 
320.
:: 
321.
:: ---------------------------------------------------------------------- 
322.
:: *** Fehler-Ausgänge des Scripts 
323.
:: ---------------------------------------------------------------------- 
324.
:FEHLER_LOGFILE 
325.
echo %date% %time% - Errorlevel : %errorlevel%						>> %AddPrntLog% 
326.
echo %date% %time% - ERROR: Fehler beim Anlegen der Log-Datei %AddPrntLog% !		>> %AddPrntLog% 
327.
echo %date% %time% - ERROR: %sTitle% kann nicht fortgesetzt werden.			>> %AddPrntLog% 
328.
echo ERROR: Fehler beim Anlegen der Log-Datei %AddPrntLog% !	 
329.
echo ERROR: %sTitle% kann nicht fortgesetzt werden. 
330.
goto ENDE_AUSGANG 
331.
 
332.
:FEHLER_SOURCEFILES 
333.
echo %date% %time% - Errorlevel : %errorlevel%						>> %AddPrntLog% 
334.
echo %date% %time% - ERROR: Fehlende Input-Dateien (%INFfile% oder %InputListe%) !	>> %AddPrntLog% 
335.
echo %date% %time% - ERROR: %sTitle% kann nicht fortgesetzt werden.			>> %AddPrntLog% 
336.
goto ENDE 
337.
 
338.
:: ---------------------------------------------------------------------- 
339.
:ENDE 
340.
:: ---------------------------------------------------------------------- 
341.
::	Bottomline im Logfile 
342.
	echo %date% %time% - %LINE%							>> %AddPrntLog% 
343.
	echo %date% %time% - Ende %sTitle% on Node %ComputerName%     			>> %AddPrntLog% 
344.
	echo %date% %time% - %LINE%							>> %AddPrntLog% 
345.
 
346.
:: ---------------------------------------------------------------------- 
347.
:ENDE_AUSGANG 
348.
:: ----------------------------------------------------------------------
Grüße
bastla
Bitte warten ..
Mitglied: Biber
29.04.2008 um 23:55 Uhr
.... und eine (hoffentlich letzte) Anregung:

Diese gefühlte 100x nach gleichem Muster auftauchenden LogMeldungen...
01.
... 
02.
echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden 		>> %AddPrntLog%
.... würde ich über einen Call:Block abfackeln:

01.
..... 
02.
Call:WriteLog "Standard TCP/IP-Port %IPPortName% noch nicht vorhanden" 
03.
.... 
04.
... 
05.
goto :eof 
06.
 
07.
:WriteLog 
08.
>> %AddPrntLog% echo %date% %time% - %~1 
09.
:goto eof
Grüße
Biber
Bitte warten ..
Mitglied: Flauschbobbel
05.05.2008 um 20:10 Uhr
Hallo bastla,

zunächst nochmals herzlichen Dank, soweit funktioniert das Skript sehr gut
Ich habe noch ein Problem mit dem Auslesen der Subnetmask. Nachdem ich heute meine aktuelle Liste erhalten habe, stelle ich fest, dass ich folgende Subnetmasks habe:

255.255.255.0
255.255.255.128
255.255.255.224
255.255.255.240

Wie kann ich die noch in die Schleife (mit der mask von 255.255.255.128) mit einbauen? Ich habe überhaupt keinen Plan. Sorry, kannst Du mir bitte eine Hilfestellung geben...

Danke und viele Grüße,
Flauschbobbel
Bitte warten ..
Mitglied: Flauschbobbel
05.05.2008 um 20:13 Uhr
Hallo biber,

Deine Idee ist echt klasse, habe ich umgesetzt. Wie kann ich aber bsp.

call :WRITELOG "Druckerwarteschlange anhalten..."
call :WRITELOG "net stop spooler"
net stop spooler >> %AddPrntLog%

die Ausgabe eines Befehls, z.B. net stop spooler umsetzen? Bei den normalen "echo"-Befehlen klappt das sehr gut. Ich habe es wie in obigem Bsp gemacht. Gibt es eine andere Möglichkeit?

Danke und Grüße,
Flauschbobbel
Bitte warten ..
Mitglied: Biber
05.05.2008 um 21:08 Uhr
Moin Flauschbobbel,

z.B. so :
01.
call :WRITELOG "net stop spooler" 
02.
For /F "Delims=" %%i IN ('net stop spooler') do  call :WRITELOG "%%i" 
03.
....
Grüße
Biber
Bitte warten ..
Mitglied: bastla
05.05.2008 um 21:33 Uhr
Hallo Flauschbobbel!

Wie kann ich die noch in die Schleife (mit der mask von 255.255.255.128) mit einbauen?
Ich weiß nicht, ob ich Dich richtig verstehe, denn eine derartig "spezialisierte" Schleife gibt es nicht - der Batch sollte bereits jede mit 255.255.255 beginnende Maske verarbeiten ...

Abgesehen von der Überlegung, dass ja der installierende Rechner seine eigene Subnetmask kennt (und daher über "ipconfig", wie oben bereits vorgesehen, auslesen kann) und eigentlich daher eine Übernahme aus der .csv-Datei gar nicht nötig sein sollte, könntest Du für Einlesen und Zerlegung der Maske nach dem gleichen Schema wie bei den IP-Adressen (bzw wie im Teil ":: Subnet Mask des Clients auslesen" gezeigt) vorgehen ...

Grüße
bastla
Bitte warten ..
Mitglied: Flauschbobbel
05.05.2008 um 22:01 Uhr
Hallo bastla,

vielleicht habe ich mich unklar ausgedrückt, ich versuche es nochmal zusammenzufassen:
Ich habe eine csv-Liste mit IP-Adressen (incl. der Subnetmask) der zu installierenden Drucker in den jeweiligen Standorten. Das Skript incl. der csv-Liste und Druckertreiber wird auf alle Clients in allen Standorten verteilt und läuft auf allen Clients.
Das Skript auf dem Client schaut nun nach, welche IP-Adresse und Subnet-Mask habe ich (Client) und ist in der csv-Liste ein Drucker, der auf Basis der Subnetmask in der gleichen IP-range sich befindet. Wenn ja, dann soll der Drucker auf diesen Clients installiert werden. Wenn nein -> Ende Skript. Das Skript geht ja auch soweit.
Ich bin im Moment etwas verwirrt, weil ich in meiner Liste zu den bereits bekannte Subnetmask (255.255.255.128) nun noch die Subnetmaske 255.255.255.224 und 255.255.255.240 habe. Daher dachte inch nun, ich muss die Abfrage auf diese Bereiche ausdehnen. Ich muss also doch vergleichen, ist der Client und der zu installierende Drucker im gleichen Subnetz, wenn ja dann installiere. Korrekt? Oder mache ich einen Denkfehler?

Grüße,
Flauschbobbel
Bitte warten ..
Mitglied: bastla
05.05.2008 um 22:21 Uhr
Hallo Flauschbobbel!

Ich muss also doch vergleichen, ist der Client und der zu installierende Drucker im gleichen Subnetz, wenn ja dann installiere. Korrekt?
Korrekt - allerdings ist diese Logik schon im obigen Batch integriert, wobei ich es für sinnvoller halte, die aktuell für den Rechner gültige "Subnet mask" auszulesen, anstatt die in der csv-Liste angegebene zu verwenden ...

Die verwendete Vorgangsweise:
01.
:: Subnet Mask des Clients auslesen 
02.
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR /i "mask"') do ( 
03.
	::Subnet Mask des Clients zerlegen in %%a.%%b.%%c (255.255.255 wird vorausgesetzt) sowie Anteil %%d  
04.
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do set "S13=%%a.%%b.%%c" & set "S4=%%d" 
05.
)
Nach diesen Zeilen steht in %S13% im Normallfall "255.255.255" (der Variablenname soll bedeuten "Subnetmask, Stellen 1-3") und in %S4% der vierte Teil der Maske. Auf Basis dessen kann als "Faktor" die Anzahl der Adressen je Subnet (%SNF%) und in weiterer Folge als "Subnet-Index" die laufende Nummer (Zählung beginnt bei 0) des Subnetztes ermittelt werden:
01.
:: Faktor fuer Subnet-Berechnung = Anzahl der möglichen Adressen je Subnetz 
02.
set /a SNF=256-%S4% 
03.
:: Subnet-Index des Clients berechnen 
04.
set /a CSNI=%CI4%/%SNF%
Beispiel: Wenn der Rechner die IP-Adresse 192.168.1.123 und die Subnetmask 255.255.255.224 hätte, befände er sich im Subnet Nr. 3 - Erklärung: Aufgrund der Maske umfasst jedes Subnet 32 Adressen, daher Subnet 0 = 0 - 31, Subnet 1 = 32 - 63, Subnet 2 = 64 - 95, Subnet 3 = 96 - 127

Die selbe Berechnung stelle ich für jeden Drucker an (siehe ":CHECK_SUBNET"), und wenn die hiefür berechnete Nr mit jener des Rechners übereinstimmt, befindet er sich im gleichen Subnet und könnte daher installiert werden.

Grüße
bastla
Bitte warten ..
Mitglied: Flauschbobbel
13.05.2008 um 20:33 Uhr
Hallo bastla,

sorry für die verspätetet Antwort. Ich bin gesundheitlich einige Zeit ausgefallen und war im Krankenhaus.

Ich muss leider das Thema nochmal aufgreifen. Irgendwie habe ich noch ein Verständnisproblem:

Ich habe auf der einen Seite meine Inputliste (csv-Datei) mit folgendem Inhalt:
(Zur besseren Übersicht habe ich es mal in diesem Format dargestellt)


01.
 
02.
Standort-ID  ; Standort-Nr; Standortschlüssel ; PLZ  ; Ort      ; Strasse   ; Anzahl NetzwDr ; Bemerkung1 ; Bemerkung2 ; IP-Adresse   ; Subnet-Maske    ; DosenNr ; Bemerkung 
03.
470:11       ; 8098835    ; 47011             ; 12345; Irgendwo ; Musterstr ; 1              ;            ;            ; 10.35.41.102 ; 255.255.255.224 ;         ; 
04.
470:92       ; 8070837    ; 47092             ; 67891; Irgendwo2; Musterstr ; 2              ;            ;            ; 10.35.169.198; 255.255.255.224 ;         ; 
05.
470:92       ; 8070837    ; 47092             ; 67891; Irgendwo2; Musterstr ; 2              ;            ;            ; 10.35.169.199; 255.255.255.224 ;         ; 
06.
123:12       ; 1234567    : 12312             ; 54391; Musterstadt1; Musterstr;2             ;            ;            ; 10.36.168.33 ; 255.255.255.224 ;         ; 
07.
123:12       ; 1234567    ; 12312             ; 54391; Musterstadt1; Musterstr;2             ;            ;            ; 10.36.168.34 ; 255.255.255.224 ;         ; 
08.
123:13       ; 1234568    : 12313             ; 54444; Musterdorf; Musterstr;  2             ;            ;            ; 10.36.168.79 ; 255.255.255.224 ;         ; 
09.
123:13       ; 1234568    : 12313             ; 54444; Musterdorf; Musterstr;  2             ;            ;            ; 10.36.168.80 ; 255.255.255.224 ;         ; 
10.
890:11       ; 1198822    ; 89011             ; 98765; Irgendwo3; Musterstr ; 2              ;            ;            ; 160.54.78.86 ; 255.255.255.0   ;         ; 
11.
890:11       ; 1198822    ; 89011             ; 98765; Irgendwo3; Musterstr ; 2              ;            ;            ; 160.54.78.87 ; 255.255.255.0   ;         ; 
12.
100:22       ; 1198822    ; 10022             ; 23456; Irgendwo4; Musterstr ; 2              ;            ;            ; 160.54.31.231; 255.255.255.240 ;         ; 
13.
100:22       ; 1198822    ; 10022             ; 23456; Irgendwo4; Musterstr ; 2              ;            ;            ; 160.54.31.232; 255.255.255.240 ;         ;
Die Liste zeigt die in den einzelnen Standorten zu installierenden (geplanten) Drucker und die dazugehörige Subnetmask der Drucker in den Standorten.


Auf der anderen Seite habe ich Deine Berechnung/Logik im Script:

Das Skript liest die IP und die Subnetmask des Clients aus:

01.
Die verwendete Vorgangsweise: 
02.
:: Subnet Mask des Clients auslesen 
03.
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR /i "mask"') do ( 
04.
	::Subnet Mask des Clients zerlegen in %%a.%%b.%%c (255.255.255 wird vorausgesetzt) sowie Anteil %%d  
05.
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do set "S13=%%a.%%b.%%c" & set "S4=%%d" 
06.
)
OK, habe ich verstanden.

Anschliessend schaut das Skript in der Liste nach, ob der passende Drucker (mit der passenden IP) vorhanden ist.

01.
Nach diesen Zeilen steht in %S13% im Normallfall "255.255.255" (der Variablenname soll bedeuten "Subnetmask, Stellen 1-3") und in %S4% der vierte Teil der Maske. Auf Basis dessen kann als "Faktor" die Anzahl der Adressen je Subnet (%SNF%) und in weiterer Folge als "Subnet-Index" die laufende Nummer (Zählung beginnt bei 0) des Subnetztes ermittelt werden: 
02.
:: Faktor fuer Subnet-Berechnung = Anzahl der möglichen Adressen je Subnetz 
03.
set /a SNF=256-%S4% 
04.
:: Subnet-Index des Clients berechnen 
05.
set /a CSNI=%CI4%/%SNF% 
06.
 
07.
Beispiel: Wenn der Rechner die IP-Adresse 192.168.1.123 und die Subnetmask 255.255.255.224 hätte, befände er sich im Subnet Nr. 3 - Erklärung: Aufgrund der Maske umfasst jedes Subnet 32 Adressen, daher Subnet 0 = 0 - 31, Subnet 1 = 32 - 63, Subnet 2 = 64 - 95, Subnet 3 = 96 - 127


OK, kann ich noch nachvollziehen, aber wie würde das in obigem Beispiel mit der IP-Adresse 160.54.31.231 und der Subnetmask 255.255.255.240 (aus meiner Liste) aussehen?
Was ist das für ein "Faktor", den Du hier erstellst? Wo kommt der her? Ich kann es irgendwie noch nicht nachvollziehen.

Schau auch bitte in der Liste auf die Beispiel von Musterstadt1 und Musterdorf. In beiden Standorten beginnt mein IP mit 10.36.168.xxx,
beide haben die Subnetmask 255.255.255.224. Dann würde das Skript doch alle Drucker (10.36.168.33, 34, 79 und 80) auf allen Clients in beiden Standorten installieren, oder?

01.
Standort-ID  ; Standort-Nr; Standortschlüssel ; PLZ  ; Ort         ; Strasse   ; Anzahl NetzwDr ; Bemerkung1 ; Bemerkung2 ; IP-Adresse   ; Subnet-Maske    ; DosenNr ; Bemerkung 
02.
123:12       ; 1234567    : 12312             ; 54391; Musterstadt1; Musterstr ;2               ;            ;            ; 10.36.168.33 ; 255.255.255.224 ;         ; 
03.
123:12       ; 1234567    ; 12312             ; 54391; Musterstadt1; Musterstr ;2               ;            ;            ; 10.36.168.34 ; 255.255.255.224 ;         ; 
04.
123:13       ; 1234568    : 12313             ; 54444; Musterdorf  ; Musterstr ;2               ;            ;            ; 10.36.168.79 ; 255.255.255.224 ;         ; 
05.
123:13       ; 1234568    : 12313             ; 54444; Musterdorf  ; Musterstr ;2               ;            ;            ; 10.36.168.80 ; 255.255.255.224 ;         ;

Sorry, bitte gib mir noch einen "Schubs ind die richtige Richtung" damit ich es verstehe.

Danke und viele Grüße,
Flauschbobbel
Bitte warten ..
Mitglied: bastla
13.05.2008 um 21:42 Uhr
Hallo Flauschbobbel!

Was ist das für ein "Faktor", den Du hier erstellst? Wo kommt der her? Ich kann es irgendwie noch nicht nachvollziehen.
Die Bezeichnung "Faktor" habe ich leider nicht glücklich gewählt - besser wäre "Anzahl der Netzwerkadressen je Subnet". Daraus errechne ich in weiterer Folge den "Subnetindex" oder, anders formuliert, die "nullbasierte Subnetznummer".

wie würde das in obigem Beispiel mit der IP-Adresse 160.54.31.231 und der Subnetmask 255.255.255.240 (aus meiner Liste) aussehen?
Auch die Rechner an diesem Standort müssten eigentlich die selbe Maske verwenden, sodass sich ein bestimmter Rechner in einem von insgesamt 16 möglichen Subnetzen befinden kann. Diese 16 Netze ergeben sich aus (256 - 240) = 16 Adressen je Netzwerk (= der angesprochene "Faktor") und 256 / 16 = 16 Netzwerke. Die einzelnen Subnetze hätten dabei folgende Zuordnung von Nummer (="Index") und Adressbereich (4. Teil nach 160.54.31):

Nr Adresse
00 - 15
116 - 31
232 - 47
348 - 63
464 - 79
580 - 95
696 - 111
7112 - 127
8128 - 143
9144 - 159
10160 - 175
11176 - 191
12192 - 207
13208 - 223
14224 - 239
15240 - 255

Der Drucker für die Adresse 160.54.31.231 würde demnach dann installiert, wenn der Rechner eine Adresse von 160.54.31.224 bis 160.54.31.239 hätte und somit im gleichen Subnetz wie der Drucker wäre - Rechenbeispiel für Rechneradresse 160.54.31.235:
01.
Rechner: 256 - 240 = 16 = "Faktor"; 235 / "Faktor" = 14,6875; ganzzahliger Anteil = 14 = "Index" 
02.
Drucker: 256 - 240 = 16 = "Faktor"; 231 / "Faktor" = 14,4375; ganzzahliger Anteil = 14 = "Index"
Da die "Indices" gleich sind, "passt" der Drucker.

Musterstadt1 und Musterdorf ... 255.255.255.224. Dann würde das Skript doch alle Drucker (10.36.168.33, 34, 79 und 80) auf allen Clients in beiden Standorten installieren, oder?
Maske 255.255.255224 bedeutet Netzwerkgröße ("Faktor") 32 - die Drucker 33 und 34 befinden sich im Subnetz mit dem Index 1 (da 33/32 = ganzzahlig 1), 79 und 80 im Subnetz 2 (79 / 32 = ganzzahlig 2) - soferne die Rechner ebenfalls die Maske 255.255.255.224 verwenden, können nur jeweils 2 der Drucker im selben Subnetz wie der Rechner liegen und daher installiert werden.

Solltest Du allerdings davon ausgehen müssen, dass Rechner und Drucker unterschiedliche Masken haben, ließe sich das zwar rechnerisch ebenfalls lösen, allerdings wäre vorweg das Netzwerkdesign zu hinterfragen.

Grüße und gute Besserung
bastla
Bitte warten ..
Mitglied: Flauschbobbel
30.09.2008 um 17:34 Uhr
Hallo bastla,

ich melde mich mit meinem Problem nochmal auf diesen Thread..

Mein Problem ist nun: Bei einigen Standorten, wie zB. die in der Liste angegebenen,
wird nicht die richtige IP-Adresse und der Druckername ausgelesen (Sollte 10.179.169.44 bzw 10.179.169.46 und ABCDrucker1 bzw. ABCDrucker2 sein). Statt dessen installiert das Script die IP-Adresse 10.179.169.62 und den Drucker 132158 und 132159.
Ich dachte das könnte an Leerstellen in der Inputliste liegen und habe testweise ALLE Leerstellen entfernt. Problem ist aber das gleiche.
Und nun mein ganz grosses Problem. Es gibt Einträge, bei denen es einwandfrei funktioniert (z.B. "Bamberg" ind der Liste, siehe unten)!!! Also kann es doch nicht sein, dass ich an einer falschen Stelle im Abschnitt ":READ_NW_INFO_PRINTER" ab einer falschen Stelle beginne zu lesen.
In der Inputliste die Zeilen für Bamberg haben einwandfrei funktioniert und wurden bei 9 von 10 Clients sauber installiert.
Ich bin ratlos! Bitte helft mir!!

Ich habe das Script etwas überarbeitet. Hier erstmal das Script. Im Anschluss einen Ausschnitt der Inputliste (rt.csv)

01.
  
02.
@echo off & setlocal 
03.
CD /D %~dp0 
04.
:: ====================================================================== 
05.
:: 
06.
:: C O N F I G	/  Modifikationen und Einstellungen 
07.
:: 
08.
:: ====================================================================== 
09.
 
10.
::	Script und Logfile 
11.
	set STitle=%~nx0 
12.
	set LINE=--------------------------------------------------------------------------- 
13.
	set scriptdir=%~dp0 
14.
	set SName=%~n0 
15.
	set LogPath=C:\Log\%SName% 
16.
	set ScriptLog=%LogPath%\%SName%.log 
17.
	set ScriptLogOld=%LogPath%\%SName%.old 
18.
 
19.
::	T E S T  /  Schalter-Variable fuer Testprint 
20.
::	Ist diese mit dem Wert True gesetzt, wird nach erfolgreicher Installation  
21.
::	des Standard-TCP/IP-Ports und des Druckers eine Testseite gedruckt. 
22.
::	Nur fuer Testzwecke. 
23.
	set "TstPrnt=" 
24.
 
25.
::	T E S T  /  Schalter-Variable fuer Testanzeige 
26.
::	Ist diese mit dem Wert TRUE gesetzt, werden am Bildschirm die einzelnen 
27.
::	Unterprogramme, in dem sich der Batch zur Laufzeit befindet, angezeigt. 
28.
::	Zusaetzlich werden mit der Variable TstCMD Befehle nur waehrend der Tests durchgefuehrt. 
29.
::	Nur fuer Testzwecke. 
30.
	set "TstInfoMsg=*** TEST ***  Bearbeite" 
31.
	set "TstCMD=" 
32.
	set "Tst=" 
33.
 
34.
::	Druckerinstallation 
35.
	set ModellDrucker="RICOH Aficio SP 4100N PCL 6" 
36.
	set ModellDruckerTreiber=%ModellDrucker% 
37.
	set TmpModellDrucker=%ModellDrucker:~1,-1% 
38.
::	Variablen fuer Druckersprache PCL6 
39.
	set "INFdir_PCL6=%scriptdir%RicohDrvPCL\" 
40.
	set "INFfile_PCL6=%INFdir_PCL6%OEMSETUP.INF" 
41.
	set INFfile="%INFfile_PCL6%" 
42.
	set TmpINFfile=%INFfile:~1,-1% 
43.
 
44.
 
45.
:: 	Namenskonvention der Druckernamen 
46.
	set DefineDruckerName=ICFDrucker 
47.
 
48.
::	Excelliste (.csv) als Inputinformationen fuer dieses Installationsscript 
49.
	set InputListe="%scriptdir%rt.csv" 
50.
	set InputListeLocal="%scriptdir%rt_local.csv" 
51.
	set InputListeRemote="%scriptdir%rt_Remote.csv" 
52.
 
53.
 
54.
:: ====================================================================== 
55.
:: 
56.
:: M A I N 
57.
:: 
58.
:: ====================================================================== 
59.
 
60.
::	Pruefen, ob Verzeichnis existiert, wenn nicht anlegen 
61.
	if not exist %LogPath% call :CREATE_LOG_PATH 
62.
 
63.
::	Wenn bereits ein .LOG existiert, kopieren auf .OLD  
64.
	if exist %ScriptLog% copy /Y %ScriptLog% %ScriptLogOld% >NUL 
65.
 
66.
::	Startline in Logfile schreiben 
67.
	echo\ > %ScriptLog% 
68.
	call :WRITELOG %LINE% 
69.
	call :WRITELOG "Start %sTitle% on Node %ComputerName%" 
70.
	call :WRITELOG %LINE% 
71.
 
72.
::	Pruefen, ob das Schreiben der Log-Datei erfolgreich war 
73.
	if not exist %ScriptLog% goto FEHLER_LOGFILE 
74.
 
75.
:: ---------------------------------------------------------------------- 
76.
:CHECK_OS 
77.
:: ---------------------------------------------------------------------- 
78.
 
79.
	If defined Tst echo %TstInfoMsg% CHECK_OS 
80.
 
81.
::	Pruefen auf korrektes Betriebssystem (Microsoft Windows XP Professional) 
82.
::	wmic path win32_operatingsystem get caption 
83.
	wmic path win32_operatingsystem get caption|FINDSTR /c:"XP Professional" >NUL && goto :XP_OK >NUL 
84.
 
85.
::	Client ist kein Windows XP-Rechner 
86.
	goto :FEHLER_OS 
87.
 
88.
:: ---------------------------------------------------------------------- 
89.
:XP_OK 
90.
:: ---------------------------------------------------------------------- 
91.
 
92.
	If defined Tst echo %TstInfoMsg% XP_OK 
93.
 
94.
::	Client ist Windows XP-Rechner 
95.
::	Info Betriebssystem ins Logfile eintragen 
96.
	For /F "Delims=" %%j in ('ver') do call :WRITELOG "Betriebssystem: %%j" 
97.
 
98.
:: ---------------------------------------------------------------------- 
99.
:CHECK_INSTALL_FOLDER 
100.
:: ---------------------------------------------------------------------- 
101.
 
102.
	If defined Tst echo %TstInfoMsg% CHECK_INSTALL_FOLDER 
103.
 
104.
::	Pruefen ob die notwendigen Installationsverzeichnisse/Dateien vorhanden sind 
105.
	set OK=True 
106.
	if not exist %InputListe% ( 
107.
::		      InputListe war in Anfuehrungszeichen 
108.
		call :WRITELOG "ERROR: Inputdatei (lokal) '%InputListe%' nicht vorhanden!" 
109.
		>> %ScriptLog% dir %scriptdir% 
110.
		set OK= 
111.
112.
	if not defined OK goto :FEHLER_SOURCEFILES 
113.
 
114.
:: ---------------------------------------------------------------------- 
115.
:WRITE_INFO_TO_LOG 
116.
:: ---------------------------------------------------------------------- 
117.
 
118.
::	Info ueber die Lokation der Input-Dateien ins Logfile eintragen 
119.
	call :WRITELOG "Druckerinstallation: %TmpModellDrucker%" 
120.
	call :WRITELOG "Ausfuehrung des Skripts in: %scriptdir%" 
121.
	call :WRITELOG %LINE% 
122.
 
123.
:: ---------------------------------------------------------------------- 
124.
:READ_NW_INFO_CLIENT 
125.
:: ---------------------------------------------------------------------- 
126.
 
127.
	If defined Tst echo %TstInfoMsg% READ_NW_INFO_CLIENT 
128.
 
129.
::	IP-Adresse des Clients auslesen,  
130.
::  	IP-Adressen der zu installierenden Drucker aus Excelliste  
131.
::	auslesen und fuer Nutzung zusammensetzen 
132.
 
133.
:: ---------------------------------------------------------------------- 
134.
:READ_IP_CLIENT 
135.
:: ---------------------------------------------------------------------- 
136.
 
137.
	If defined Tst echo %TstInfoMsg% READ_IP_CLIENT 
138.
 
139.
:: 	IP des Clients auslesen 
140.
	for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do ( 
141.
		::IP des Clients zerlegen in %%a.%%b.%%c = Netzanteil = %CI13% und %%d = Hostanteil = %CI4% (diese Variable steht fuer: 4. Stelle der Client-IP) 
142.
		for /f "tokens=1-4 delims=. " %%a in ("%%i") do set "CI13=%%a.%%b.%%c" & set "CI4=%%d" 
143.
144.
 
145.
:: ---------------------------------------------------------------------- 
146.
:READ_SUBNET_CLIENT 
147.
:: ---------------------------------------------------------------------- 
148.
 
149.
	If defined Tst echo %TstInfoMsg% READ_SUBNET_CLIENT 
150.
 
151.
:: 	Subnet Mask des Clients auslesen 
152.
	for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR /i "mask"') do ( 
153.
		::Subnet Mask des Clients zerlegen in %%a.%%b.%%c (255.255.255 wird vorausgesetzt) sowie Anteil %%d  
154.
		for /f "tokens=1-4 delims=. " %%a in ("%%i") do set "S13=%%a.%%b.%%c" & set "S4=%%d" 
155.
156.
 
157.
:: ---------------------------------------------------------------------- 
158.
:CALCULATE_SUBNET 
159.
:: ---------------------------------------------------------------------- 
160.
 
161.
	If defined Tst echo %TstInfoMsg% CALCULATE_SUBNET 
162.
 
163.
:: 	Faktor fuer Subnet-Berechnung = Anzahl der moeglichen Adressen je Subnetz 
164.
	set /a SNF=256-%S4% 
165.
:: 	Subnet-Index des Clients berechnen 
166.
	set /a CSNI=%CI4%/%SNF% 
167.
 
168.
:: 	Pruefwert ob eine zu installierende IP-Adresse in der Inputliste vorhanden ist. 
169.
	set ChkInputIP=True 
170.
 
171.
:: ---------------------------------------------------------------------- 
172.
:READ_NW_INFO_PRINTER 
173.
:: ---------------------------------------------------------------------- 
174.
 
175.
	If defined Tst echo %TstInfoMsg% READ_NW_INFO_PRINTER 
176.
 
177.
:: 	Drucker-Datensatz aus der Excelliste auslesen - zumindest Netzanteil (Teile 1 bis 3 der IP-Adresse) muss uebereinstimmen 
178.
::	* Inputliste: 
179.
::	* Spalte  9 = IP-Adr. des Druckers 
180.
::	* Spalte 10 = SubnetMask des Druckers 
181.
::	* Spalte 13 = Druckername 
182.
:: 	InputListe2 war zuvor InputListe und in Anfuehrungszeichen gesetzt 
183.
	set "InputListe2=%InputListe%" 
184.
	for /f "tokens=9-13 delims=;" %%m in ('findstr /c:"%CI13%." %InputListe2%') do ( 
185.
		:: Drucker installieren - bis zu 4 Adressen uebergeben 
186.
		echo Installiere mit Daten: %%m %%n %%o %%p %%q >NUL 
187.
		set ChkInputIP= 
188.
	 	call :PROCESSLINE "%%m %%n %%o %%p %%q" 
189.
190.
 
191.
	if defined ChkInputIP call :WRITELOG "*** Keine zu installierende IP-Adresse in der Liste gefunden. ***" 
192.
 
193.
:: ---------------------------------------------------------------------- 
194.
:CLEANING_OUT 
195.
:: ---------------------------------------------------------------------- 
196.
 
197.
	If defined Tst echo %TstInfoMsg% CLEANING_OUT 
198.
 
199.
REM	call :CLEANUP 
200.
REM	*** Unterprogramm CLEANUP derzeit disabled 
201.
REM	*** Alle verwendetet Dateien bleiben auf dem Client 
202.
	goto ENDE 
203.
 
204.
:: ---------------------------------------------------------------------- 
205.
:PROCESSLINE 
206.
:: ---------------------------------------------------------------------- 
207.
 
208.
	If defined Tst echo %TstInfoMsg% PROCESSLINE 
209.
 
210.
	echo Unterprogramm: Installiere mit Daten %~1 >NUL 
211.
 
212.
:: 	so viele Drucker installieren, wie Adressen vorhanden 
213.
 
214.
	for %%i in (%~1) do ( 
215.
		echo Bearbeite IP %%i >NUL 
216.
		::Werte fuer Installation festlegen 
217.
		set "ipadr=%%i"  
218.
		set "IPPortName=IP_%%i" 
219.
		set "DruckerName=%%q" 
220.
	 
221.
		::Adresse in IP-Range (Stellen 1-3 der Client-IP in Drucker-IP enthalten)? 
222.
		echo %%i|findstr /c:"%CI13%." >NUL && ( 
223.
		 
224.
			::Pruefen auf selbes Subnet 
225.
			set "SubnetOK=True" 
226.
			call :CHECK_SUBNET_PRINTER "%%i" 
227.
			 
228.
			::Wenn Drucker im selben Subnet wie Client, weiter pruefen ... 
229.
			if defined SubnetOK ( 
230.
				REM Schalter setzen 
231.
				REM Schalter-Variable - diese wird zunaechst gesetzt, und,  
232.
				REM wenn im Unterprogramm die IP gefunden wird, geloescht.  
233.
				REM Nach Rueckkehr ins Hauptprogramm ist dann am Zustand der  
234.
				REM Variablen  "defined"  oder  "not defined"  das Ergebnis  
235.
				REM der Ueberpruefung abzulesen. 
236.
				set "InstDR=True" 
237.
				call :CHECK_PRINTER 
238.
	 
239.
				set "InstIP=True" 
240.
				call :CHECK_IP_PORT 
241.
 
242.
				:: nur bei noch gesetztem Schalter installieren 
243.
				if defined InstIP call :INSTALLATION 
244.
				if defined InstDR call :INSTALLATION_PRINTER 
245.
				 
246.
			) else ( 
247.
				echo %date% %time% - Drucker-IP %%i nicht im selben Subnet wie Client-IP %CI13%.%CI4% >> %ScriptLog% 
248.
249.
250.
251.
	goto :eof 
252.
 
253.
:: ---------------------------------------------------------------------- 
254.
:CHECK_SUBNET_PRINTER 
255.
:: ---------------------------------------------------------------------- 
256.
 
257.
	If defined Tst echo %TstInfoMsg% CHECK_SUBNET_PRINTER 
258.
 
259.
::	Hostanteil Drucker-IP ermitteln 
260.
	for /f "tokens=4 delims=." %%a in (%1) do set PI4=%%a 
261.
 
262.
::	Subnet-Index Drucker berechnen 
263.
	set /a PSNI=%PI4%/%SNF% 
264.
 
265.
::	Subnet-Indizes Drucker und Client vergleichen; wenn ungleich, Schalter loeschen 
266.
	if %PSNI% neq %CSNI% set SubnetOK= 
267.
	goto :eof 
268.
 
269.
:: ---------------------------------------------------------------------- 
270.
:CHECK_IP_PORT 
271.
:: ---------------------------------------------------------------------- 
272.
 
273.
	If defined Tst echo %TstInfoMsg% CHECK_IP_PORT 
274.
 
275.
::  	Pruefen, ob der Standard TCP/IP-Port bereits existiert  
276.
::     	und in der Registry eingetragen ist. 
277.
::     	Wenn dem so ist, ist das Scripts bereits auf diesem Client gelaufen  
278.
::	und kann beendet werden. 
279.
 
280.
::	ERRORLEVEL=0 Standard TCP/IP-Port existiert in der Registry 
281.
::	ERRORLEVEL=1 Standard TCP/IP-Port existiert nicht in der Registry 
282.
 
283.
	call :WRITELOG %LINE% 
284.
	call :WRITELOG "Pruefen, ob der Standard TCP/IP-Port %IPPortName% bereits existiert..." 
285.
	call :WRITELOG "CMD: REG QUERY HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName% /v IPAddress" 
286.
 
287.
::	Falls die IP in der Registry gefunden wird, InstIP-Schalter loeschen 
288.
	REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%">NUL && set InstIP= 
289.
 
290.
	if not defined InstIP ( 
291.
		call :WRITELOG "Standard TCP/IP-Port %IPPortName% bereits eingetragen" 
292.
		goto :eof 
293.
	) else ( 
294.
		call :WRITELOG "Standard TCP/IP-Port %IPPortName% noch nicht vorhanden" 
295.
296.
		call :WRITELOG %LINE% 
297.
	goto :eof 
298.
 
299.
:: ---------------------------------------------------------------------- 
300.
:CHECK_PRINTER 
301.
:: ---------------------------------------------------------------------- 
302.
 
303.
	If defined Tst echo %TstInfoMsg% CHECK_PRINTER 
304.
 
305.
::  	Pruefen, ob der Drucker bereits installiert ist. 
306.
::     	Wenn dem so ist, ist das Scripts bereits auf diesem Client gelaufen.  
307.
:: 	Schalter-Variable: InstDr  
308.
 
309.
	for /f "tokens=1 delims=:" %%x in ('wmic printer get DeviceID^|FINDSTR "%DruckerName%"') do ( 
310.
			echo  Druckername aus DeviceID: %%x|findstr /c:"%DruckerName%" >NUL && ( 
311.
			call :WRITELOG %LINE% 
312.
			call :WRITELOG "Pruefen, ob der Drucker bereits existiert..." 
313.
			call :WRITELOG "Status InstDr: %InstDr%  Drucker: %DruckerName% existiert." 
314.
			set InstDr= 
315.
316.
317.
	goto :eof 
318.
 
319.
:: ---------------------------------------------------------------------- 
320.
:INSTALLATION 
321.
:: ---------------------------------------------------------------------- 
322.
 
323.
	If defined Tst echo %TstInfoMsg% INSTALLATION 
324.
 
325.
::	Installation/Konfiguration Standard-TCPIP-Port am Client 
326.
 
327.
	call :CREATE_TCPIP_PORT 
328.
	call :STOP_START_SPOOLER 
329.
	goto :eof 
330.
 
331.
:: ---------------------------------------------------------------------- 
332.
:INSTALLATION_PRINTER 
333.
:: ---------------------------------------------------------------------- 
334.
 
335.
	If defined Tst echo %TstInfoMsg% INSTALLATION_PRINTER 
336.
 
337.
::	Installation/Konfiguration des Druckers 
338.
 
339.
	call :ADD_LOGICAL_PRINTER   
340.
	call :SETTING_PRINTER 
341.
	If defined TstPrnt call :PRINT_TESTPAGE 
342.
	goto :eof 
343.
 
344.
 
345.
:: ====================================================================== 
346.
:: 
347.
:: S U B R O U T I N E S  /  E R R O R H A N D L I N G  
348.
:: 
349.
:: ====================================================================== 
350.
 
351.
:: ---------------------------------------------------------------------- 
352.
:CREATE_TCPIP_PORT 
353.
:: ---------------------------------------------------------------------- 
354.
 
355.
	If defined Tst echo %TstInfoMsg% CREATE_TCPIP_PORT 
356.
 
357.
::  	Standard TCP/IP-Port in die Registry eintragen  
358.
 
359.
	call :WRITELOG "Standard TCP/IP-Port %IPPortName% in die Registry eintragen..." 
360.
 
361.
	call :WRITELOG "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" 
362.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" >> %ScriptLog% 
363.
 
364.
	call :WRITELOG "REG ADD  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName% /v Protocol /t REG_DWORD /d 00000001" 
365.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v Protocol /t REG_DWORD /d 00000001 >> %ScriptLog% 
366.
 
367.
	call :WRITELOG "REG ADD  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName% /v Version /t REG_DWORD /d 00000001" 
368.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v Version /t REG_DWORD /d 00000001 >> %ScriptLog% 
369.
 
370.
	call :WRITELOG "REG ADD  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName% /v HostName /t REG_SZ /d " 
371.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v HostName /t REG_SZ /d "" >> %ScriptLog% 
372.
 
373.
	call :WRITELOG "REG ADD  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName% /v IPAddress /t REG_SZ /d %ipadr%" 
374.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v IPAddress /t REG_SZ /d %ipadr% >> %ScriptLog% 
375.
 
376.
	call :WRITELOG "REG ADD  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName% /v HWAddress /t REG_SZ /d " 
377.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v HWAddress /t REG_SZ /d "" >> %ScriptLog% 
378.
 
379.
	call :WRITELOG "REG ADD  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName% /v PortNumber /t REG_DWORD /d 9100" 
380.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v PortNumber /t REG_DWORD /d 9100 >> %ScriptLog% 
381.
 
382.
	call :WRITELOG "REG ADD  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName% /v SNMP Community /t REG_SZ /d public" 
383.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v "SNMP Community" /t REG_SZ /d "public" >> %ScriptLog% 
384.
 
385.
	call :WRITELOG "REG ADD  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName% /v SNMP Enabled /t REG_DWORD /d 00000001" 
386.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v "SNMP Enabled" /t REG_DWORD /d 00000001 >> %ScriptLog% 
387.
 
388.
	call :WRITELOG "REG ADD  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName% /v SNMP Index /t REG_DWORD /d 00000001" 
389.
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v "SNMP Index" /t REG_DWORD /d 00000001 >> %ScriptLog% 
390.
 
391.
	echo\ >> %ScriptLog% 
392.
	goto :eof 
393.
 
394.
 
395.
:: ---------------------------------------------------------------------- 
396.
:STOP_START_SPOOLER 
397.
:: ---------------------------------------------------------------------- 
398.
 
399.
	If defined Tst echo %TstInfoMsg% STOP_START_SPOOLER 
400.
 
401.
:: 	Druckerwarteschlange anhalten/starten 
402.
 
403.
	call :WRITELOG "Druckerwarteschlange anhalten..." 
404.
	call :WRITELOG "CMD: net stop spooler" 
405.
	net stop spooler >> %ScriptLog% 
406.
	if %errorlevel% == 2 call :WRITELOG "Druckerwarteschlange bereits gestoppt" 
407.
	call :WRITELOG "Druckerwarteschlange starten..." 
408.
	call :WRITELOG "CMD: net start spooler" 
409.
	net start spooler >> %ScriptLog% 
410.
	goto :eof 
411.
 
412.
 
413.
:: ---------------------------------------------------------------------- 
414.
:ADD_LOGICAL_PRINTER 
415.
:: ---------------------------------------------------------------------- 
416.
 
417.
	If defined Tst echo %TstInfoMsg% ADD_LOGICAL_PRINTER 
418.
 
419.
::  	Logischen Drucker einrichten 
420.
 
421.
:: 	Syntax rundll32 printui.dll,PrintUIEntry 
422.
:: 	/if		Installiert Drucker mit Hilfe der angegebenen INF-Datei 
423.
:: 	/b[Name]	Basisdruckername wie er unter "Drucker und Faxgeraete" angezeigt wird 
424.
:: 	/f[Datei]	Dateiname+Pfad der INF-datei 
425.
:: 	/r[Anschluss]	Anschlussname (Standard TCP/IP-Port) 
426.
:: 	/m[Modell]  	Modellname des Druckertreibers    
427.
:: 	/q 		Stiller Modus, Fehlermeldungen werden nicht angezeigt 
428.
 
429.
	call :WRITELOG "Logischen Drucker %DruckerName% einrichten..." 
430.
	call :WRITELOG "CMD: rundll32 printui.dll,PrintUIEntry /if /b %DruckerName% /f %TmpINFfile% /r %IPPortName% /m %TmpModellDruckerTreiber% /q" 
431.
	rundll32 printui.dll,PrintUIEntry /if /b %DruckerName% /f %INFfile% /r"%IPPortName%" /m %ModellDruckerTreiber% /q 
432.
	goto :eof 
433.
 
434.
 
435.
:: ---------------------------------------------------------------------- 
436.
:SETTING_PRINTER 
437.
:: ---------------------------------------------------------------------- 
438.
 
439.
	If defined Tst echo %TstInfoMsg% SETTING_PRINTER 
440.
 
441.
::  	Druckereinstellungen einrichten 
442.
 
443.
:: 	Syntax rundll32 printui.dll,PrintUIEntry 
444.
:: 	/Xs		Richtet die Druckereinstellungen ein 
445.
:: 	/n[Name]  	Druckername (wie er unter "Drucker und Faxgeraete" angezeigt wird)    
446.
:: 	/q 		Stiller Modus, Fehlermeldungen werden nicht angezeigt 
447.
 
448.
	call :WRITELOG "Druckereinstellungen fuer %DruckerName% einrichten (Kommentar)..." 
449.
	call :WRITELOG "CMD: rundll32 printui.dll,PrintUIEntry /q /Xs /n %DruckerName% Comment Created by ICFND_AddPrntr.CMD" 
450.
	rundll32 printui.dll,PrintUIEntry /q /Xs /n %DruckerName% Comment "Created by ICFND_AddPrntr.CMD" 
451.
	goto :eof 
452.
 
453.
 
454.
:: ---------------------------------------------------------------------- 
455.
:PRINT_TESTPAGE 
456.
:: ---------------------------------------------------------------------- 
457.
 
458.
	If defined Tst echo %TstInfoMsg% PRINT_TESTPAGE 
459.
 
460.
:: 	Testseite ausdrucken / NUR FUER TESTZWECKE !! 
461.
 
462.
:: 	Syntax rundll32 printui.dll,PrintUIEntry 
463.
:: 	/n[Name]  	Druckername (wie er unter "Drucker und Faxgeraete" angezeigt wird)    
464.
:: 	/k 		Druckt eine Testseite auf dem angegebenen Drucker aus 
465.
 
466.
	call :WRITELOG "Testseite auf %DruckerName% ausdrucken..." 
467.
	call :WRITELOG "CMD: rundll32 printui.dll,PrintUIEntry /n %DruckerName% /k" 
468.
	rundll32 printui.dll,PrintUIEntry /n %DruckerName% /k 
469.
	echo\ >> %ScriptLog% 
470.
	call :WRITELOG %LINE% 
471.
	goto :eof 
472.
 
473.
 
474.
:: ---------------------------------------------------------------------- 
475.
:CREATE_LOG_PATH 
476.
:: ---------------------------------------------------------------------- 
477.
 
478.
	If defined Tst echo %TstInfoMsg% CREATE_LOG_PATH 
479.
 
480.
::	Verzeichnis %LogPath% existiert nicht, 
481.
::	Verzeichnis %LogPath% wird angelegt... 
482.
	md %LogPath%  
483.
	goto :eof 
484.
 
485.
	 
486.
:: ---------------------------------------------------------------------- 
487.
:CLEANUP 
488.
:: ---------------------------------------------------------------------- 
489.
 
490.
	If defined Tst echo %TstInfoMsg% CLEANUP 
491.
 
492.
::  	Aufraeumen von nicht mehr benoetigten Dateien 
493.
::	Diese Funktionalitaet wurde am 16.05.2008 nach Ruecksprache  
494.
::	mit der Paketierung bis auf Weiteres deaktiviert.  
495.
 
496.
	call :WRITELOG %LINE% 
497.
	call :WRITELOG "Loeschen nicht mehr benoetigter Dateien..." 
498.
::	call :WRITELOG "Loesche Verzeichnis %INFdir_PCL6%" 
499.
::	rd /S /Q "%INFdir_PCL6%" >> %ScriptLog% 
500.
::	Druckersprache PS Wird derzeit nicht genutzt: 
501.
::	call :WRITELOG "Loesche Verzeichnis %INFdir_PS%" 
502.
::	rd /S /Q "%INFdir_PS%" >> %ScriptLog% 
503.
::	call :WRITELOG "Loesche Inputliste %InputListe%" 
504.
::	del "%InputListe%" >> %ScriptLog% 
505.
::	call :WRITELOG "Loesche Script %scriptdir%%sTitle%" 
506.
::	Das eigentliche Script wird erst am Ende der Prozedur geloescht! 
507.
::	Siehe Abschnitt ENDE_AUSGANG 
508.
	goto :eof 
509.
 
510.
:: ---------------------------------------------------------------------- 
511.
:WRITELOG 
512.
:: ---------------------------------------------------------------------- 
513.
 
514.
::	Schreiben von Logmeldungen 
515.
	>> %ScriptLog% echo %date% %time% - %~1 
516.
	goto :eof 
517.
 
518.
:: ---------------------------------------------------------------------- 
519.
:: *** Fehler-Ausgaenge des Scripts 
520.
:: ---------------------------------------------------------------------- 
521.
 
522.
:FEHLER_LOGFILE 
523.
::	Logfile kann nicht angelegt werden 
524.
	call :WRITELOG "Errorlevel : %errorlevel%" 
525.
	call :WRITELOG "ERROR: Fehler beim Anlegen der Log-Datei %ScriptLog% !" 
526.
	call :WRITELOG "ERROR: %sTitle% kann nicht fortgesetzt werden." 
527.
	echo ERROR: Fehler beim Anlegen der Log-Datei %ScriptLog% !	 
528.
	echo ERROR: %sTitle% kann nicht fortgesetzt werden. 
529.
	goto ENDE_AUSGANG 
530.
 
531.
:FEHLER_SOURCEFILES 
532.
::	Inputdateien fuer das Skript fehlen 
533.
	call :WRITELOG "Errorlevel : %errorlevel%" 
534.
	call :WRITELOG "ERROR: Fehlende Input-Dateien ("%INFfile%" oder '%InputListe%') !" 
535.
	call :WRITELOG "ERROR: %sTitle% kann nicht fortgesetzt werden." 
536.
	>> %ScriptLog% dir %scriptdir% 
537.
	goto ENDE 
538.
 
539.
:FEHLER_OS 
540.
::	Client ist kein XP-Rechner 
541.
	call :WRITELOG "ERROR: Auf diesem System laeuft nicht das Betriebssystem Microsoft Windows XP Professional" 
542.
	For /F "Delims=" %%j in ('ver') do call :WRITELOG "Betriebssystem: %%j" 
543.
	call :WRITELOG "ERROR: %sTitle% kann nicht fortgesetzt werden." 
544.
	goto :ENDE 
545.
 
546.
:: ---------------------------------------------------------------------- 
547.
:ENDE 
548.
:: ---------------------------------------------------------------------- 
549.
 
550.
	If defined Tst echo %TstInfoMsg% ENDE 
551.
 
552.
::	Bottomline in Logfile schreiben 
553.
	call :WRITELOG %LINE% 
554.
	call :WRITELOG "Ende %sTitle% on Node %ComputerName%" 
555.
	call :WRITELOG %LINE% 
556.
 
557.
:: ---------------------------------------------------------------------- 
558.
:ENDE_AUSGANG 
559.
:: ---------------------------------------------------------------------- 
560.
 
561.
	If defined Tst echo %TstInfoMsg% ENDE_AUSGANG 
562.
	If defined Tst PAUSE
Der Inhalt meiner Inputliste (rt.csv) sieht wie folgt aus: (Ich habe die mehrer hunderte Einträge rausgelöscht und nur den Problemfall dringelassen):

01.
  
02.
FILIALID;FILIALOZ;FILIALSCHLUESSEL;PLZ;ORT;STRASSE;ANZAHL;IPSWITCH;TERMIN_IPSWITCH;IPADRESSE;SUBNETZMASKE;IP_ROUTER;DOSENNUMMER;Druckername;STATUS_DOSE;STATUS_LANCONNECT;SYSTEMID;KOMPONENTEN_ID;SERIENNUMMER;STATUS_DRUCKER;TERMIN_ROLLOUT;HWPROFIL;SYSTEMROLLE;BEMERKUNG;URSPRUNGSDATEI;FEHLER 
03.
... 
04.
40077:32;8,2066E+11;4007732;12345;Berlin;Am Wilden Kaiser 29;2;;;10.179.169.44;255.255.255.224;10.179.169.62;;ABCDrucker1;;;D-001093;132158;0;RO-Planung;29.09.2008;XP0;NWK 
05.
40077:32;8,2066E+11;4007732;12345;Berlin;Am Wilden Kaiser 29;2;;;10.179.169.46;255.255.255.224;10.179.169.62;;ABCDrucker2;;;D-001094;132159;0;RO-Planung;29.09.2008;XP0;NWK 
06.
... 
07.
07:41;8,40453E+11;741;96047;Bamberg;Heinstr. 1;2;n;;160.58.187.98;255.255.255.240;160.58.187.96;;ICFDrucker1;;;D-001311;132376;S2086505698;Betrieb;18.09.2008;XP0;NWK 
08.
07:41;8,40453E+11;741;96047;Bamberg;Heinstr. 1;2;n;;160.58.187.99;255.255.255.240;160.58.187.96;;ICFDrucker2;;;D-001312;132377;S2086505678;Betrieb;18.09.2008;XP0;NWK 
09.
...
Die Datei wurde mit Excel erstellt und als csv-Datei abgespeichert.


Ich bitte Euch um Eure Hilfe!
Danke
Flauschbobbel
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
SAN, NAS, DAS
gelöst QNAP TS-453U - drei IP-Adressen für iSCSI , SMB , Management (2)

Frage von caspi-pirna zum Thema SAN, NAS, DAS ...

SAN, NAS, DAS
QNAP Installationsproblem wenn der Client mehre statische IP-Adressen hat (6)

Erfahrungsbericht von StefanKittel zum Thema SAN, NAS, DAS ...

Sicherheit
Mirai-Botnetz: Dyn bestätigt Angriff von zig-Millionen IP-Adressen

Link von runasservice zum Thema Sicherheit ...

Ubuntu
gelöst Amavis Whitelist IP-Adressen

Frage von runasservice zum Thema Ubuntu ...

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 ...

Windows Tools
gelöst Aussendienst Datensynchronisierung (12)

Frage von lighningcrow zum Thema Windows Tools ...