flauschbobbel
Goto Top

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

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

Content-Key: 86044

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

Printed on: April 19, 2024 at 23:04 o'clock

Member: bastla
bastla Apr 21, 2008 at 19:13:22 (UTC)
Goto Top
Hallo Flauschbobbel!

Für erste Tests unter den einfachsten Voraussetzungen (nur eine IP-Adresse, Maske 255.255.255.0) etwa so:
@echo off & setlocal
set "Liste=D:\Druckerliste.csv"  

::IP auslesen
for /f "tokens=2 delims=:" %%i in ('ipconfig^|findstr "IP-Ad"') do (  
	::IP zerlegen in %%a.%%b.%%c.%%d
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do (  
		::Drucker auslesen
		for /f "tokens=1-8 delims=;" %%m in ('findstr "%%a.%%b.%%c." "%Liste%"') do (  
			::Drucker installieren
			echo Installiere mit Daten: %%m %%n %%o %%p %%q %%r %%s %%t
		)
	)
)
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
Member: Flauschbobbel
Flauschbobbel Apr 22, 2008 at 16:57:00 (UTC)
Goto Top
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:

@echo off
set "InputListe=D:\users\local\scripts\RO_TEST.csv"  

::IP auslesen
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do (  
                ::IP zerlegen in %%a.%%b.%%c.%%d
                for /f "tokens=1-4 delims=. " %%a in ("%%i") do (  
 		::drucker auslesen
 		for /f "tokens=10-14 delims=;" %%m in ('findstr "%%a.%%b.%%c." "%InputListe%"') do (  
 			:: Drucker installieren
 			echo Installiere mit Daten %%m %%n %%o %%p
 			call :DruckerInstall
 		)
 	)
)

goto ende

:DruckerInstall
echo Unterprogramm: Installiere mit Daten %%m %%n %%o %%p %%q %%r %%s %%t
:: Drucker installieren
set ipadr1=%%m
echo IP1:%ipadr1%
echo %%m
set "ipadr2=%%n"  
echo IP2:%ipadr2%
echo %%n
set "ipadr3=%%o"  
echo IP3:%ipadr3%
echo %%o
set "ipadr4=%%p"  
echo IP4:%ipadr4%
echo %%p
echo Installiere mit Daten %%m %%n %%o %%p
echo schluss unterprogramm
goto :eof

goto irgendwohin
echo test
pause

:irgendwohin
echo.
:ende
echo totales ende

set ipadr1=
set ipadr2=
set ipadr3=
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.

@echo off
:: Beispiel
set IPPortName=IP_192.168.1.255
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName% >>NUL  
echo %errorlevel%

Danke und viele Grüße,
Flauschbobbel
Member: bastla
bastla Apr 22, 2008 at 18:39:30 (UTC)
Goto Top
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:
@echo off
set "InputListe=D:\users\local\scripts\RO_TEST.csv"  

::IP auslesen
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do (  
	::IP zerlegen in %%a.%%b.%%c.%%d
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do (  
		::drucker auslesen
		for /f "tokens=10-14 delims=;" %%m in ('findstr "%%a.%%b.%%c." "%InputListe%"') do (  
			:: Drucker installieren
			echo Installiere mit Daten %%m %%n %%o %%p
			call :DruckerInstall "%%m %%n %%o %%p"  
 		)
 	)
)

goto ende

:DruckerInstall
echo Unterprogramm: Installiere mit Daten %~1
:: so viele Drucker installieren, wie Adressen vorhanden
for %%i in (%~1) do (
	echo Installiere IP: %%i
)
echo schluss unterprogramm
goto :eof

:ende
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:
if "%1" neq "" set ipadr1=%1  
if "%2" neq "" set ipadr2=%2  
...
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):
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
Member: Flauschbobbel
Flauschbobbel Apr 22, 2008 at 19:05:23 (UTC)
Goto Top
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
Member: bastla
bastla Apr 22, 2008 at 19:16:21 (UTC)
Goto Top
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:
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
Member: Flauschbobbel
Flauschbobbel Apr 22, 2008 at 19:27:27 (UTC)
Goto Top
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
Member: Flauschbobbel
Flauschbobbel Apr 23, 2008 at 18:07:45 (UTC)
Goto Top
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

@echo off

set "InputListe=D:\users\local\scripts\RO_TEST.csv"  

::IP auslesen
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do (  
	::IP zerlegen in %%a.%%b.%%c.%%d
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do (  
		::Drucker auslesen
		for /f "tokens=10-14 delims=;" %%m in ('findstr "%%a.%%b.%%c." "%InputListe%"') do (  
			:: Drucker installieren
			echo Installiere mit Daten %%m %%n %%o %%p >>NUL
			call :ProcessLine "%%m %%n %%o %%p"  
		)
	)
)

goto ende

:ProcessLine
echo Unterprogramm: Installiere mit Daten %~1
:: so viele Drucker installieren, wie Adressen vorhanden
for %%i in (%~1) do (
	echo Installiere IP %%i

	set ipadr=
	set IPPortName=

	set "ipadr=%%i"   
	set "IPPortName=IP_%%i"  

:: BEI DIESEM ECHO IST DIE VARIABLE LEER
	echo %ipadr%
	echo %IPPortName%

	call :Check_IP
	call :Installiere
)
echo schluss unterprogramm
goto :eof

goto ende

:Check_IP
	echo check IP...
:: BEI DIESEM ECHO SIND DIE VARIABLEN RICHTIG GESETZT. Warum??
	echo %ipadr%
	echo %IPPortName%

	REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%" >>NUL  
	if %errorlevel%==0 (
		echo %errorlevel%
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% bereits eingetragen 	
	 	echo %date% %time% - %LINE%							
 		goto :eof
	) else (
	 	echo %errorlevel%
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden 
	)

	echo. 										
	goto :eof


:Installiere
	echo installiere...
:: BEI DIESEM ECHO SIND DIE VARIABLEN RICHTIG GESETZT. Warum??
	echo %ipadr%
	echo %IPPortName%
	goto :eof

:ende
echo totales ende
	set ipadr=
	set IPPortName=
Member: bastla
bastla Apr 23, 2008 at 19:54:27 (UTC)
Goto Top
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:
@echo off & setlocal enabledelayedexpansion
for %%i in (Ohne Rufzeichen! ausgegeben.) do (
        set "Text=%%i"  
        echo !Text!
)

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:
set "Inst=True"  
call :Check_IP
if defined Inst call :Installiere
...

:Check_IP
...
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%">NUL && set Inst=  
...
goto :eof


Etwas reduziert könnte der Batch dann bis hierher so aussehen:
@echo off & setlocal
set "InputListe=D:\users\local\scripts\RO_TEST.csv"  

::IP auslesen
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do (  
	::IP zerlegen in %%a.%%b.%%c.%%d
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do (  
		::Drucker auslesen
		for /f "tokens=10-14 delims=;" %%m in ('findstr "%%a.%%b.%%c." "%InputListe%"') do (  
			:: Drucker installieren
			echo Installiere mit Daten %%m %%n %%o %%p >>NUL
			call :ProcessLine "%%m %%n %%o %%p"  
		)
	)
)

goto :ende

:ProcessLine
echo Unterprogramm: Installiere mit Daten %~1
:: so viele Drucker installieren, wie Adressen vorhanden
for %%i in (%~1) do (
	echo Bearbeite IP: %%i

	set "ipadr=%%i"   
	set "IPPortName=IP_%%i"  
	::Schalter setzen
	set "Inst=True"  
	
	call :Check_IP
	::nur bei noch gesetztem Schalter installieren
	if defined Inst call :Installiere
)
echo schluss unterprogramm
goto :eof

:Check_IP
echo check IP...

::Falls die IP in der Registry gefunden wird, "Inst"-Schalter loeschen  
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%">NUL && set Inst=  
if not defined Inst (
	echo %date% %time% - Standard TCP/IP-Port %IPPortName% bereits eingetragen 	
 	echo %date% %time% - %LINE%							
) else (
	echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden 
)
echo\
goto :eof

:Installiere
echo installiere...

echo %ipadr%
echo %IPPortName%

goto :eof

:ende
echo totales ende

Grüße
bastla
Member: Flauschbobbel
Flauschbobbel Apr 24, 2008 at 14:21:29 (UTC)
Goto Top
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


@echo off & setlocal

set "InputListe=D:\users\local\scripts\RO_TEST.csv"  

::IP auslesen
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do (  
	::IP zerlegen in %%a.%%b.%%c.%%d
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do (  
		::Drucker auslesen
		for /f "tokens=10-14 delims=;" %%m in ('findstr "%%a.%%b.%%c." "%InputListe%"') do (  
			:: Drucker installieren
			echo Installiere mit Daten %%m %%n %%o %%p >>NUL
			call :ProcessLine "%%m %%n %%o %%p"  
		)
	)
)

goto ende

:ProcessLine
echo Unterprogramm: Installiere mit Daten %~1
:: so viele Drucker installieren, wie Adressen vorhanden
for %%i in (%~1) do (
	echo Bearbeite IP %%i

	set "ipadr=%%i"   
	set "IPPortName=IP_%%i"  
	::Schalter setzen
	set "Inst=True"  

	call :Check_IP
	::nur bei noch gesetztem Schalter installieren
	if defined Inst call :Installiere
)
echo schluss unterprogramm
goto :eof

:Check_IP
	echo check IP...

:: Falls die IP in der Registry gefunden wird, "Inst"-Schalter loeschen  
	REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%" >>NUL && set Inst=  

	if not defined Inst (
		echo %errorlevel%
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% bereits eingetragen 	
	 	echo %date% %time% - %LINE%							
 		goto :eof
	) else (
	 	echo %errorlevel%
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden 
	)

	echo\ 										
	goto :eof

