flauschbobbel
Goto Top

IP-Adresse aus Excel auslesen und Netzwerkdrucker installieren

Hallo Zusammen,

ich bin neu bei Euch, habe ein für mich größeres Problem und hoffe Ihr könnt mir weiterhelfen (und bin hoffentlich im richtigen Forum:


Ich habe eine Excelliste, in der habe ich IP-Adressen von zukünftigen Druckern in unterschiedlichen
Standorten. Die Liste hat ca. 800 Zeile/Standorte.

Bsp:
Standort-ID;Ansprechpartner;bla;bla;IP-Adr1 ;IP-Adr2 ;IP-Adr3;...
4711 ;Müller ;bla;bla;10.132.10.11;10.132.10.120; --- ;...
0815 ;MAier ;bla;bla;10.126.19.18; --- ; --- ;...

Ich möchte via eines Batchs aus der ExcelListe die IP-Adressen für zukünftige Netzwerkdrucker in verschieden Standorten
auslesen und installieren.
Mein Batch soll auf allen Clients (auf allen läuft WinXP) am jeweiligen Standort laufen und
alle Drucker die für diesen Standort vorgesehen sind sollen auf allen Clients installiert werden.
D.h. sie sollen unter "Drucker und Faxgeräte" zu sehen sein.
Der Batchjob soll keinen Output auf einem Client schreiben, sondern alle Infos sollen in einem Logfile im TEMP-Verzeichnis des Clients abgelegt werden.

Erschwerend kommt hinzu, dass die physikalische Installation der Drucker zeitlich unterschiedlich sein wird.
D.h. Der Batch soll einmal laufen, die benötigten IP-Adressen aus der Excelliste ziehen, prüfen ob dieser Adresse
bereits ein Standard-TCP/IP-Post zugewiesen wurde (dann wäre die Installation auf dem Client bereits gelaufen),
wenn nicht einen Standard TCp/IP-Port anlegen und den Drucker installieren.

Die physikalischen Drucker werden danach zu unterschiedlichen Zeiten/Tagen/Wochen in den einzelnen Standorten aufgebaut.
Über das Bedienfeld des Druckers bekommen sie vom Aufstell-Techniker ihre IP-Adresse und Subnetmask, werden am Netzwerk
angeschlossen und das war's. Anschliessend soll der Benutzer sofort darauf drucken können.

Ich habe schon mal etwas herumprobiert:
- Prüfen, ob eine IP-Adresse (Standard-Port) in der Registry vorhanden ist funktioniert mit REG QUERY...
- IP-Adresse in die Registry eintragen und die entsprechend benötigten Schlüssel setzen funktioniert auch soweit mittels REG ADD...
- Anschliessend muss ich die Druckerwarteschlange stoppen/starten (net stop/start Spooler): OK
- Die benötigten Druckertreiber kann ich mittels rundll32 printui.dll,PrintUIEntry.... auch einbinden und eine Testseite kann ich auch automatisch hiermit erstellen. Soweit, so gut.

Mein Riesenproblem an dem ich nun seit Tagen rumdoktere ist das Auslesen aus der Excelliste.
Hier komme ich einfach nicht weiter. In der Registry auf jedem Client ist die jeweilige Standort-ID hinterlegt.

Könnt ihr mir hier auf die Sprünge helfen?
Ich habe keinerlei Kenntnisse zu VBS, WSH usw. Daher möchte ich die Aufgabe mittels DOS-Commands im Batch lösen.
Herzlichen Dank schon mal im voraus.

Grüße,
Flauschbobbel

Content-ID: 85568

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

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

bastla
bastla 15.04.2008 um 16:32:19 Uhr
Goto Top
Hallo Flauschbobbel und willkommen im Forum!

Es sollte doch genügen, die Liste als CSV-Datei zu speichern und mit einer "for /f"-Schleife die mit "findstr" herausgefilterten Standortdaten zu zerlegen und weiter zu verarbeiten - auf Basis Deines Beispiels oben etwa so:
@echo off & setlocal
set "Liste=D:\Deine CSV-Datei.csv"  

if "%~1" neq "" (set "Standort=%~1") else set /p "Standort=Bitte Standort-ID eingeben: "  

for /f "tokens=5-7 delims=;" %%i in ('findstr /b "%Standort%" "%Liste%"') do call :ProcessLine %%i %%j %%k  
echo Fertig.
goto :eof

:ProcessLine
set "IP1=%~1"  
set "IP2=%~2"  
set "IP3=%~3"  

echo %IP1% %IP2% %IP3%

::
:: hier weitere Befehle
::

goto :eof
Den Standort kannst Du entweder als Parameter beim Aufruf oder über Konsole eingeben.

Grüße
bastla
bastla
bastla 15.04.2008 um 17:21:26 Uhr
Goto Top
... um dann aber doch zumindest einem Teil des Thread-Titels gerecht zu werden:
@echo off & setlocal
set "Liste=D:\Deine XLS-Datei.xls"  
set "Tab=Tabelle1"  
set "Ab=2"  
set "Spalten=8"  

set "R=%temp%\ReadXL.vbs"  
echo Set XL=WScript.CreateObject("Excel.Application"):Set oWB=XL.Workbooks.Open("%Liste%")>%R%  
echo Z=%Ab%:With oWB.Worksheets("%Tab%"):Do While .Cells(Z,1)^<^>"":L=.Cells(Z,1):For i=2 To %Spalten% >>%R%  
echo L=L^&";"^&.Cells(Z,i):Next:WScript.Echo L:Z=Z+1:Loop:End With:oWB.Saved=True:XL.Quit>>%R%  

if "%~1" neq "" (set "Standort=%~1") else set /p "Standort=Bitte Standort-ID eingeben: "  

for /f "tokens=5-7 delims=;" %%i in ('cscript //nologo %R%^|findstr /b "%Standort%"') do call :ProcessLine %%i %%j %%k  

del %R%
echo Fertig.
goto :eof

:ProcessLine
set "IP1=%1"  
set "IP2=%2"  
set "IP3=%3"  

echo %IP1% %IP2% %IP3%

::
:: hier weitere Befehle
::

goto :eof
Hier werden ab Zeile 2 (solange die erste Spalte Einträge enthält) jeweils die ersten 8 Spalten der "Tabelle1" der angegebenen Excel-Datei ausgelesen und (analog zur obigen Variante) an den Batch zum Filtern und Verarbeiten übergeben.

Grüße
bastla
Flauschbobbel
Flauschbobbel 15.04.2008 um 19:04:42 Uhr
Goto Top
Hallo bastla,

herzlichen Dank für Dein schnelles und umfangreiches Feedback.
Sorry, dass ich Dich nochmal nerve, aber kannst Du mir eine kurze Erklärung zu dem Batch geben: Für was steht "%~1"? Die Variable in dieser Form habe ich noch nicht gesehen.

Anstelle die Standord-ID einzugeben, kann ich diese ja auch aus der Registry abfragen:
"Ist der Client, auf dem dieses Script läuft, identisch mit der Standort-ID aus der Liste"
Wenn ja, geht es weiter in Deinem Beispiel mit for /f ...
(Hatte ja geschrieben, dass ich die Standrt-ID in der Registry des Clients stehen habe)

Hilf mir auch hier bitte nochmal weiter: ... do call :ProcessLine ... Für was steht das?

...bei Deinem 2. Beispiel habe ich auch noch ein Vertständnisproblem:
Du rufst innerhalb der Batch ein vbs-Script auf? Sorry, aber irgendwie blicke ich die Syntax nicht ganz.

Danke und viele Grüße,
Flauschbobbel
bastla
bastla 15.04.2008 um 19:51:17 Uhr
Goto Top
Hallo Flauschbobbel!

Sorry, dass ich Dich nochmal nerve ...
Wie kommst Du auf "nerven"?

Für was steht "%~1"? Die Variable in dieser Form habe ich noch nicht gesehen.
Bedeutet nur, dass der dem Batch übergebene erste Parameter ohne umgebende Anführungszeichen (wenn es denn welche geben sollte) verwendet werden soll - so kann ich sicher sein, dass nur von mir selbst gesetzte Anführungszeichen vorhanden sein werden.

Anstelle die Standord-ID einzugeben, kann ich diese ja auch aus der Registry abfragen:
Damit hast Du natürlich Recht, es sollte aber eigentlich zum Testen ein eigenständiger Batch werden - wenn es bereits eine passende Variable gibt, kannst Du diese einfach anstelle von %Standort% einsetzen.

do call :ProcessLine ... Für was steht das?
Damit wird ein weiterer Batch aufgerufen, der allerdings in der selben Datei steht - praktisch ein Unterprogramm. Erforderlich ist das, weil sich die nötigen Aktionen nur bedingt sinnvoll direkt in der "for"-Schleife unterbringen lassen. Dieses Unterprogramm verhält sich übrigens im Prinzip genauso, als hättest Du eine weitere externe Batchdatei gestartet - die übergebenen Parameter sind zB auch hier mit %1 bis %3 bezeichnet.

Du rufst innerhalb der Batch ein vbs-Script auf? Sorry, aber irgendwie blicke ich die Syntax nicht ganz.
Zunächst erstelle ich mit den "echo"-Zeilen das Script (wobei teilweise im Script "fest verdrahtet" die variablen Werte Datei- und Tabellenname oder Zeilen/Spalten abgelegt werden und einige Zeichen - etwa ">" - durch ein vorangestelltes "^" maskiert werden müssen, damit sie nicht als Batch-Sonderzeichen interpretiert werden).

Dann rufe ich es einfach über "cscript" auf, wobei durch die "for"-Schleife die Ausgabe gleich weiter verarbeitet werden kann.

Wenn Du die Zeile "del %R%" vorübergehend entfernst, kannst Du Dir das Script auch (im "Temp"-Ordner des angemeldeten Users) ansehen - mit den Werten aus meinem Beispiel sieht es so aus:
Set XL=WScript.CreateObject("Excel.Application"):Set oWB=XL.Workbooks.Open("D:\Deine XLS-Datei.xls")  
Z=2:With oWB.Worksheets("Tabelle1"):Do While .Cells(Z,1)<>"":L=.Cells(Z,1):For i=2 To 8   
L=L&";"&.Cells(Z,i):Next:WScript.Echo L:Z=Z+1:Loop:End With:oWB.Saved=True:XL.Quit  
Da ich gerne ein paar Zeilen spare, habe ich es auf das Nötigste gekürzt/komprimiert - eine längere (und etwas kommentierte) Fassung sähe so aus:
Set XL = WScript.CreateObject("Excel.Application") 'Zum Zugriff auf Excel das entsprechende Objekt erzeugen  
Set oWB = XL.Workbooks.Open("D:\Deine XLS-Datei.xls") 'Datei öffnen  

iZeile = 2 'Beginne in Zeile 2  

With oWB.Worksheets("Tabelle1") 'Verwende in weiterer Folge "Tabelle1" der geöffneten Exceldatei  
	Do While .Cells(iZeile,1) <> "" 'Solange in Spalte 1 der aktuellen Zeile ein Inhalt steht ...  
		Line = .Cells(iZeile,1) '... erzeuge eine neue Zeile mit diesem Inhalt ...  
			For i = 2 To 8 '... und füge aus den Spalten 2 bis 8 dieser Zeile ...  
				sLine = sLine & ";" & .Cells(iZeile,i) '... die dortigen Inhalte jeweils nach einem ";" an  
			Next
		WScript.Echo sLine 'Gib die fertige Zeile aus  
		iZeile = iZeile + 1 'Weiter zur nächsten Zeile  
	Loop 'bis Ende der Daten erreicht (kein Wert mehr in der ersten Spalte)  
End With

oWB.Saved=True 'Damit die Datei ohne Rückfrage geschlossen werden kann, erkläre sie für "bereits gespeichert"  
XL.Quit 'Beende Excel  

Grüße
bastla
Flauschbobbel
Flauschbobbel 16.04.2008 um 21:38:16 Uhr
Goto Top
Hallo bastla,

zunächst herzlichen Dank für Deine Hilfe. Habe heute mal an meinem Batch weiter gebastelt und dabei ist mir folgendes aufgefallen. Hier benötige ich nochmal Deine Hilfe:
Ich habe Deinen ersten Post genommen und an meine Batch angepasst. Ich habe in meiner Liste max. 4 IP-Adressen, also %IP1% bis %IP4%. Ich hatte ja geschrieben, dass meine Excelliste wie folgt aufgebaut ist:

Standort-ID; bla ; bla; IP1 ; IP2 ; IP3 ; IP4 ; bla ; Bla ; bla ; Bemerkung
4711 ; bla ; bla ; 192.168.1.100 ; 192.168.1. 110 ; ; ; bla ; Bla ; bla ; irgendeine Info
0815 ; bla ; bla ; 192.168.1.200 ; ; ; ; bla ; bla ; bla;

In der Zeile, in der bei Bemerkung nichts steht (in meinem Beispiel die Zeile 0815) wird Deine Beispielprozedur einwandfrei ausgeführt. Sobald, wie bei Zeile 4711, etwas in der Spalte Bemerkung steht, werde die Teile dieser Spalte beim Anzeigen von %IP4% dargestellt.
Wie kann ich das unterbinden?

Dann habe ich folgenden Eintrag vorgenommen:

if "%~1" neq "" (set "Standort=%~1") else set /p "Standort=Bitte Standort-ID eingebenface-sad4475:82) "
for /f "tokens=10 delims=;" %%i in ('findstr /b "%Standort%" "%InputListe%"') do call :ProcessLine %%i
for /f "tokens=11 delims=;" %%i in ('findstr /b "%Standort%" "%InputListe%"') do call :ProcessLine %%i
for /f "tokens=12 delims=;" %%i in ('findstr /b "%Standort%" "%InputListe%"') do call :ProcessLine %%i
for /f "tokens=13 delims=;" %%i in ('findstr /b "%Standort%" "%InputListe%"') do call :ProcessLine %%i
:: echo Fertig mit Suche in Excelliste.
goto CLEANUP

:: --------------------------------------------------------------
:ProcessLine
...
Hier mache ich folgendes:
- IP-Adresse in Registry eintragen für %ipadr% und %IPPortName%
- Druckerwarteschlange anhalten/starten für %ipadr% und %IPPortName%
- Druckertreiber hinzufügen für %ipadr% und %IPPortName%
- Logischen Drucker einrichten für %ipadr% und %IPPortName%
- Druckereinstellungen einrichten für %ipadr% und %IPPortName%
- Testseite ausdrucken für %ipadr% und %IPPortName%
goto :eof
:CLEANUP
...

Im Abschnitt IP-Adress in Registry eintragen mache ich folgendes:
:: --------------------------------------------------------------
:Check_IP
:: --------------------------------------------------------------
::
:: *** Prüfen, ob der Standard TCP/IP-Port bereits existiert
:: und in der Registry eingetragen ist
::
echo %date% %time% - Prüfen, 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%
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v IPAddress >> NUL
:: Errorlevel=0 Wert in der Registry vorhanden
:: Errorlevel=1 Wert in der Registry nicht vorhanden
if %errorlevel% == 1 echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden >> %AddPrntLog%
if %errorlevel% == 0 echo %date% %time% - Standard TCP/IP-Port %IPPortName% bereits eingetragen >> %AddPrntLog%
if %errorlevel% == 0 goto :eof
::if %errorlevel% == 0 goto ADD_PRINTER_DRIVER ????????????????
echo. >> %AddPrntLog%

Das Funktioniert aus soweit, aber gibt es eine Möglickeit das etwas eleganter zu schreiben?
Kann ich die Abfrage der Errorlevel (0) irgendwie zusammenfassen?
Zum Einen soll die Info ins Logfile (%AddPrntLog%) geschrieben werden und das Unterprogramm verlassen werden.

Und zum guten Schluß (ich weiß nicht ob es hierhin gehört): Wie kann ich elegant folgende Zeile im mein Logfile schreiben?
echo ------------------------------------------------------------------------------------------------------------ >> %AddPrntLog%
Muss ich die Linies so darstellen, oder gibt es eine anderen Weg.? Ich möchte nämlich nach jedem Step eine Trennlinie im Logfile haben, finde es aber blöd jedesmal das so darzustellen.

Wenn es Dir hilft, kann ich auch das ganze Script mal hier posten.

Schon mal herzlichen dank vorab Für Deine Hilfe!
Herzliche Grüße vom geschlauchten Flauschbobbel
Biber
Biber 16.04.2008 um 22:12:12 Uhr
Goto Top
Na, Flauschbobbel, das weiß sogar ich...

.. irgendwo weiter oben im Batch.
Set "Trennlinie=------------------------------------------------------------------------------------------------------------"  
.....

.....

:: wenns gebraucht wird.
echo %Trennlinie% >> woEsSchönSeinSoll.txt
...
oder sogar:
....
Call :ZiehNeLinie
...

....
goto :eof

:ZiehNeLinie
:: ohne variable
echo ------------------------------------------------------------------------------------------------------------ >> %AddPrntLog%
goto :eof

Grüße
Biber
bastla
bastla 16.04.2008 um 22:45:05 Uhr
Goto Top
@Biber
... das weiß sogar ich...
Der war gut ... face-wink

@Flauschbobbel
Sobald, wie bei Zeile 4711, etwas in der Spalte Bemerkung steht, werde die Teile dieser Spalte beim Anzeigen von %IP4% dargestellt.
Wie kann ich das unterbinden?
Dein Beispiel hatte gestern noch einen "Ansprechpartner" vor "bla;bla", und die IP-Adressen begannen bei Token 5 (beim heutigen Beispiel wär's 4) - insofern kann ich mit "tokens=10" nicht viel anfangen. Poste bitte 2 Originalzeilen, und bitte verwende dafür und für die Batchzeilen jeweils < code>-Tags.
Kann ich die Abfrage der Errorlevel (0) irgendwie zusammenfassen?
ZB so:
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\%IPPortName%" /v IPAddress > NUL  
if %errorlevel%==0 (
	echo %date% %time% - Standard TCP/IP-Port %IPPortName% bereits eingetragen >> %AddPrntLog%
	::goto ADD_PRINTER_DRIVER ????????????????
	goto :eof
) else (
	echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden >> %AddPrntLog%
)
echo\ >> %AddPrntLog%

Grüße
bastla
Flauschbobbel
Flauschbobbel 16.04.2008 um 23:02:34 Uhr
Goto Top
Hallo bastla,

Danke für Dein Feedback.

@Flauschbobbel
> Sobald, wie bei Zeile 4711, etwas in
der Spalte Bemerkung steht, werde die Teile
dieser Spalte beim Anzeigen von %IP4%
dargestellt.
> Wie kann ich das unterbinden?
Dein Beispiel hatte gestern noch einen
"Ansprechpartner" vor
"bla;bla", und die IP-Adressen
begannen bei Token 5 (beim heutigen Beispiel
wär's 4) - insofern kann ich mit
"tokens=10" nicht viel anfangen.
Poste bitte 2 Originalzeilen, und bitte
verwende dafür und für die
Batchzeilen jeweils < code>-Tags.

Sorry, gib mir bitte einen Tipp was Du mit -Tags meinst.

Hier der Inhalt meines Excelsheets (CSV-Datei)
:
Standort_ID;Standort_Nr_OZ;Standortschlüssel;PLZ;Ort;Straße;Ansprechpartner;Anzahl Netzwerkdrucker geplant;IP-Switch notwendig;"IP-Switch
Termin";IP-Adresse 1.;IP-Adresse 2.;IP-Adresse 3.;IP-Adresse 4.;Dosennr. 1.;Dosennr. 2.;Dosennr. 3.;Dosennr. 4.;Status Dosen;LAN Connect
1.;LAN Connect 2.;LAN Connect 3.;LAN Connect 4.;Patchkabel gelegt;Strom gelegt;Aufstellplatz vorbereitet;System-ID 1.;Komponenten-ID 1.;Seriennr. 1;System-ID 2.;Komponenten-ID 2.;Seriennr. 2.;System-ID 3.;Komponenten-ID 3.;Seriennr. 3.;System-ID 4.;Komponenten-ID 4.;Seriennr. 4.;Status Drucker;Bemerkung

4475:82;8,40153E+11;447582;85757;Karlsfeld;Kroosstr. 21;Schweer;2;nein;;192.168.1.225;192.168.1.226;192.168.1.255;

40643:59;8,40155E+11;4064359;86150;Augsburg;Holderweg. 93;Fischer;3;nein;;10.32.41.117;10.32.41.118;;;;;;;;;;;;;;;;;;;;;;;;;;;;Es werden nur 2 Netzwerkdrucker benötigt - 7 FE im GGFT und 1 FE im SFDR und 1 FE im Keller!

04:38;8,40155E+11;438;89407;Dillingen;Am Berg 32;Förster;2;nein;;160.54.136.75;beantragt;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Brauchst Du noch das komplette Batchfile?

Grüße
Flauschbobbel
bastla
bastla 16.04.2008 um 23:21:37 Uhr
Goto Top
Hallo Flauschbobbel!

gib mir bitte einen Tipp was Du mit -Tags meinst.
Gemeint war eine Kombination von < code> und < /code> (jeweils ohne Leerzeichen), um den Teil dazwischen mit einer Schrift fixer Breite (anstatt proportional) zu formatieren und ansonsten den Text unverändert wiederzugeben (wie etwa meine Batch-Listings oben).
Inzwischen ist mir das Problem klargeworden: Unmittelbar aufeinander folgende Trennzeichen (";") werden in einer "for /f"-Schleife nur als jeweils eines gezählt - Abhilfe schaffen kannst Du eigentlich nur in der Excel-Tabelle selbst, indem Du zumindest für alle 4 IP-Adressen einen Eintrag vornimmst. Wenn keine Adresse vergeben ist, genügt ein "-" oder sogar ein Leerzeichen - wichtig ist nur, dass die Zelle nicht gänzlich leer bleibt.

Grüße
bastla
Flauschbobbel
Flauschbobbel 17.04.2008 um 00:03:13 Uhr
Goto Top
Hallo bastla und biber,

Klasse! Vielen Dank für Eure Hilfestellung und Rücksicht auf nervige Fragen eines Newbie in diesem Umfeld. Ihr habt mir sehr weitergeholfen.

Grüße,
Flauschbobbel