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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 85568
Url: https://administrator.de/contentid/85568
Ausgedruckt am: 22.11.2024 um 15:11 Uhr
10 Kommentare
Neuester Kommentar
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:
Den Standort kannst Du entweder als Parameter beim Aufruf oder über Konsole eingeben.
Grüße
bastla
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
Grüße
bastla
... um dann aber doch zumindest einem Teil des Thread-Titels gerecht zu werden:
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
@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
Grüße
bastla
Hallo Flauschbobbel!
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:
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:
Grüße
bastla
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
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
Na, Flauschbobbel, das weiß sogar ich...
.. irgendwo weiter oben im Batch.
oder sogar:
Grüße
Biber
.. irgendwo weiter oben im Batch.
Set "Trennlinie=------------------------------------------------------------------------------------------------------------"
.....
.....
:: wenns gebraucht wird.
echo %Trennlinie% >> woEsSchönSeinSoll.txt
...
....
Call :ZiehNeLinie
...
....
goto :eof
:ZiehNeLinie
:: ohne variable
echo ------------------------------------------------------------------------------------------------------------ >> %AddPrntLog%
goto :eof
Grüße
Biber
@Biber
@Flauschbobbel
Grüße
bastla
... das weiß sogar ich...
Der war gut ... @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.Wie kann ich das unterbinden?
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
Hallo Flauschbobbel!
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
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