:Installiere
echo installiere...
	echo %ipadr%
	echo %IPPortName%
	goto :eof

:ende
Member: Flauschbobbel
Flauschbobbel Apr 27, 2008 at 16:48:28 (UTC)
Goto Top
Hallo Zusammen,

hat jemand eine Idee die mir weiterhelfen könnte?

Danke schon mal im Voraus.
Grüße,
Flauschbobbel
Member: Biber
Biber Apr 27, 2008 at 17:49:01 (UTC)
Goto Top
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
Member: bastla
bastla Apr 27, 2008 at 20:24:50 (UTC)
Goto Top
Hallo Flauschbobbel!

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

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:
@echo off & setlocal
set "InputListe=D:\users\local\scripts\RO_TEST.csv"  

::IP auslesen
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do (  
	::IP zerlegen in %%a.%%b.%%c.%%d
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do (  
		::Drucker auslesen
		for /f "tokens=10-14 delims=;" %%m in ('findstr /C:"%%a.%%b.%%c." "%InputListe%"') do (  
			:: Drucker installieren
			echo Installiere mit Daten %%m %%n %%o %%p >>NUL
			::Zweiter Parameter = Netzanteil der IP-Adresse des aktuellen Rechners 
			call :ProcessLine "%%m %%n %%o %%p" "%%a.%%b.%%c."  
		)
	)
)

goto :ende

:ProcessLine
echo Unterprogramm: Installiere mit Daten %~1
:: so viele Drucker installieren, wie Adressen vorhanden
for %%i in (%~1) do (
	echo Bearbeite IP %%i
	::Adresse in IP-Range?
	echo %%i|findstr /C:%2 >nul && (
		set "ipadr=%%i"   
		set "IPPortName=IP_%%i"  
		::Schalter setzen
		set "Inst=True"  

		call :Check_IP
		::nur bei noch gesetztem Schalter installieren
		if defined Inst call :Installiere
	)
)
echo schluss unterprogramm
goto :eof

:Check_IP
	echo check IP...

:: Falls die IP in der Registry gefunden wird, "Inst"-Schalter loeschen  
	REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%" >NUL && set Inst=  

	if not defined Inst (
		echo %errorlevel%
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% bereits eingetragen 	
	 	echo %date% %time% - %LINE%							
) else (
	 	echo %errorlevel%
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden 
)

	echo\ 										
	goto :eof

:Installiere
echo installiere...
echo %ipadr%
echo %IPPortName%
goto :eof

:ende

Grüße
bastla
Member: Flauschbobbel
Flauschbobbel Apr 28, 2008 at 18:00:49 (UTC)
Goto Top
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?


@echo off & setlocal
set "InputListe=D:\users\local\scripts\RO_TEST.csv"  

::IP auslesen
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do (  
	::IP zerlegen in %%a.%%b.%%c.%%d
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do (  
		::Drucker auslesen
		for /f "tokens=10-14 delims=;" %%m in ('findstr /C:"%%a.%%b.%%c." "%InputListe%"') do (  
			:: Drucker installieren
			echo Installiere mit Daten %%m %%n %%o %%p >>NUL
			::Zweiter Parameter = Netzanteil der IP-Adresse des aktuellen Rechners 
			call :ProcessLine "%%m %%n %%o %%p" "%%a.%%b.%%c."  
		)
	)
)

goto :ende

:ProcessLine
echo Unterprogramm: Installiere mit Daten %~1
:: so viele Drucker installieren, wie Adressen vorhanden
for %%i in (%~1) do (
	echo Bearbeite IP %%i
	::Adresse in IP-Range?
	echo %%i|findstr /C:%2 >nul && (
		set "ipadr=%%i"   
		set "IPPortName=IP_%%i"  
		::Schalter setzen
		set "Inst=True"  

		call :Check_IP
		::nur bei noch gesetztem Schalter installieren
		if defined Inst call :Installiere
	)
)
echo schluss unterprogramm
goto :eof

:Check_IP
	echo check IP...

:: Falls die IP in der Registry gefunden wird, "Inst"-Schalter loeschen  
	REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%" >NUL && set Inst=  

	if not defined Inst (
		echo %errorlevel%
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% bereits eingetragen 	
	 	echo %date% %time% - %LINE%							
) else (
	 	echo %errorlevel%
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden 
)

	echo\ 										
	goto :eof

:Installiere
echo installiere...
echo %ipadr%
echo %IPPortName%
goto :eof

:ende


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?

---- Ausschnitt aus dem Original-Logfile -----
									
28.04.2008 11:10:15,00 - Standard TCP/IP-Port IP_192.168.1.244 in die Registry eintragen... 
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\IP_192.168.1.244" 							  

Der Vorgang wurde erfolgreich ausgeführt.
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 	  

Der Vorgang wurde erfolgreich ausgeführt.
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 	  

Der Vorgang wurde erfolgreich ausgeführt.
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 "" 		  

Der Vorgang wurde erfolgreich ausgeführt.
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 	  

Der Vorgang wurde erfolgreich ausgeführt.
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 "" 		  

Der Vorgang wurde erfolgreich ausgeführt.
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 	  

Der Vorgang wurde erfolgreich ausgeführt.
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"   

Der Vorgang wurde erfolgreich ausgeführt.
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   

Der Vorgang wurde erfolgreich ausgeführt.
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   

Der Vorgang wurde erfolgreich ausgeführt.
28.04.2008 11:10:15,50 - Druckerwarteschlage anhalten... 				
28.04.2008 11:10:15,50 - net stop spooler 							

Druckwarteschlange wurde erfolgreich beendet.

28.04.2008 11:10:15,62 - Druckerwarteschlage starten... 				
28.04.2008 11:10:15,64 - net start spooler 						
Druckwarteschlange wird gestartet.
Druckwarteschlange wurde erfolgreich gestartet.

---- Ende Ausschnitt aus dem Original-Logfile -----



Hier das Skript zu obigem Output:

---- Ausschnitt (der Upnterprogramme) aus dem Original-Skript ----- 
...

:: ----------------------------------------------------------------------
:CREATE_TCPIP_PORT
:: ----------------------------------------------------------------------

::  	Standard TCP/IP-Port in die Registry eintragen 

	echo %date% %time% - Standard TCP/IP-Port %IPPortName% in die Registry eintragen... >> %AddPrntLog%
	echo REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" 							>> %AddPrntLog%  
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" 								>> %AddPrntLog%  
	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%  
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v Protocol /t REG_DWORD /d 00000001 			>> %AddPrntLog%  
	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%  
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v Version /t REG_DWORD /d 00000001 			>> %AddPrntLog%  
	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%  
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v HostName /t REG_SZ /d "" 				>> %AddPrntLog%  
	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%  
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v IPAddress /t REG_SZ /d %ipadr% 				>> %AddPrntLog%  
	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%  
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v HWAddress /t REG_SZ /d "" 				>> %AddPrntLog%  
	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%  
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v PortNumber /t REG_DWORD /d 9100 			>> %AddPrntLog%  
	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%  
	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%  
	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%  
	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%  
	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%  
	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%  
	goto :eof

:: ----------------------------------------------------------------------
:STOP_START_SPOOLER
:: ----------------------------------------------------------------------

:: 	Druckerwarteschlange anhalten/starten

	echo %date% %time% - Druckerwarteschlage anhalten... 				>> %AddPrntLog%
	echo %date% %time% - net stop spooler 						>> %AddPrntLog%	
	net stop spooler 								>> %AddPrntLog%
	if %errorlevel% == 2 echo Druckerwarteschlange bereits gestoppt 		>> %AddPrntLog%
	echo %date% %time% - Druckerwarteschlage starten... 				>> %AddPrntLog%
	echo %date% %time% - net start spooler 						>> %AddPrntLog%
	net start spooler 								>> %AddPrntLog%
	goto :eof

...
---- Ende Ausschnitt aus dem Original-Skript -----



Ich hätte gerne die Ausgabe wie folgt:
28.04.2008 11:10:15,00 - Standard TCP/IP-Port IP_192.168.1.244 in die Registry eintragen... 
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" 							  
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt.
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 	  
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt.
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 	  
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt.
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 "" 		  
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt.
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 	  
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt.
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 "" 		  
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt.
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 	  
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt.
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"   
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt.
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   
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt.
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   
28.04.2008 11:10:15,00 - Der Vorgang wurde erfolgreich ausgeführt.
28.04.2008 11:10:15,50 - Druckerwarteschlage anhalten... 				
28.04.2008 11:10:15,50 - net stop spooler 							
28.04.2008 11:10:15,00 - Druckwarteschlange wurde erfolgreich beendet.
28.04.2008 11:10:15,62 - Druckerwarteschlage starten... 				
28.04.2008 11:10:15,64 - net start spooler 						
28.04.2008 11:10:15,00 - Druckwarteschlange wird gestartet.
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?

@echo off
	set scriptdir=%~dp0
::	Prüfen ob die notwendigen Installationsverzeichnisse vorhanden sind
if not exist %scriptdir%\DrvPS\ echo ERROR: Verzeichnis %scriptdir%\DrvPS\ nicht vorhanden!
if not exist %scriptdir%\DrvPCL6\ (
	echo ERROR: Verzeichnis %scriptdir%\DrvPCL6\ nicht vorhanden!
	goto ende
)
:IRGENDWAS
echo verzeichnisse sind da
pause

:ENDE
echo schluss


