Teil 1: Allgemeine Problemstellungen

Shell Scripting unter Windows

Ausgabezeilen verändern

Diese Anforderung tritt häufig auf, ist aber meist ein “kosmetisches” Problem bei Ausgaben von Shell Scripts. Ein Ansatz ist es, die Ausgabe über Backquoting in einer zweiten for-Schleife zu übernehmen. Diese kann dann einzelne Teile der Ausgabe mit eigenem Text oder anderen Umgebungsvariablen mischen. Das nachfolgende Codestück zeigt einen solchen Ansatz. Hier wird die Ausgabe von sc per find gefiltert. Das Resultat wird als Kommandoersetzung an die innere Schleife übergeben und das vierte Wort für die Ausgabe verwendet.

C.\tmp>for %f in (silicony bytebag 192.168.229.11) do @for /F "usebackq tokens=4" %m in (`sc \\%f query dns ^|find "STATE"`) do @echo Server %f : %m
Server silicony : RUNNING
Server 192.168.229.11 : RUNNING
C:\tmp>

Hierbei sind auch weitergehende Unterscheidungen möglich. Wenn Sie im obigen Beispiel Ihre eigenen Server in die Liste der ersten Schleife einsetzen und das Kommando ausprobieren, werden Sie feststellen, dass nur die Zeilen ausgegeben werden, bei denen die Abfrage erfolgreich war. Daher müsste die Ausgabe eigentlich auch testen, ob sc einen Fehler meldet. Das Filtern per find muss entfernt werden, und als Kommando für die innere Schleife wird eine Abfrage eingebaut, die auf das Wort „Fehler“ prüft (das Beispiel gilt für die deutsche Version von Windows, für die englische bauen Sie die Zeile bitte entsprechend um, oder Sie prüfen auf die Fehlernummer).

C:\tmp >for %f in (silicony bytebag 192.168.229.11) do @for /F "usebackq tokens=1,2,3,4" %m in (`sc \\%f query dns`) do @if %m == STATE (echo %f : %p) ELSE if %o ==FEHLER (echo %f : Fehler bei Abfrage)
silicony : RUNNING
bytebag : Fehler bei Abfrage
192.168.229.11 : RUNNING
C:\tmp >

Ein Kommando wie das obige wird in der Regel für eine wiederkehrende Abfrage (beispielsweise morgens beim Checkup der Server) benutzt. Also sollten wir die Lesbarkeit verbessern und den Code auch gleich als Bachdatei anlegen (obwohl Sie aus der Zeile oben auch problemlos ein Makro bauen könnten). Dabei werden wir auch gleich die Lesbarkeit der Ausgabe dadurch verbessern, dass die Rechnernamen sauber linksbündig ausgerichtet in einer 16 Zeichen breiten Spalte stehen.

Hier der erste Teil des Shell Scripts. Im Prinzip ist es nichts anderes als das interaktive Kommando, nur dass in der Schleife die Sprungmarke check per call angesprungen wird. Dieser wird der jeweils aktuelle Eintrag aus der Schleifenliste als Parameter übergeben.

@echo off
setlocal
for /F "usebackq tokens=2" %%f in (silicony bytebag 192.168.229.11)
do call :check %%f
endlocal
goto :eof