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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 86044
Url: https://administrator.de/contentid/86044
Ausgedruckt am: 22.11.2024 um 15:11 Uhr
28 Kommentare
Neuester Kommentar
Hallo Flauschbobbel!
Für erste Tests unter den einfachsten Voraussetzungen (nur eine IP-Adresse, Maske 255.255.255.0) etwa so:
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
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
)
)
)
Grüße
bastla
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:
Um dennoch allen %ipadrX% vorweg Werte zuzuweisen, müsste die "call"-Zeile ohne Anführungszeichen geschrieben werden und das Unterprogramm etwa so beginnen:
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):
Zu Deinem Randproblem: Es sollte schon genügen, nach dem letzten %-Zeichen der Zeile das schließende Anführungszeichen zu setzen ...
Grüße
bastla
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
if "%1" neq "" set ipadr1=%1
if "%2" neq "" set ipadr2=%2
...
if defined ipadr1 echo Installation mit IP: %ipadr1%
Grüße
bastla
Hallo Flauschbobbel!
nicht nachvollziehen ...
Grüße
bastla
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
Grüße
bastla
Hallo Flauschbobbel!
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:
Selbst wenn Du ziemlich sicher sein solltest, dass in Deinem Batch daraus kein Problem entstünde, brauchst Du die "delayedexpansion" eigentlich nicht (siehe oben).
Etwas reduziert könnte der Batch dann bis hierher so aussehen:
Grüße
bastla
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".Kannst Du mir das erklären?
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
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 /?" :
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
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
Hallo Flauschbobbel!
Vorweg: Sorry - hatte leider Deinen Beitrag vom Donnerstag nicht mitbekommen ...
Dass zu viele Ports installiert werden, liegt daran, dass jede Zeile nur daraufhin untersucht wird, ob mindestens eine der enthaltenen IP-Adressen im Netz des Rechners liegt - diese Abfrage muss dann aber auch noch für jede einzelne Adresse durchgeführt werden (ist im Entwurf unten jetzt berücksichtigt).
Das Thema "Drucker da, Port aber nicht" muss ich leider etwas vertagen ...
Wie Biber schon angemerkt hat, kann anstelle von "echo." mit gleichem Erfolg auch "echo\" geschrieben werden - zu letzterer Schreibweise bin ich übergegangen, nachdem ich von Problemen mit der "."-Schreibweise gelesen hatte ...
Neuer Entwurf:
Grüße
bastla
Vorweg: Sorry - hatte leider Deinen Beitrag vom Donnerstag nicht mitbekommen ...
Dass zu viele Ports installiert werden, liegt daran, dass jede Zeile nur daraufhin untersucht wird, ob mindestens eine der enthaltenen IP-Adressen im Netz des Rechners liegt - diese Abfrage muss dann aber auch noch für jede einzelne Adresse durchgeführt werden (ist im Entwurf unten jetzt berücksichtigt).
Das Thema "Drucker da, Port aber nicht" muss ich leider etwas vertagen ...
Wie Biber schon angemerkt hat, kann anstelle von "echo." mit gleichem Erfolg auch "echo\" geschrieben werden - zu letzterer Schreibweise bin ich übergegangen, nachdem ich von Problemen mit der "."-Schreibweise gelesen hatte ...
Neuer Entwurf:
@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
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):
Das Prüfen der Unterverzeichnisse könnte etwa so aussehen:
Was den Rest anlangt, muss ich Dich noch vertrösten ...
Grüße
bastla
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
Hallo Flauschbobbel!
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:
Grüße
bastla
... sorry für meine verspätete Antwort ...
Na, in dieser Hinsicht hast Du ja noch einiges gut ... Zu Deinem Entwurf:
Die Festlegung des Druckernamens erfolgte zwar an mehreren Stellen, aber etwas spät (Du willst ihn ja eigentlich schon bei der Auswertung der "wmic"-Abfrage verwenden) - ist in der neuen Version korrigiert; ebenso, dass die IP-Adresse ev doppelt angefügt worden wäre.
Außerdem habe ich die Verwendung des Schalters "InstDR" umgekehrt - wenn er im Unterprogramm gesetzt wird, bekommt das aufrufende Programm diese Tatsache nicht mit.
Das Löschen der Variablen am Ende wäre reiner Luxus - das "setlocal" am Anfang sorgt ohnehin dafür, dass neu hinzugekommene Variablen das Ende des Batches "nicht überleben".
Neu hinzugekommen ist die Berücksichtigung der "Subnet Mask", wobei die für den Client gültige Maske ja ohnehin ebenfalls per "ipconfig" ausgelesen werden kann - eine Erfassung in der .csv-Datei ist daher nicht nötig.
Die Schleife im Hauptprogramm ließ sich etwas vereinfachen, indem das Auslesen der Client-Daten (IP-Adresse, Maske) vorweg erfolgt und die Ergebnisse in Variablen für die weiteren Programmteile zur Verfügung gehalten werden.
Im Unterprogramm ":INSTALLATION" war die Abfrage "if defined InstIP" überflüssig, da dieses Unterprogramm ja ohnehin nur bei gesetztem Schalter "InstIP" aufgerufen wird.
Noch ein Detail (aber eher nur kosmetischer Natur): Die Variable %STitle% erhält jetzt ihren Wert aus Name und Typ der Batchdatei (ist etwas flexibler).
So sieht's nun aus:
@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
und eine (hoffentlich letzte) Anregung:
Diese gefühlte 100x nach gleichem Muster auftauchenden LogMeldungen...
würde ich über einen Call:Block abfackeln:
Grüße
Biber
Diese gefühlte 100x nach gleichem Muster auftauchenden LogMeldungen...
...
echo %date% %time% - Standard TCP/IP-Port %IPPortName% noch nicht vorhanden >> %AddPrntLog%
.....
Call:WriteLog "Standard TCP/IP-Port %IPPortName% noch nicht vorhanden"
....
...
goto :eof
:WriteLog
>> %AddPrntLog% echo %date% %time% - %~1
:goto eof
Grüße
Biber
Hallo Flauschbobbel!
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
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
Hallo Flauschbobbel!
Die verwendete Vorgangsweise:
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:
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
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"
)
:: 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%
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
Hallo Flauschbobbel!
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:
Da die "Indices" gleich sind, "passt" der Drucker.
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
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 |
---|---|
0 | 0 - 15 |
1 | 16 - 31 |
2 | 32 - 47 |
3 | 48 - 63 |
4 | 64 - 79 |
5 | 80 - 95 |
6 | 96 - 111 |
7 | 112 - 127 |
8 | 128 - 143 |
9 | 144 - 159 |
10 | 160 - 175 |
11 | 176 - 191 |
12 | 192 - 207 |
13 | 208 - 223 |
14 | 224 - 239 |
15 | 240 - 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"
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