Danke und viele Grüße,
Flauschbobbel
Member: bastla
bastla Apr 28, 2008 at 19:32:00 (UTC)
Goto Top
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):
	echo %date% %time% - Standard TCP/IP-Port %IPPortName% in die Registry eintragen... >> %AddPrntLog%
	echo %date% %time% - REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" >> %AddPrntLog%  
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" >nul 2>&1  
	if %errorlevel%==0 (
		echo %date% %time% - Der Vorgang wurde erfolgreich ausgeführt. 	>> %AddPrntLog%
	) else (
		echo %date% %time% - Der Vorgang wurde mit Fehler %errorlevel% beendet. >> %AddPrntLog%
	)

:: and so on ...
	
	echo %date% %time% - Druckwarteschlage anhalten... 				>> %AddPrntLog%
	echo %date% %time% - net stop spooler 						>> %AddPrntLog%	
	net stop spooler >nul 2>&1
	if %errorlevel%==0 echo %date% %time% - Druckwarteschlange wurde erfolgreich beendet. >> %AddPrntLog%
	if %errorlevel%==2 echo %date% %time% - Druckwarteschlange bereits gestoppt 		>> %AddPrntLog%
	echo %date% %time% - Druckwarteschlage starten... 				>> %AddPrntLog%
	echo %date% %time% - net start spooler 						>> %AddPrntLog%
	net start spooler >nul 2>&1
	if %errorlevel%==0 echo %date% %time% - Druckwarteschlange wurde erfolgreich gestartet. >> %AddPrntLog%

Das Prüfen der Unterverzeichnisse könnte etwa so aussehen:
@echo off & setlocal
set "scriptdir=%~dp0"  
::	Prüfen ob die notwendigen Installationsverzeichnisse vorhanden sind
set OK=True
if not exist "%scriptdir%\DrvPS\" (  
	echo ERROR: Verzeichnis %scriptdir%\DrvPS\ nicht vorhanden!
	set OK=
)
if not exist "%scriptdir%\DrvPCL6\" (  
	echo ERROR: Verzeichnis %scriptdir%\DrvPCL6\ nicht vorhanden!
	set OK=
)
if not defined OK goto :ende

:IRGENDWAS
echo verzeichnisse sind da
pause

:ENDE
echo schluss

Was den Rest anlangt, muss ich Dich noch vertrösten ...

Grüße
bastla
Member: bastla
bastla Apr 28, 2008 at 20:15:30 (UTC)
Goto Top
... aber wenn Du durchwegs XP-Rechner hast, könntest Du zwischenzeitlich zB die Informationen aus
wmic printer get DeviceID, DriverName
auf Verwertbarkeit prüfen.

Weitere abrufbare Eigenschaften findest Du über
wmic printer list /?

Grüße
bastla
Member: bastla
bastla Apr 29, 2008 at 08:26:37 (UTC)
Goto Top
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
Member: Flauschbobbel
Flauschbobbel Apr 29, 2008 at 14:50:30 (UTC)
Goto Top
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


@echo off & setlocal

:: ======================================================================
::
:: C O N F I G	/  Modifikationen und Einstellungen
::
:: ======================================================================

::	Script und Logfile
	set STitle=AddPrntr.cmd
	set LINE=----------------------------------------------------------------------
	set scriptdir=%~dp0
	set AddPrntLog=%temp%\AddPrntr_%ComputerName%.log
	set AddPrntLogOld=%temp%\AddPrntr_%ComputerName%.old

::	Schalter-Variable fuer Testprint
::	Ist diese mit dem Wert True gesetzt, wird nach erfolgreicher Installation 
::	des Standard-TCP/IP-Ports und des Druckers eine Testseite gedruckt.
::	Nur für Testzwecke.
	set TstPrnt=


::	Druckerinstallation
	set "INFdir_PS=%scriptdir%DrvPS\"  
	set "INFdir_PCL6=%scriptdir%DrvPCL6\"  
	set "INFfile_PS=%INFdir_PS%ricsetup.inf"  
	set "INFfile_PCL6=%INFdir_PCL6%OEMSETUP.INF"  
	set ModellDruckerTreiber_PS="RICOH Aficio SP 4100N PS"  
	set ModellDruckerTreiber_PCL6="RICOH Aficio SP 4110N PCL 6"  

::  	Hier ggf. die zu installierende Druckersprache (PS oder PCL6) auswählen.
::  	Als Standard wird PCL6 verwendet.
::
	set INFfile=%INFfile_PCL6%
	set ModellDruckerTreiber=%ModellDruckerTreiber_PCL6%


:: 	Namenskonvention der Druckernamen
:: 	Drucker_Schalter_<IP-Adr> 
:: 
	set DefineDruckerName=Drucker_Schalter_
	set DefineDruckerNr=0


::	Excelliste (.csv) als Inputinformationen für dieses Installationsscript
::
	set "InputListe=%scriptdir%RO_TEST.csv"  

 

:: ======================================================================
::
:: M A I N
::
:: ======================================================================

::	Wenn bereits ein .LOG existiert, kopieren auf .OLD 
	if exist %AddPrntLog% copy /Y %AddPrntLog% %AddPrntLogOld% >NUL

::	Startline im Logfile
	echo %date% %time% - %LINE%							> %AddPrntLog%
	echo %date% %time% - Start %sTitle% on Node %ComputerName%			>> %AddPrntLog%
	echo %date% %time% - %LINE%							>> %AddPrntLog%


::	Prüfen, ob das Schreiben der Log-Datei erfolgreich war
	if not exist %AddPrntLog% goto fehler_logfile


::	Prüfen ob die notwendigen Installationsverzeichnisse/Dateien vorhanden sind
	set OK=True
	if not exist "%INFfile%" (  
		echo %date% %time% - ERROR: Datei %INFfile% nicht vorhanden!		>> %AddPrntLog%
		set OK=
	)
	if not exist "%InputListe%" (  
		echo %date% %time% - ERROR: Excel-Inputdatei %InputListe% nicht vorhanden! >> %AddPrntLog%
		set OK=
	)
	if not defined OK goto :FEHLER_SOURCEFILES


::	Info über die Lokation der Input-Dateien ins Logfile eintragen
	echo %date% %time% - Installationsource der INF-Datei: %INFfile% 		>> %AddPrntLog%	
	echo %date% %time% - Excel-Inputliste: %InputListe% 				>> %AddPrntLog%


::	IP-Adresse des Clients auslesen, 
::  	IP-Adressen der zu installierenden Drucker aus Excelliste 
::	auslesen und für Nutzung zusammensetzen

::IP des Client auslesen
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do (  
	::IP des Clients zerlegen in %%a.%%b.%%c.%%d
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do (  
		::Drucker aus der Excelliste auslesen
		for /f "tokens=10-14 delims=;" %%m in ('findstr /c:"%%a.%%b.%%c." "%InputListe%"') do (  
			::Drucker installieren
			echo Installiere mit Daten %%m %%n %%o %%p >>NUL
			::Zweiter Parameter = Netzanteil der IP-Adresse des aktuellen Rechners
			call :PROCESSLINE "%%m %%n %%o %%p" "%%a.%%b.%%c"  
		)
	)
)

	call :CLEANUP
	goto ENDE


:: ----------------------------------------------------------------------
::
::     **********     Unterprogramme Processline    **********
::
:: ----------------------------------------------------------------------

:: ----------------------------------------------------------------------
:ProcessLine
:: ----------------------------------------------------------------------
echo Unterprogramm: Installiere mit Daten %~1 >NUL
:: so viele Drucker installieren, wie Adressen vorhanden
for %%i in (%~1) do (
	echo Bearbeite IP %%i >NUL
	::Adresse in IP-Range?
	echo %%i|findstr /c:%2 >NUL && (
		set "ipadr=%%i"   
		set "IPPortName=IP_%%i"  
		::Schalter setzen
		REM Schalter-Variable - diese wird zunaechst gesetzt, und, 
		REM wenn im Unterprogramm die IP gefunden wird, geloescht. 
		REM Nach Rueckkehr ins Hauptprogramm ist dann am Zustand der 
		REM Variablen  defined  oder  not defined  das Ergebnis 
		REM der Ueberpruefung abzulesen.
		set "InstIP=True"  

		set InstDr=

		call :CHECK_PRINTER
		call :CHECK_IP_PORT
		::nur bei noch gesetztem Schalter installieren
		if defined InstIP call :INSTALLATION
		if not defined InstDR call :INSTALLATION_ONLY_PRINTER

	)
)
goto :eof



:: ----------------------------------------------------------------------
:CHECK_IP_PORT
:: ----------------------------------------------------------------------
::
::  	Prüfen, ob der Standard TCP/IP-Port bereits existiert 
::     	und in der Registry eingetragen ist
::
::     	Wenn dem so ist, ist das Scripts bereits auf diesem Client gelaufen 
::	und kann beendet werden
::
::	ERRORLEVEL=0 Standard TCP/IP-Port existiert in der Registry
::	ERRORLEVEL=1 Standard TCP/IP-Port existiert nicht in der Registry
::

	echo IM CHECK_IP_PORT

	echo %date% %time% - %LINE%									>> %AddPrntLog%
	echo %date% %time% - Pruefen, ob der Standard TCP/IP-Port %IPPortName% bereits existiert... 	>> %AddPrntLog%
	echo %date% %time% - REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v IPAddress >> %AddPrntLog%  

::	Falls die IP in der Registry gefunden wird, InstIP-Schalter loeschen
	REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%">NUL && set InstIP=  

	if not defined InstIP (
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% bereits eingetragen 		>> %AddPrntLog%
		rem goto :CHECK_PRINTER
 		goto :eof
	) else (
		echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden 		>> %AddPrntLog%
	)

	echo\												>> %AddPrntLog%
	goto :eof


