Quantcast
Channel: Robert Kraus – krausens-online.de
Viewing all articles
Browse latest Browse all 71

Druckserver 2/7: Netzwerkdrucker automatisiert abfragen (cmd)

$
0
0

Um das Auslesen der Drucker auf den Druckservers zu automatisieren, war der erste Gedanke eine Batch-Datei zu schreiben – ich komm halt aus der Dos-Zeit. Mein erstes Probelem war der Aufruf eines Powershell-Befehls aus einer „CMD“. Eigentlich blöd, aber es dauerte etwas, bis mir das auffiel….

Mein erstes Problem war das Aufrufen eines Powershell-Befehls aus einer CMD-Datei.
Es war dann aber doch einfacher als gedacht.

powershell -command "& {&'Get-WmiObject' -class Win32_Printer -Computer Printserver01.firma.lan | select Name, PortName, Sharename, Location, Systemname | Export-Csv C:\Printserver01.csv }"

Bzw für alle 3 Druckserver der Aufruf als Schleife:

For %%a in (Printserver01 Printserver02 Printserver03) do (
powershell -command "& {&'Get-WmiObject' -class Win32_Printer -Computer %%a.firma.lan | select Name, PortName, Sharename, Location, Systemname | Export-Csv C:\___skript\%%a.csv }"
)

So mit hatte ich schonmal 3 CSV-Dateien. Jetzt sollte daraus nur noch eine Datei werden.
Da die CSV-Dateien 2 Kopfzeilen haben (1. Zeile Typenbezeichnung und dann die Spaltenbeschriftung), kann ich diese nicht einfach aneinanderfügen.
Der Befehl Export-CSV kann zwar die Typenangaben unterdrücken (Export-CSV -NoTypeInformation) , aber die Spaltenbeschriftungen würden beibehalten. Also verzichte ich darauf und schneide beide Kopfzeilen selber ab.

set /a i=0
set datei=C:\___skript\Printserver01.csv
for /f "tokens=1,* delims=" %%a in (%datei%) do call :zeile %%a
goto :ende

:zeile
set /a i+= 1
if %i% gtr 2 echo %* >> C:\___skript\komplett_temp.csv
goto :eof

:ende
exit 0

Das Ganze natürlich für alle 3 CSV-Dateien.

Da diese Datei nun aber auch den Microsoft XPS-Drucker, sowie den Freepdf- und einen Fineprint-Drucker installiert haben , und diese nicht in der Liste auftauchen sollten, muss die Gesamt-CSV-Datei noch „bereinigt“ werden.

findstr /v "XPS FreePDF FinePrint" C:\___skript\komplett_temp.csv > C:\___skript\komplett.csv

Im Grund wars das. Das komplette Skript sieht dann so aus

@echo off
setlocal

rem #################################################################
rem   Prüfen, ob Datei komplett.csv schon exitiert
rem #################################################################

if exist C:\___skript\komplett.csv (
    echo Bereinige alte Files
    del C:\___skript\komplett.csv
)
   Printserver02.firma.lan
rem #################################################################
rem   Auslesen der existierenden Drucker von jedem Printserver
rem   via Powershell-Abfrage
rem #################################################################

For %%a in (Printserver01 Printserver02 Printserver03) do (
powershell -command "& {&'Get-WmiObject' -class Win32_Printer -Computer %%a.firma.lan | select Name, PortName, Sharename, Location, Systemname | Export-Csv C:\___skript\%%a.csv }"
)

rem #################################################################
rem   Die einzelnen CSV-Dateien zusammen führen und dabei die
rem   ersten beiden Kopfzeilen entfernen
rem #################################################################
echo kombiniere Daten in komplett.csv
setlocal
set /a i=0
set datei=C:\___skript\Printserver01.csv
for /f "tokens=1,* delims=" %%a in (%datei%) do call :zeile %%a

set /a i=0
set datei=C:\___skript\Printserver02.csv
for /f "tokens=1,* delims=" %%a in (%datei%) do call :zeile %%a

set /a i=0
set datei=C:\___skript\Printserver03.csv
for /f "tokens=1,* delims=" %%a in (%datei%) do call :zeile %%a
goto :ende

rem #################################################################
rem   Routine zum abtrennen der ersten beiden Zeilen
rem #################################################################

:zeile
set /a i+= 1
if %i% gtr 2 echo %* >> C:\___skript\komplett_temp.csv
goto :eof

rem #################################################################
rem   Beginn abschließender Befehle
rem #################################################################
:ende
echo bereinige CSV-Datei
findstr /v "XPS FreePDF FinePrint" C:\___skript\komplett_temp.csv > C:\___skript\komplett.csv

echo loesche nicht mehr benoetigte Files
del C:\___skript\Printserver01.csv
del C:\___skript\Printserver02.csv
del C:\___skript\Printserver03.csv
del C:\___skript\komplett_temp.csv

endlocal

exit 0

Das Skript funktioniert und wird nun Werktags stündlich zwischen 7:00 bis 17:00 Uhr aufgerufen.
Läuft!
OK OK.
Das Zusammenfügen der einzelnen Dateien hätte ich auch in die Schleife integrieren können, aber da kam mir der Feierabend dazwischen …

… und ein Geistesblitz:
Warum verarbeite ich einen Powershellbefehl in einer Batch-Datei und nicht gleich in Powershell.

Gut – liegt vermutlich darin, dass ich mich mit Powershell nicht so wirklich befasst habe und somit ein leichtes Wissensdefizit habe.

Ein Grund, aber kein Hinderniss.
Weiter gehts im Teil 3


Viewing all articles
Browse latest Browse all 71