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.
1 |
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:
1 2 3 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 |
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.
1 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
@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