:: ----------------------------------------------------------------------
:CHECK_PRINTER
:: ----------------------------------------------------------------------
::
::  	Prüfen, ob der Drucker bereits installiert ist
::
::     	Wenn dem so ist, ist das Scripts bereits auf diesem Client gelaufen 
::	und kann beendet werden
::
:: 	Schalter-Variable InstDr - diese wird zunaechst nicht gesetzt, und, 
:: 	wenn im Unterprogramm ein Drucker gefunden wird, gesetzt. 
:: 	Nach Rueckkehr ins Hauptprogramm und bei der Abfrage der Unterprogramme 
::	ist dann am Zustand der Variablen  defined  oder  not defined  
::	das Ergebnis der Ueberpruefung abzulesen.

	echo IM CHECK_PRINTER

::	set InstDr=

for /f "tokens=1 delims=:" %%x in ('wmic printer get DeviceID^|FINDSTR "%DruckerName%"') do (  
		echo  Druckername aus DeviceID: %%x|findstr /c:"%DruckerName%%ipadr%" && (  
		echo Drucker %DruckerName%%ipadr% existiert.
		set "InstDr=True"  
		)
)

echo InstDr: %InstDr%
echo Drucker: %DruckerName%%ipadr%.
rem set ipadr=

	echo\												>> %AddPrntLog%
	goto :eof


:: ----------------------------------------------------------------------
:INSTALLATION
:: ----------------------------------------------------------------------

	set DruckerName=%DefineDruckerName%%ipadr%

	call :CREATE_TCPIP_PORT
	call :STOP_START_SPOOLER
	if defined InstIP goto :eof

:: ----------------------------------------------------------------------
:INSTALLATION_ONLY_PRINTER
:: ----------------------------------------------------------------------
	echo INSTALLATION_ONLY_PRINTER

	call :ADD_PRINTER_DRIVER
	call :ADD_LOGICAL_PRINTER
	call :SETTING_PRINTER
	If defined TstPrnt call :PRINT_TESTPAGE
	goto :eof


:: ----------------------------------------------------------------------
:CREATE_TCPIP_PORT
:: ----------------------------------------------------------------------

echo IM CREATE_TCPIP_PORT

::  	Standard TCP/IP-Port in die Registry eintragen 
::	mit REG ADD Befehlen....
	goto :eof


:: ----------------------------------------------------------------------
:STOP_START_SPOOLER
:: ----------------------------------------------------------------------

:: 	Druckerwarteschlange anhalten/starten

	echo %date% %time% - Druckerwarteschlage anhalten... 				>> %AddPrntLog%
	echo %date% %time% - Druckerwarteschlage starten... 				>> %AddPrntLog%
	goto :eof




:: ----------------------------------------------------------------------
:ADD_PRINTER_DRIVER
:: ----------------------------------------------------------------------

	echo IM ADD_PRINTER_DRIVER

	goto :eof


:: ----------------------------------------------------------------------
:ADD_LOGICAL_PRINTER
:: ----------------------------------------------------------------------

	echo IM ADD_LOGICAL_PRINTER
	goto :eof


:: ----------------------------------------------------------------------
:SETTING_PRINTER
:: ----------------------------------------------------------------------

	echo IM SETTING_PRINTER
	set DruckerName=%DefineDruckerName%%ipadr%
	goto :eof


:: ----------------------------------------------------------------------
:PRINT_TESTPAGE
:: ----------------------------------------------------------------------

:: 	Testseite ausdrucken / NUR WAEHREND DER TESTS !!!!
	set DruckerName=%DefineDruckerName%%ipadr%
	echo %date% %time% - Testseite auf %DefineDruckerName%%ipadr% ausdrucken... 	>> %AddPrntLog%
	goto :eof

:: ----------------------------------------------------------------------
:CLEANUP
:: ----------------------------------------------------------------------
::
::  	Aufraeumen von nicht mehr benötigten Dateien
::
	echo %date% %time% - %LINE%							>> %AddPrntLog%
	echo %date% %time% - Loeschen nicht mehr benoetigter Dateien... 		>> %AddPrntLog%
:: 	del %AddPrntLogOld%								>> %AddPrntLog%
	goto :eof


:: ----------------------------------------------------------------------
:CLEAR_VARIABLES
:: ----------------------------------------------------------------------

	set AddPrntLog=
	set AddPrntLogOld=
	set LINE=
	set STitle=
	set InputListe=
	set scriptdir=
	set ipadr=
	set IPPortName=

	set INFdir_PS=
	set INFdir_PCL6=
	set INFfile=
	set INFfile_PS=
	set INFfile_PCL6=
	set ModellDruckerTreiber=
	set ModellDruckerTreiber_PS=
	set ModellDruckerTreiber_PCL6=
	set DruckerName=
	set DefineDruckerNr=
	set DefineDruckerName=
	goto :eof

:: ----------------------------------------------------------------------
::     **********  Ende Unterprogramme Processline  **********
:: ----------------------------------------------------------------------


::
:: ----------------------------------------------------------------------
:: *** Fehler-Ausgänge des Scripts
:: ----------------------------------------------------------------------
:FEHLER_LOGFILE
echo %date% %time% - Errorlevel : %errorlevel%						>> %AddPrntLog%
echo %date% %time% - ERROR: Fehler beim Anlegen der Log-Datei %AddPrntLog% !		>> %AddPrntLog%
echo %date% %time% - ERROR: %sTitle% kann nicht fortgesetzt werden.			>> %AddPrntLog%
echo ERROR: Fehler beim Anlegen der Log-Datei %AddPrntLog% !	
echo ERROR: %sTitle% kann nicht fortgesetzt werden.
goto ENDE_AUSGANG

:FEHLER_SOURCEFILES
echo %date% %time% - Errorlevel : %errorlevel%						>> %AddPrntLog%
echo %date% %time% - ERROR: Fehlende Input-Dateien (%INFfile% oder %InputListe%) !	>> %AddPrntLog%
echo %date% %time% - ERROR: %sTitle% kann nicht fortgesetzt werden.			>> %AddPrntLog%
goto ENDE

:: ----------------------------------------------------------------------
:ENDE
:: ----------------------------------------------------------------------

::	Bottomline im Logfile
	echo %date% %time% - %LINE%							>> %AddPrntLog%
	echo %date% %time% - Ende %sTitle% on Node %ComputerName%     			>> %AddPrntLog%
	echo %date% %time% - %LINE%							>> %AddPrntLog%

	call :CLEAR_VARIABLES

:: ----------------------------------------------------------------------
:ENDE_AUSGANG
:: ----------------------------------------------------------------------
Member: bastla
bastla Apr 29, 2008 at 21:26:48 (UTC)
Goto Top
Hallo Flauschbobbel!

... sorry für meine verspätete Antwort ...
Na, in dieser Hinsicht hast Du ja noch einiges gut ... face-wink
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:
@echo off & setlocal

:: ======================================================================
::
:: C O N F I G	/  Modifikationen und Einstellungen
::
:: ======================================================================

::	Script und Logfile
	set STitle=%~nx0
	set LINE=----------------------------------------------------------------------
	set scriptdir=%~dp0
	set AddPrntLog=%temp%\AddPrntr_%ComputerName%.log
	set AddPrntLogOld=%temp%\AddPrntr_%ComputerName%.old


::	Schalter-Variable fuer Testprint
::	Ist diese mit dem Wert True gesetzt, wird nach erfolgreicher Installation 
::	des Standard-TCP/IP-Ports und des Druckers eine Testseite gedruckt.
::	Nur für Testzwecke.
	set TstPrnt=


::	Druckerinstallation
	set "INFdir_PS=%scriptdir%DrvPS\"  
	set "INFdir_PCL6=%scriptdir%DrvPCL6\"  
	set "INFfile_PS=%INFdir_PS%ricsetup.inf"  
	set "INFfile_PCL6=%INFdir_PCL6%OEMSETUP.INF"  
	set ModellDruckerTreiber_PS="RICOH Aficio SP 4100N PS"  
	set ModellDruckerTreiber_PCL6="RICOH Aficio SP 4110N PCL 6"  

::  	Hier ggf. die zu installierende Druckersprache (PS oder PCL6) auswählen.
::  	Als Standard wird PCL6 verwendet.
::
	set INFfile=%INFfile_PCL6%
	set ModellDruckerTreiber=%ModellDruckerTreiber_PCL6%


:: 	Namenskonvention der Druckernamen
:: 	Drucker_Schalter_<IP-Adr> 
:: 
	set DefineDruckerName=Drucker_Schalter_
	set DefineDruckerNr=0


::	Excelliste (.csv) als Inputinformationen für dieses Installationsscript
::
	set "InputListe=%scriptdir%RO_TEST.csv"  


:: ======================================================================
::
:: M A I N
::
:: ======================================================================

::	Wenn bereits ein .LOG existiert, kopieren auf .OLD 
	if exist %AddPrntLog% copy %AddPrntLog% %AddPrntLogOld% >NUL

::	Startline im Logfile
	echo %date% %time% - %LINE%							> %AddPrntLog%
	echo %date% %time% - Start %sTitle% on Node %ComputerName%			>> %AddPrntLog%
	echo %date% %time% - %LINE%							>> %AddPrntLog%


::	Prüfen, ob das Schreiben der Log-Datei erfolgreich war
	if not exist %AddPrntLog% goto fehler_logfile


::	Prüfen ob die notwendigen Installationsverzeichnisse/Dateien vorhanden sind
	set OK=True
	if not exist "%INFfile%" (  
		echo %date% %time% - ERROR: Datei %INFfile% nicht vorhanden!		>> %AddPrntLog%
		set OK=
	)
	if not exist "%InputListe%" (  
		echo %date% %time% - ERROR: Excel-Inputdatei %InputListe% nicht vorhanden! >> %AddPrntLog%
		set OK=
	)
	if not defined OK goto :FEHLER_SOURCEFILES


::	Info über die Lokation der Input-Dateien ins Logfile eintragen
	echo %date% %time% - Installationsource der INF-Datei: %INFfile% 		>> %AddPrntLog%	
	echo %date% %time% - Excel-Inputliste: %InputListe% 				>> %AddPrntLog%


::	IP-Adresse des Clients auslesen, 
::  	IP-Adressen der zu installierenden Drucker aus Excelliste 
::	auslesen und für Nutzung zusammensetzen

:: IP des Clients auslesen
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do (  
	::IP des Clients zerlegen in %%a.%%b.%%c = Netzanteil = %CI13% und %%d = Hostanteil = %CI4% (diese Variable steht fuer: 4. Stelle der Client-IP)
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do set "CI13=%%a.%%b.%%c" & set "CI4=%%d"  
)
:: Subnet Mask des Clients auslesen
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR /i "mask"') do (  
	::Subnet Mask des Clients zerlegen in %%a.%%b.%%c (255.255.255 wird vorausgesetzt) sowie Anteil %%d 
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do set "S13=%%a.%%b.%%c" & set "S4=%%d"  
)

:: Faktor fuer Subnet-Berechnung = Anzahl der möglichen Adressen je Subnetz
set /a SNF=256-%S4%
:: Subnet-Index des Clients berechnen
set /a CSNI=%CI4%/%SNF%

:: Drucker-Datensatz aus der Excelliste auslesen - zumindest Netzanteil (Teile 1 bis 3 der IP-Adresse) muss uebereinstimmen
for /f "tokens=10-14 delims=;" %%m in ('findstr /c:"%CI13%." "%InputListe%"') do (  
	:: Drucker installieren - bis zu 4 Adressen uebergeben
	echo Installiere mit Daten %%m %%n %%o %%p
	call :PROCESSLINE "%%m %%n %%o %%p"  
)

	call :CLEANUP
	goto ENDE


:: ----------------------------------------------------------------------
::
::     **********     Unterprogramm Processline    **********
::
:: ----------------------------------------------------------------------

:: ----------------------------------------------------------------------
:ProcessLine
:: ----------------------------------------------------------------------
echo Unterprogramm: Installiere mit Daten %~1 >NUL
:: so viele Drucker installieren, wie Adressen vorhanden
for %%i in (%~1) do (
	echo Bearbeite IP %%i >NUL
	::Werte fuer Installation festlegen
	set "ipadr=%%i"   
	set "IPPortName=IP_%%i"  
	set "DruckerName=%DefineDruckerName%%%i"  
	
	::Adresse in IP-Range (Stellen 1-3 der Client-IP in Drucker-IP enthalten)?
	echo %%i|findstr /c:"%CI13%." >NUL && (  
	
		::Pruefen auf selbes Subnet
		set "SubnetOK=True"  
		call :CHECK_SUBNET "%%i"  
		
		::Wenn Drucker im selben Subnet wie Client, weiter pruefen ...
		if defined SubnetOK (
			REM Schalter setzen
			REM Schalter-Variable - diese wird zunaechst gesetzt, und, 
			REM wenn im Unterprogramm die IP gefunden wird, geloescht. 
			REM Nach Rueckkehr ins Hauptprogramm ist dann am Zustand der 
			REM Variablen  "defined"  oder  "not defined"  das Ergebnis   
			REM der Ueberpruefung abzulesen.
			set "InstDR=True"  
			call :CHECK_PRINTER

			set "InstIP=True"  
			call :CHECK_IP_PORT

			:: nur bei noch gesetztem Schalter installieren
			if defined InstIP call :INSTALLATION
			if defined InstDR call :INSTALLATION_ONLY_PRINTER
			
		) else (
			echo %date% %time% - Drucker-IP %%i nicht im selben Subnet wie Client-IP %CI13%.%CI4%		>> %AddPrntLog%
		)
	)
)
goto :eof

:: ----------------------------------------------------------------------
::     **********  Ende Unterprogramme Processline  **********
:: ----------------------------------------------------------------------


:CHECK_SUBNET
::Hostanteil Drucker-IP ermitteln
for /f "tokens=4 delims=." %%a in (%1) do set PI4=%%a  
::Subnet-Index Drucker berechnen
set /a PSNI=%PI4%/%SNF%
::Subnet-Indizes Drucker und Client vergleichen; wenn ungleich, Schalter loeschen
if %PSNI% neq %CSNI% set SubnetOK=
goto :eof

:: ----------------------------------------------------------------------
:CHECK_IP_PORT
:: ----------------------------------------------------------------------
::
::  	Prüfen, ob der Standard TCP/IP-Port bereits existiert 
::     	und in der Registry eingetragen ist
::
::     	Wenn dem so ist, ist das Scripts bereits auf diesem Client gelaufen 
::	und kann beendet werden
::
::	ERRORLEVEL=0 Standard TCP/IP-Port existiert in der Registry
::	ERRORLEVEL=1 Standard TCP/IP-Port existiert nicht in der Registry
::
echo IM CHECK_IP_PORT

echo %date% %time% - %LINE%									>> %AddPrntLog%
echo %date% %time% - Pruefen, ob der Standard TCP/IP-Port %IPPortName% bereits existiert... 	>> %AddPrntLog%
echo %date% %time% - REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v IPAddress >> %AddPrntLog%  

::	Falls die IP in der Registry gefunden wird, InstIP-Schalter loeschen
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%">NUL && set InstIP=  

if not defined InstIP (
	echo %date% %time% - Standard TCP/IP-Port %IPPortName% bereits eingetragen 		>> %AddPrntLog%
	::goto :CHECK_PRINTER
		goto :eof
) else (
	echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden 		>> %AddPrntLog%
)

echo\												>> %AddPrntLog%
goto :eof

:: ----------------------------------------------------------------------
:CHECK_PRINTER
:: ----------------------------------------------------------------------
::
::  	Prüfen, ob der Drucker bereits installiert ist
::
::     	Wenn dem so ist, ist das Scripts bereits auf diesem Client gelaufen 
::	und kann beendet werden
::
:: 	Schalter-Variable InstDr - diese wird zunaechst nicht gesetzt, und, 
:: 	wenn im Unterprogramm ein Drucker gefunden wird, gesetzt. 
:: 	Nach Rueckkehr ins Hauptprogramm und bei der Abfrage der Unterprogramme 
::	ist dann am Zustand der Variablen  defined  oder  not defined  
::	das Ergebnis der Ueberpruefung abzulesen.

echo IM CHECK_PRINTER

::	set InstDr=

for /f "tokens=1 delims=:" %%x in ('wmic printer get DeviceID^|FINDSTR "%DruckerName%"') do (  
		echo  Druckername aus DeviceID: %%x|findstr /c:"%DruckerName%" && (  
		echo Drucker %DruckerName% existiert.
		set InstDr=
		)
)

echo InstDr: %InstDr%
echo Drucker: %DruckerName%

echo\												>> %AddPrntLog%
goto :eof

:: ----------------------------------------------------------------------
:INSTALLATION
:: ----------------------------------------------------------------------
	call :CREATE_TCPIP_PORT
	call :STOP_START_SPOOLER
	goto :eof

:: ----------------------------------------------------------------------
:INSTALLATION_ONLY_PRINTER
:: ----------------------------------------------------------------------
	echo INSTALLATION_ONLY_PRINTER

	call :ADD_PRINTER_DRIVER
	call :ADD_LOGICAL_PRINTER
	call :SETTING_PRINTER
	If defined TstPrnt call :PRINT_TESTPAGE
	goto :eof

:: ----------------------------------------------------------------------
:CREATE_TCPIP_PORT
:: ----------------------------------------------------------------------
echo IM CREATE_TCPIP_PORT

::  	Standard TCP/IP-Port in die Registry eintragen 
::	mit REG ADD Befehlen....
	goto :eof

:: ----------------------------------------------------------------------
:STOP_START_SPOOLER
:: ----------------------------------------------------------------------
:: 	Druckerwarteschlange anhalten/starten

	echo %date% %time% - Druckerwarteschlage anhalten... 				>> %AddPrntLog%
	echo %date% %time% - Druckerwarteschlage starten... 				>> %AddPrntLog%
	goto :eof

:: ----------------------------------------------------------------------
:ADD_PRINTER_DRIVER
:: ----------------------------------------------------------------------
	echo IM ADD_PRINTER_DRIVER
	goto :eof

:: ----------------------------------------------------------------------
:ADD_LOGICAL_PRINTER
:: ----------------------------------------------------------------------
	echo IM ADD_LOGICAL_PRINTER
	goto :eof

:: ----------------------------------------------------------------------
:SETTING_PRINTER
:: ----------------------------------------------------------------------
	echo IM SETTING_PRINTER
	goto :eof

:: ----------------------------------------------------------------------
:PRINT_TESTPAGE
:: ----------------------------------------------------------------------
:: 	Testseite ausdrucken / NUR WAEHREND DER TESTS !!!!
	echo %date% %time% - Testseite auf %DefineDruckerName%%ipadr% ausdrucken... 	>> %AddPrntLog%
	goto :eof
	
:: ----------------------------------------------------------------------
:CLEANUP
:: ----------------------------------------------------------------------
::
::  	Aufraeumen von nicht mehr benötigten Dateien
::
	echo %date% %time% - %LINE%							>> %AddPrntLog%
	echo %date% %time% - Loeschen nicht mehr benoetigter Dateien... 		>> %AddPrntLog%
:: 	del %AddPrntLogOld%								>> %AddPrntLog%
	goto :eof

::
:: ----------------------------------------------------------------------
:: *** Fehler-Ausgänge des Scripts
:: ----------------------------------------------------------------------
:FEHLER_LOGFILE
echo %date% %time% - Errorlevel : %errorlevel%						>> %AddPrntLog%
echo %date% %time% - ERROR: Fehler beim Anlegen der Log-Datei %AddPrntLog% !		>> %AddPrntLog%
echo %date% %time% - ERROR: %sTitle% kann nicht fortgesetzt werden.			>> %AddPrntLog%
echo ERROR: Fehler beim Anlegen der Log-Datei %AddPrntLog% !	
echo ERROR: %sTitle% kann nicht fortgesetzt werden.
goto ENDE_AUSGANG

:FEHLER_SOURCEFILES
echo %date% %time% - Errorlevel : %errorlevel%						>> %AddPrntLog%
echo %date% %time% - ERROR: Fehlende Input-Dateien (%INFfile% oder %InputListe%) !	>> %AddPrntLog%
echo %date% %time% - ERROR: %sTitle% kann nicht fortgesetzt werden.			>> %AddPrntLog%
goto ENDE

:: ----------------------------------------------------------------------
:ENDE
:: ----------------------------------------------------------------------
::	Bottomline im Logfile
	echo %date% %time% - %LINE%							>> %AddPrntLog%
	echo %date% %time% - Ende %sTitle% on Node %ComputerName%     			>> %AddPrntLog%
	echo %date% %time% - %LINE%							>> %AddPrntLog%

:: ----------------------------------------------------------------------
:ENDE_AUSGANG
:: ----------------------------------------------------------------------

Grüße
bastla
Member: Biber
Biber Apr 29, 2008 at 21:55:01 (UTC)
Goto Top
und eine (hoffentlich letzte) Anregung:

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

.....
Call:WriteLog "Standard TCP/IP-Port %IPPortName% noch nicht vorhanden"  
....
...
goto :eof

:WriteLog
>> %AddPrntLog% echo %date% %time% - %~1
:goto eof

Grüße
Biber
Member: Flauschbobbel
Flauschbobbel May 05, 2008 at 18:10:22 (UTC)
Goto Top
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
Member: Flauschbobbel
Flauschbobbel May 05, 2008 at 18:13:01 (UTC)
Goto Top
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
Member: Biber
Biber May 05, 2008 at 19:08:54 (UTC)
Goto Top
Moin Flauschbobbel,

z.B. so :
call :WRITELOG "net stop spooler"  
For /F "Delims=" %%i IN ('net stop spooler') do  call :WRITELOG "%%i"  
....

Grüße
Biber
Member: bastla
bastla May 05, 2008 at 19:33:52 (UTC)
Goto Top
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
Member: Flauschbobbel
Flauschbobbel May 05, 2008 at 20:01:04 (UTC)
Goto Top
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
Member: bastla
bastla May 05, 2008 at 20:21:33 (UTC)
Goto Top
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:
:: Subnet Mask des Clients auslesen
for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR /i "mask"') do (  
	::Subnet Mask des Clients zerlegen in %%a.%%b.%%c (255.255.255 wird vorausgesetzt) sowie Anteil %%d 
	for /f "tokens=1-4 delims=. " %%a in ("%%i") do set "S13=%%a.%%b.%%c" & set "S4=%%d"  
)
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:
:: Faktor fuer Subnet-Berechnung = Anzahl der möglichen Adressen je Subnetz
set /a SNF=256-%S4%
:: Subnet-Index des Clients berechnen
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
Member: Flauschbobbel
Flauschbobbel May 13, 2008 at 18:33:39 (UTC)
Goto Top
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)


Standort-ID  ; Standort-Nr; Standortschlüssel ; PLZ  ; Ort      ; Strasse   ; Anzahl NetzwDr ; Bemerkung1 ; Bemerkung2 ; IP-Adresse   ; Subnet-Maske    ; DosenNr ; Bemerkung
470:11       ; 8098835    ; 47011             ; 12345; Irgendwo ; Musterstr ; 1              ;            ;            ; 10.35.41.102 ; 255.255.255.224 ;         ;
470:92       ; 8070837    ; 47092             ; 67891; Irgendwo2; Musterstr ; 2              ;            ;            ; 10.35.169.198; 255.255.255.224 ;         ;
470:92       ; 8070837    ; 47092             ; 67891; Irgendwo2; Musterstr ; 2              ;            ;            ; 10.35.169.199; 255.255.255.224 ;         ;
123:12       ; 1234567    : 12312             ; 54391; Musterstadt1; Musterstr;2             ;            ;            ; 10.36.168.33 ; 255.255.255.224 ;         ;
123:12       ; 1234567    ; 12312             ; 54391; Musterstadt1; Musterstr;2             ;            ;            ; 10.36.168.34 ; 255.255.255.224 ;         ;
123:13       ; 1234568    : 12313             ; 54444; Musterdorf; Musterstr;  2             ;            ;            ; 10.36.168.79 ; 255.255.255.224 ;         ;
123:13       ; 1234568    : 12313             ; 54444; Musterdorf; Musterstr;  2             ;            ;            ; 10.36.168.80 ; 255.255.255.224 ;         ;
890:11       ; 1198822    ; 89011             ; 98765; Irgendwo3; Musterstr ; 2              ;            ;            ; 160.54.78.86 ; 255.255.255.0   ;         ;
890:11       ; 1198822    ; 89011             ; 98765; Irgendwo3; Musterstr ; 2              ;            ;            ; 160.54.78.87 ; 255.255.255.0   ;         ;
100:22       ; 1198822    ; 10022             ; 23456; Irgendwo4; Musterstr ; 2              ;            ;            ; 160.54.31.231; 255.255.255.240 ;         ;
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:

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

OK, habe ich verstanden.

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

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:  
:: Faktor fuer Subnet-Berechnung = Anzahl der möglichen Adressen je Subnetz
set /a SNF=256-%S4%
:: Subnet-Index des Clients berechnen
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



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?

Standort-ID  ; Standort-Nr; Standortschlüssel ; PLZ  ; Ort         ; Strasse   ; Anzahl NetzwDr ; Bemerkung1 ; Bemerkung2 ; IP-Adresse   ; Subnet-Maske    ; DosenNr ; Bemerkung
123:12       ; 1234567    : 12312             ; 54391; Musterstadt1; Musterstr ;2               ;            ;            ; 10.36.168.33 ; 255.255.255.224 ;         ;
123:12       ; 1234567    ; 12312             ; 54391; Musterstadt1; Musterstr ;2               ;            ;            ; 10.36.168.34 ; 255.255.255.224 ;         ;
123:13       ; 1234568    : 12313             ; 54444; Musterdorf  ; Musterstr ;2               ;            ;            ; 10.36.168.79 ; 255.255.255.224 ;         ;
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
Member: bastla
bastla May 13, 2008 at 19:42:26 (UTC)
Goto Top
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:
Rechner: 256 - 240 = 16 = "Faktor"; 235 / "Faktor" = 14,6875; ganzzahliger Anteil = 14 = "Index"  
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
Member: Flauschbobbel
Flauschbobbel Sep 30, 2008 at 15:34:25 (UTC)
Goto Top
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)

 
@echo off & setlocal
CD /D %~dp0
:: ======================================================================
::
:: C O N F I G	/  Modifikationen und Einstellungen
::
:: ======================================================================

::	Script und Logfile
	set STitle=%~nx0
	set LINE=---------------------------------------------------------------------------
	set scriptdir=%~dp0
	set SName=%~n0
	set LogPath=C:\Log\%SName%
	set ScriptLog=%LogPath%\%SName%.log
	set ScriptLogOld=%LogPath%\%SName%.old

::	T E S T  /  Schalter-Variable fuer Testprint
::	Ist diese mit dem Wert True gesetzt, wird nach erfolgreicher Installation 
::	des Standard-TCP/IP-Ports und des Druckers eine Testseite gedruckt.
::	Nur fuer Testzwecke.
	set "TstPrnt="  

::	T E S T  /  Schalter-Variable fuer Testanzeige
::	Ist diese mit dem Wert TRUE gesetzt, werden am Bildschirm die einzelnen
::	Unterprogramme, in dem sich der Batch zur Laufzeit befindet, angezeigt.
::	Zusaetzlich werden mit der Variable TstCMD Befehle nur waehrend der Tests durchgefuehrt.
::	Nur fuer Testzwecke.
	set "TstInfoMsg=*** TEST ***  Bearbeite"  
	set "TstCMD="  
	set "Tst="  

::	Druckerinstallation
	set ModellDrucker="RICOH Aficio SP 4100N PCL 6"  
	set ModellDruckerTreiber=%ModellDrucker%
	set TmpModellDrucker=%ModellDrucker:~1,-1%
::	Variablen fuer Druckersprache PCL6
	set "INFdir_PCL6=%scriptdir%RicohDrvPCL\"  
	set "INFfile_PCL6=%INFdir_PCL6%OEMSETUP.INF"  
	set INFfile="%INFfile_PCL6%"  
	set TmpINFfile=%INFfile:~1,-1%


:: 	Namenskonvention der Druckernamen
	set DefineDruckerName=ICFDrucker

::	Excelliste (.csv) als Inputinformationen fuer dieses Installationsscript
	set InputListe="%scriptdir%rt.csv"  
	set InputListeLocal="%scriptdir%rt_local.csv"  
	set InputListeRemote="%scriptdir%rt_Remote.csv"  


:: ======================================================================
::
:: M A I N
::
:: ======================================================================

::	Pruefen, ob Verzeichnis existiert, wenn nicht anlegen
	if not exist %LogPath% call :CREATE_LOG_PATH

::	Wenn bereits ein .LOG existiert, kopieren auf .OLD 
	if exist %ScriptLog% copy /Y %ScriptLog% %ScriptLogOld% >NUL

::	Startline in Logfile schreiben
	echo\ > %ScriptLog%
	call :WRITELOG %LINE%
	call :WRITELOG "Start %sTitle% on Node %ComputerName%"  
	call :WRITELOG %LINE%

::	Pruefen, ob das Schreiben der Log-Datei erfolgreich war
	if not exist %ScriptLog% goto FEHLER_LOGFILE

:: ----------------------------------------------------------------------
:CHECK_OS
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% CHECK_OS

::	Pruefen auf korrektes Betriebssystem (Microsoft Windows XP Professional)
::	wmic path win32_operatingsystem get caption
	wmic path win32_operatingsystem get caption|FINDSTR /c:"XP Professional" >NUL && goto :XP_OK >NUL  

::	Client ist kein Windows XP-Rechner
	goto :FEHLER_OS

:: ----------------------------------------------------------------------
:XP_OK
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% XP_OK

::	Client ist Windows XP-Rechner
::	Info Betriebssystem ins Logfile eintragen
	For /F "Delims=" %%j in ('ver') do call :WRITELOG "Betriebssystem: %%j"  

:: ----------------------------------------------------------------------
:CHECK_INSTALL_FOLDER
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% CHECK_INSTALL_FOLDER

::	Pruefen ob die notwendigen Installationsverzeichnisse/Dateien vorhanden sind
	set OK=True
	if not exist %InputListe% (
::		      InputListe war in Anfuehrungszeichen
		call :WRITELOG "ERROR: Inputdatei (lokal) '%InputListe%' nicht vorhanden!"  
		>> %ScriptLog% dir %scriptdir%
		set OK=
	)
	if not defined OK goto :FEHLER_SOURCEFILES

:: ----------------------------------------------------------------------
:WRITE_INFO_TO_LOG
:: ----------------------------------------------------------------------

::	Info ueber die Lokation der Input-Dateien ins Logfile eintragen
	call :WRITELOG "Druckerinstallation: %TmpModellDrucker%"  
	call :WRITELOG "Ausfuehrung des Skripts in: %scriptdir%"  
	call :WRITELOG %LINE%

:: ----------------------------------------------------------------------
:READ_NW_INFO_CLIENT
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% READ_NW_INFO_CLIENT

::	IP-Adresse des Clients auslesen, 
::  	IP-Adressen der zu installierenden Drucker aus Excelliste 
::	auslesen und fuer Nutzung zusammensetzen

:: ----------------------------------------------------------------------
:READ_IP_CLIENT
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% READ_IP_CLIENT

:: 	IP des Clients auslesen
	for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR "IP-Ad"') do (  
		::IP des Clients zerlegen in %%a.%%b.%%c = Netzanteil = %CI13% und %%d = Hostanteil = %CI4% (diese Variable steht fuer: 4. Stelle der Client-IP)
		for /f "tokens=1-4 delims=. " %%a in ("%%i") do set "CI13=%%a.%%b.%%c" & set "CI4=%%d"  
	)

:: ----------------------------------------------------------------------
:READ_SUBNET_CLIENT
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% READ_SUBNET_CLIENT

:: 	Subnet Mask des Clients auslesen
	for /f "tokens=2 delims=:" %%i in ('ipconfig^|FINDSTR /i "mask"') do (  
		::Subnet Mask des Clients zerlegen in %%a.%%b.%%c (255.255.255 wird vorausgesetzt) sowie Anteil %%d 
		for /f "tokens=1-4 delims=. " %%a in ("%%i") do set "S13=%%a.%%b.%%c" & set "S4=%%d"  
	)

:: ----------------------------------------------------------------------
:CALCULATE_SUBNET
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% CALCULATE_SUBNET

:: 	Faktor fuer Subnet-Berechnung = Anzahl der moeglichen Adressen je Subnetz
	set /a SNF=256-%S4%
:: 	Subnet-Index des Clients berechnen
	set /a CSNI=%CI4%/%SNF%

:: 	Pruefwert ob eine zu installierende IP-Adresse in der Inputliste vorhanden ist.
	set ChkInputIP=True

:: ----------------------------------------------------------------------
:READ_NW_INFO_PRINTER
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% READ_NW_INFO_PRINTER

:: 	Drucker-Datensatz aus der Excelliste auslesen - zumindest Netzanteil (Teile 1 bis 3 der IP-Adresse) muss uebereinstimmen
::	* Inputliste:
::	* Spalte  9 = IP-Adr. des Druckers
::	* Spalte 10 = SubnetMask des Druckers
::	* Spalte 13 = Druckername
:: 	InputListe2 war zuvor InputListe und in Anfuehrungszeichen gesetzt
	set "InputListe2=%InputListe%"  
	for /f "tokens=9-13 delims=;" %%m in ('findstr /c:"%CI13%." %InputListe2%') do (  
		:: Drucker installieren - bis zu 4 Adressen uebergeben
		echo Installiere mit Daten: %%m %%n %%o %%p %%q >NUL
		set ChkInputIP=
	 	call :PROCESSLINE "%%m %%n %%o %%p %%q"  
	)

	if defined ChkInputIP call :WRITELOG "*** Keine zu installierende IP-Adresse in der Liste gefunden. ***"  

:: ----------------------------------------------------------------------
:CLEANING_OUT
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% CLEANING_OUT

REM	call :CLEANUP
REM	*** Unterprogramm CLEANUP derzeit disabled
REM	*** Alle verwendetet Dateien bleiben auf dem Client
	goto ENDE

:: ----------------------------------------------------------------------
:PROCESSLINE
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% PROCESSLINE

	echo Unterprogramm: Installiere mit Daten %~1 >NUL

:: 	so viele Drucker installieren, wie Adressen vorhanden

	for %%i in (%~1) do (
		echo Bearbeite IP %%i >NUL
		::Werte fuer Installation festlegen
		set "ipadr=%%i"   
		set "IPPortName=IP_%%i"  
		set "DruckerName=%%q"  
	
		::Adresse in IP-Range (Stellen 1-3 der Client-IP in Drucker-IP enthalten)?
		echo %%i|findstr /c:"%CI13%." >NUL && (  
		
			::Pruefen auf selbes Subnet
			set "SubnetOK=True"  
			call :CHECK_SUBNET_PRINTER "%%i"  
			
			::Wenn Drucker im selben Subnet wie Client, weiter pruefen ...
			if defined SubnetOK (
				REM Schalter setzen
				REM Schalter-Variable - diese wird zunaechst gesetzt, und, 
				REM wenn im Unterprogramm die IP gefunden wird, geloescht. 
				REM Nach Rueckkehr ins Hauptprogramm ist dann am Zustand der 
				REM Variablen  "defined"  oder  "not defined"  das Ergebnis   
				REM der Ueberpruefung abzulesen.
				set "InstDR=True"  
				call :CHECK_PRINTER
	
				set "InstIP=True"  
				call :CHECK_IP_PORT

				:: nur bei noch gesetztem Schalter installieren
				if defined InstIP call :INSTALLATION
				if defined InstDR call :INSTALLATION_PRINTER
				
			) else (
				echo %date% %time% - Drucker-IP %%i nicht im selben Subnet wie Client-IP %CI13%.%CI4% >> %ScriptLog%
			)
		)
	)
	goto :eof

:: ----------------------------------------------------------------------
:CHECK_SUBNET_PRINTER
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% CHECK_SUBNET_PRINTER

::	Hostanteil Drucker-IP ermitteln
	for /f "tokens=4 delims=." %%a in (%1) do set PI4=%%a  

::	Subnet-Index Drucker berechnen
	set /a PSNI=%PI4%/%SNF%

::	Subnet-Indizes Drucker und Client vergleichen; wenn ungleich, Schalter loeschen
	if %PSNI% neq %CSNI% set SubnetOK=
	goto :eof

:: ----------------------------------------------------------------------
:CHECK_IP_PORT
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% CHECK_IP_PORT

::  	Pruefen, ob der Standard TCP/IP-Port bereits existiert 
::     	und in der Registry eingetragen ist.
::     	Wenn dem so ist, ist das Scripts bereits auf diesem Client gelaufen 
::	und kann beendet werden.

::	ERRORLEVEL=0 Standard TCP/IP-Port existiert in der Registry
::	ERRORLEVEL=1 Standard TCP/IP-Port existiert nicht in der Registry

	call :WRITELOG %LINE%
	call :WRITELOG "Pruefen, ob der Standard TCP/IP-Port %IPPortName% bereits existiert..."  
	call :WRITELOG "CMD: REG QUERY HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName% /v IPAddress"  

::	Falls die IP in der Registry gefunden wird, InstIP-Schalter loeschen
	REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" /s | findstr /i "%IPPortName%">NUL && set InstIP=  

	if not defined InstIP (
		call :WRITELOG "Standard TCP/IP-Port %IPPortName% bereits eingetragen"  
		goto :eof
	) else (
		call :WRITELOG "Standard TCP/IP-Port %IPPortName% noch nicht vorhanden"  
	)
		call :WRITELOG %LINE%
	goto :eof

:: ----------------------------------------------------------------------
:CHECK_PRINTER
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% CHECK_PRINTER

::  	Pruefen, ob der Drucker bereits installiert ist.
::     	Wenn dem so ist, ist das Scripts bereits auf diesem Client gelaufen. 
:: 	Schalter-Variable: InstDr 

	for /f "tokens=1 delims=:" %%x in ('wmic printer get DeviceID^|FINDSTR "%DruckerName%"') do (  
			echo  Druckername aus DeviceID: %%x|findstr /c:"%DruckerName%" >NUL && (  
			call :WRITELOG %LINE%
			call :WRITELOG "Pruefen, ob der Drucker bereits existiert..."  
			call :WRITELOG "Status InstDr: %InstDr%  Drucker: %DruckerName% existiert."  
			set InstDr=
			)
	)
	goto :eof

:: ----------------------------------------------------------------------
:INSTALLATION
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% INSTALLATION

::	Installation/Konfiguration Standard-TCPIP-Port am Client

	call :CREATE_TCPIP_PORT
	call :STOP_START_SPOOLER
	goto :eof

:: ----------------------------------------------------------------------
:INSTALLATION_PRINTER
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% INSTALLATION_PRINTER

::	Installation/Konfiguration des Druckers

	call :ADD_LOGICAL_PRINTER  
	call :SETTING_PRINTER
	If defined TstPrnt call :PRINT_TESTPAGE
	goto :eof


:: ======================================================================
::
:: S U B R O U T I N E S  /  E R R O R H A N D L I N G 
::
:: ======================================================================

:: ----------------------------------------------------------------------
:CREATE_TCPIP_PORT
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% CREATE_TCPIP_PORT

::  	Standard TCP/IP-Port in die Registry eintragen 

	call :WRITELOG "Standard TCP/IP-Port %IPPortName% in die Registry eintragen..."  

	call :WRITELOG "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%"  
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" >> %ScriptLog%  

	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"  
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v Protocol /t REG_DWORD /d 00000001 >> %ScriptLog%  

	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"  
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v Version /t REG_DWORD /d 00000001 >> %ScriptLog%  

	call :WRITELOG "REG ADD  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName% /v HostName /t REG_SZ /d "  
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v HostName /t REG_SZ /d "" >> %ScriptLog%  

	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%"  
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v IPAddress /t REG_SZ /d %ipadr% >> %ScriptLog%  

	call :WRITELOG "REG ADD  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName% /v HWAddress /t REG_SZ /d "  
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v HWAddress /t REG_SZ /d "" >> %ScriptLog%  

	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"  
	REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v PortNumber /t REG_DWORD /d 9100 >> %ScriptLog%  

	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"  
	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%  

	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"  
	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%  

	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"  
	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%  

	echo\ >> %ScriptLog%
	goto :eof


:: ----------------------------------------------------------------------
:STOP_START_SPOOLER
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% STOP_START_SPOOLER

:: 	Druckerwarteschlange anhalten/starten

	call :WRITELOG "Druckerwarteschlange anhalten..."  
	call :WRITELOG "CMD: net stop spooler"  
	net stop spooler >> %ScriptLog%
	if %errorlevel% == 2 call :WRITELOG "Druckerwarteschlange bereits gestoppt"  
	call :WRITELOG "Druckerwarteschlange starten..."  
	call :WRITELOG "CMD: net start spooler"  
	net start spooler >> %ScriptLog%
	goto :eof


:: ----------------------------------------------------------------------
:ADD_LOGICAL_PRINTER
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% ADD_LOGICAL_PRINTER

::  	Logischen Drucker einrichten

:: 	Syntax rundll32 printui.dll,PrintUIEntry
:: 	/if		Installiert Drucker mit Hilfe der angegebenen INF-Datei
:: 	/b[Name]	Basisdruckername wie er unter "Drucker und Faxgeraete" angezeigt wird  
:: 	/f[Datei]	Dateiname+Pfad der INF-datei
:: 	/r[Anschluss]	Anschlussname (Standard TCP/IP-Port)
:: 	/m[Modell]  	Modellname des Druckertreibers   
:: 	/q 		Stiller Modus, Fehlermeldungen werden nicht angezeigt

	call :WRITELOG "Logischen Drucker %DruckerName% einrichten..."  
	call :WRITELOG "CMD: rundll32 printui.dll,PrintUIEntry /if /b %DruckerName% /f %TmpINFfile% /r %IPPortName% /m %TmpModellDruckerTreiber% /q"  
	rundll32 printui.dll,PrintUIEntry /if /b %DruckerName% /f %INFfile% /r"%IPPortName%" /m %ModellDruckerTreiber% /q  
	goto :eof


:: ----------------------------------------------------------------------
:SETTING_PRINTER
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% SETTING_PRINTER

::  	Druckereinstellungen einrichten

:: 	Syntax rundll32 printui.dll,PrintUIEntry
:: 	/Xs		Richtet die Druckereinstellungen ein
:: 	/n[Name]  	Druckername (wie er unter "Drucker und Faxgeraete" angezeigt wird)     
:: 	/q 		Stiller Modus, Fehlermeldungen werden nicht angezeigt

	call :WRITELOG "Druckereinstellungen fuer %DruckerName% einrichten (Kommentar)..."  
	call :WRITELOG "CMD: rundll32 printui.dll,PrintUIEntry /q /Xs /n %DruckerName% Comment Created by ICFND_AddPrntr.CMD"  
	rundll32 printui.dll,PrintUIEntry /q /Xs /n %DruckerName% Comment "Created by ICFND_AddPrntr.CMD"  
	goto :eof


:: ----------------------------------------------------------------------
:PRINT_TESTPAGE
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% PRINT_TESTPAGE

:: 	Testseite ausdrucken / NUR FUER TESTZWECKE !!

:: 	Syntax rundll32 printui.dll,PrintUIEntry
:: 	/n[Name]  	Druckername (wie er unter "Drucker und Faxgeraete" angezeigt wird)     
:: 	/k 		Druckt eine Testseite auf dem angegebenen Drucker aus

	call :WRITELOG "Testseite auf %DruckerName% ausdrucken..."  
	call :WRITELOG "CMD: rundll32 printui.dll,PrintUIEntry /n %DruckerName% /k"  
	rundll32 printui.dll,PrintUIEntry /n %DruckerName% /k
	echo\ >> %ScriptLog%
	call :WRITELOG %LINE%
	goto :eof


:: ----------------------------------------------------------------------
:CREATE_LOG_PATH
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% CREATE_LOG_PATH

::	Verzeichnis %LogPath% existiert nicht,
::	Verzeichnis %LogPath% wird angelegt...
	md %LogPath% 
	goto :eof

	
:: ----------------------------------------------------------------------
:CLEANUP
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% CLEANUP

::  	Aufraeumen von nicht mehr benoetigten Dateien
::	Diese Funktionalitaet wurde am 16.05.2008 nach Ruecksprache 
::	mit der Paketierung bis auf Weiteres deaktiviert. 

	call :WRITELOG %LINE%
	call :WRITELOG "Loeschen nicht mehr benoetigter Dateien..."  
::	call :WRITELOG "Loesche Verzeichnis %INFdir_PCL6%"  
::	rd /S /Q "%INFdir_PCL6%" >> %ScriptLog%  
::	Druckersprache PS Wird derzeit nicht genutzt:
::	call :WRITELOG "Loesche Verzeichnis %INFdir_PS%"  
::	rd /S /Q "%INFdir_PS%" >> %ScriptLog%  
::	call :WRITELOG "Loesche Inputliste %InputListe%"  
::	del "%InputListe%" >> %ScriptLog%  
::	call :WRITELOG "Loesche Script %scriptdir%%sTitle%"  
::	Das eigentliche Script wird erst am Ende der Prozedur geloescht!
::	Siehe Abschnitt ENDE_AUSGANG
	goto :eof

:: ----------------------------------------------------------------------
:WRITELOG
:: ----------------------------------------------------------------------

::	Schreiben von Logmeldungen
	>> %ScriptLog% echo %date% %time% - %~1
	goto :eof

:: ----------------------------------------------------------------------
:: *** Fehler-Ausgaenge des Scripts
:: ----------------------------------------------------------------------

:FEHLER_LOGFILE
::	Logfile kann nicht angelegt werden
	call :WRITELOG "Errorlevel : %errorlevel%"  
	call :WRITELOG "ERROR: Fehler beim Anlegen der Log-Datei %ScriptLog% !"  
	call :WRITELOG "ERROR: %sTitle% kann nicht fortgesetzt werden."  
	echo ERROR: Fehler beim Anlegen der Log-Datei %ScriptLog% !	
	echo ERROR: %sTitle% kann nicht fortgesetzt werden.
	goto ENDE_AUSGANG

:FEHLER_SOURCEFILES
::	Inputdateien fuer das Skript fehlen
	call :WRITELOG "Errorlevel : %errorlevel%"  
	call :WRITELOG "ERROR: Fehlende Input-Dateien ("%INFfile%" oder '%InputListe%') !"  
	call :WRITELOG "ERROR: %sTitle% kann nicht fortgesetzt werden."  
	>> %ScriptLog% dir %scriptdir%
	goto ENDE

:FEHLER_OS
::	Client ist kein XP-Rechner
	call :WRITELOG "ERROR: Auf diesem System laeuft nicht das Betriebssystem Microsoft Windows XP Professional"  
	For /F "Delims=" %%j in ('ver') do call :WRITELOG "Betriebssystem: %%j"  
	call :WRITELOG "ERROR: %sTitle% kann nicht fortgesetzt werden."  
	goto :ENDE

:: ----------------------------------------------------------------------
:ENDE
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% ENDE

::	Bottomline in Logfile schreiben
	call :WRITELOG %LINE%
	call :WRITELOG "Ende %sTitle% on Node %ComputerName%"  
	call :WRITELOG %LINE%

:: ----------------------------------------------------------------------
:ENDE_AUSGANG
:: ----------------------------------------------------------------------

	If defined Tst echo %TstInfoMsg% ENDE_AUSGANG
	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):

 
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
...
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
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
...
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
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
...
Die Datei wurde mit Excel erstellt und als csv-Datei abgespeichert.


Ich bitte Euch um Eure Hilfe!
Danke
Flauschbobbel