Nick22 11 Geschrieben 15. Dezember 2003 Melden Teilen Geschrieben 15. Dezember 2003 hallöle, ich habe mir ein kleines skript gebastelt, das verschiedene systeme auf verfügbarkeit prüft. wenn ein system nicht verfügbar ist, gibt der pc einen piepston aus. jetzt möchte ich das noch verfeinern. möchte die information, welches system nicht läuft, über "net send" verschicken call server.bat | findstr FALSE > test.txt -gibt einen text aus, der besagt, welches system nicht läuft und schreibt diesen in die datei gibt es dort eine möglichkeit die ausgabe in eine variable zu packen? (dann brauch ich den umweg über die datei nicht) net send RECHNERNAME ??? (eine datei kann ich nicht schicken) also muss ich den inhalt der datei test.txt in eine variable bekommen. wie mach ich das? nick Zitieren Link zu diesem Kommentar
BABA 11 Geschrieben 15. Dezember 2003 Melden Teilen Geschrieben 15. Dezember 2003 Lass Dir doch einfach die test.txt per Mail schicken. Dies könnte man mit dem Tool Blat realisieren. Nachdem Blat Dir die txt geschickt hat löscht Du die txt in der Batch und kannst sie neu erstellen lassen. Trifft das Deine Vorstellung? Zitieren Link zu diesem Kommentar
Nick22 11 Geschrieben 15. Dezember 2003 Autor Melden Teilen Geschrieben 15. Dezember 2003 email wäre auch ne nette idee, hatte ich auch schon dran gedacht, doch ein popup-fenster ist effektiver! danke aber schonmal, werde das mal testen. hat sonst noch wer ne idee?? Zitieren Link zu diesem Kommentar
Nick22 11 Geschrieben 15. Dezember 2003 Autor Melden Teilen Geschrieben 15. Dezember 2003 weiß also niemand mehr was? nick Zitieren Link zu diesem Kommentar
himbidas 10 Geschrieben 15. Dezember 2003 Melden Teilen Geschrieben 15. Dezember 2003 naja, wie sieht denn deine "server.bat" aus? möglich wäre z.B. folgendes: zu testenden Rechner kurz anpingen, das Ergebnis auswerten und entsprechend reagieren, z.B.: ping -w 1000 -n 1 192.168.1.1 | find "Antwort" 1>nul 2>nul goto:SPRUNG1%ERRORLEVEL% :SPRUNG10 rem hier wäre alles i.O. goto:SPRUNG1 :SPRUNG11 rem das wäre der Fehlerfall net send zumir "192.168.1.1 ist nicht erreichbar" :SPRUNG1 Deine "net send"-Geschichte hat aber den Nachteil, dass du entweder angemeldet sein musst (wenn "zumir" dein LOGIN ist), oder wenigstens dein PC laufen muss (wenn "zumir" dein Rechnername ist). Um, je nach Fall, das netsend nicht zu "verlieren", müsste dieser Zweig u.U. auch noch verfeinert werden. Also checken, ob net send erfolgreich war, wenn nicht, andere Möglichkeit realisieren (z.B. ein Textpaket auf eine versteckte Freigabe eines Servers legen lassen. Diese Freigabe prüfst du als Admin zyklisch , ob da was aufgelaufen ist). Thomas Zitieren Link zu diesem Kommentar
Nick22 11 Geschrieben 16. Dezember 2003 Autor Melden Teilen Geschrieben 16. Dezember 2003 hi thomas, erstmal danke für antwort, ich glaube da habe ich jemanden gefunden, der schon öfter sowas gemacht hat. also, die serverabfrage (und andere systeme wie router und internetverbindung) realisiere ich mit nem ping befehl und einer abfrage der ausgabe. die abfrage wird durch ein zweites skript gesteuert, damit nur fehler in dem skript erscheinen. server.bat: :SERVERSPRUNGPUNKT ping -n 2 123.456.789.123 | findstr (0% IF %ERRORLEVEL%==0 goto SERVEROK echo SERVER FALSE goto NEXTSERVER :SERVEROK echo SERVER OK server2.bat: call server.bat | findstr FALSE > test.txt IF %ERRORLEVEL%==1 goto OK call CSOUND 4186,2093,3136,1568,2637,1318,2093,1046(4),4186,2093,3136,1568,2637,1318,2093,1046(4) #macht nen sound echo Fehler im System: type test.txt date /t time /T net send "Rechnername" Hinweis, das ein Fehler vorliegt. in einem dritten skript wird diese ausgabe der server.bat noch in einer log-datei geschrieben. wenn ein fehler auftritt, zeigt mir das skript den string an, der den wert FALSE enthäht, somit habe ich sofort die information, was nicht klappt. so sieht die anzeige aus: Fehler im System: Internet FALSE Mo 15.12.2003 16:09 Die Nachricht wurde erfolgreich an "RECHNERNAME" gesendet. aber diese nachricht ist eine vordefinierte nachricht, die ich geschrieben habe, ich würde aber gerne den string "Internet FALSE" weiterschicken. nick Zitieren Link zu diesem Kommentar
Nick22 11 Geschrieben 16. Dezember 2003 Autor Melden Teilen Geschrieben 16. Dezember 2003 und noch ne frage dazu: ich würde gerne viel mit variablen arbeiten, bin aber neuling was schleifen in batch angeht und habe auch noch nix passendes gefunden, was mir bei folgenden problem weiterhilft. ich habe ja mehrere systeme, die ich abklapper mit dem befehl: -------------------------------------------------------------------------- :SERVERSPRUNGPUNKT ping -n 2 123.456.789.123 | findstr (0% IF %ERRORLEVEL%==0 goto SERVEROK echo SERVER FALSE goto NEXTSERVER :SERVEROK echo SERVER OK -------------------------------------------------------------------------- ist es möglich, dass ich das in einer abfrage vereinige, und die serverinformationen in eine variable packe? ich muss dann aber einen timer einbauen, der die batch nach der überprüfung der X systeme beendet. also: -------------------------------------------------------------------------- variable1=SERVER IP / NAME variable2=SERVER IP / NAME SERVERANZAHL=8 :START prüfe server "variableX" solange X<SERVERANZAHL X++ / X=X+1 goto START -------------------------------------------------------------------------- (logischer aufbau) wie kann ich das umsetzen? Zitieren Link zu diesem Kommentar
himbidas 10 Geschrieben 16. Dezember 2003 Melden Teilen Geschrieben 16. Dezember 2003 Hi Nick22 mit welchem OS arbeitest du denn? Ab NT4 würde ich dir empfehlen, anstatt BAT-Batches alles in CMD's zu verarbeiten. Der 32Bit-Kommandointerpreter CMD.EXE, der beim Aufruf von z.B. test.cmd bemüht wird, ist mächtiger und kann mehr. net send ist (wenn ich mich nicht täusche) in der Lage, Variablen zu verarbeiten. Teste doch mal folgendes: @echo off set nn=Nick22 net send meinpc Mein Name ist %nn%. meinpc wäre dabei der Name deines PC's ;) Für dein Problem mit der Anzahl zu prüfender Server wäre eine FOR-Schleife anzuwenden. Alle zu prüfenden Server trägst du in eine Textdatei (z.B. server.txt) ein. Für jeden Servernamen ein eigene Zeile. In der "Check-CMD" werden die dann alle nacheinander abgefragt: FOR /F %%a IN (server.txt) DO ping -w 1000 -n 1 %%a | find "Antwort" || net send meinpc Server %%a ist nicht erreichbar. Was macht das Teil? Die For-Schleife holt aus der server.txt zeilenweise jeden Servernamen raus und packt ihn in die Variable %%a (jaja, zwei %-Zeichen müssen sein in Batches), pingt diesen dann jeweils an und sucht in der Ping-Antwort den String "Antwort". Ist alles okay, passiert nix. Wird der String nicht gefunden, erfolgt weitere Verarbeitung nach dem Doppel-Pipe (||). Musst halt mal die Hilfe zu FOR, sowie die Hilfe zu Verkettungssymbolen lesen (&& = Weiterverabeitung, wenn vorangegangener Befehl erfolgreich; || = Weiterverarbeitung, wenn vorangegangener Befehl Fehler lieferte). Man muss da ein bissel testen, da das Verhalten von FOR-Schleifen mit gepipten Befehlen (hier: find) tlw. eine eigenartige Verarbeitung mit sich bringt. Kann das hier leider nur theoretisch aufzeigen. Hab hier kein NT oder XP zur Hand und bin bis Ende des Jahres im Urlaub. Vielleicht kann ja ein anderes Forenmitglied dazu noch was Brauchbares beitragen Thomas Zitieren Link zu diesem Kommentar
Nick22 11 Geschrieben 16. Dezember 2003 Autor Melden Teilen Geschrieben 16. Dezember 2003 hi himbidas, ja, ich benutze win2k. danke für die antwort. deine for-schleife ist super, die funktioniert echt gut. habe aber das problem, das ich bei "OK" oder bei "FEHLER" mehrere dinge machen will, desshalb kann ich das nicht in einer zeile schreiben. also bei fehler soll er bspw. eine email schreiben, eine log-datei füllen und .. irgendwas sonst noch. gibt es die möglichkeit ein anfang und ende einer schleife über mehrere zeilen zu machen? also: ------------------------------------------------------ for IRGENDWAS dann mache: DAS und DIES SONST DAS und DIES ------------------------------------------------------ oder kann ich das mit den "|" weitergeben? frage am rande: unterschied zwischen "|" und "||" ?? nick22 Zitieren Link zu diesem Kommentar
himbidas 10 Geschrieben 16. Dezember 2003 Melden Teilen Geschrieben 16. Dezember 2003 wenn die Weiterverarbeitung nicht in einer Zeile reicht, rufe doch einfach mit call batch.cmd eine weitere Unterroutine auf. Die wird abgearbeitet und nach deren Schluss kehrt sie zurück (wegen call). Müsste eigentlich funzen. Ist nur ein bissel schwierig, Variablen an den Call zu übergeben. Habe auch mal irgendwo gesehen, dass in CMD's quasi eigene Subroutinen möglich sind FOR /F %%a IN (server.txt) DO call:sub1 goto:end :sub1 ping -w 1000 -n 1 %%a | find "Antwort" 1>nul 2>nul if %ERRORLEVEL%==0{ rem hier wäre alles i.O. rem mache hier was ok macht} else { rem das wäre der Fehlerfall net send zumir %%a ist nicht erreichbar } :end Unterschied | und || einfacher Pipe | - verbindet zwei Befehle: ping server | find "string" Befehl 1 pingt server an. Die Ausgabe des 1. Befehls wird vom 2. Befehl "find" als Eingabe gewertet und entsprechend bearbeitet. Doppel-Pipe || - ist das Gegenstück zu && && Befehl wird abgearbeitet, wenn vorhergehender Befehl erfolgreich war net use x: \\server\freigabe && echo Netzlaufwerk verbunden... Gibt "Netzlaufwerk verbunden..." aus, wenn es verbunden wurde, ansonsten nix. || Befehl wird abgearbeitet, wenn vorhergehender Befehl NICHT erfolgreich war net use x: \\server\freigabe || echo Geht nicht, Laufwerksbuchstabe bereits in Benutzung... Gibt im Fehlerfall was aus, ansonsten nix. Dabei ist aber anzumerken, dass der Zustand, wann ein Befehl erfolgreich oder nicht war, recht unterschiedlich ist. Man muss da immer ein bissel experimentieren und für die Entwicklung mindestens beide Zustände simulieren, damit man auch weiss dass alles so eintritt, wie man will. Thomas Zitieren Link zu diesem Kommentar
himbidas 10 Geschrieben 16. Dezember 2003 Melden Teilen Geschrieben 16. Dezember 2003 hier noch ein kleines FOR-Script. z.B. um zu sehen, wie man die FOR-%%-Variablen mit normalen Variablen zusammen verarbeitet. Das Script benutzt das Ressourcekit-Tool isadmin.exe. Damit kann man prüfen, ob ein angemeldeter Benutzer Adminrechte hat, oder eben nicht. Da ich gerne Bescheid weiss, wer in meinem System wo und wann mit Adminrechten rumgeistert, schreibt das Script für jeden Adminaccount eine eigene Datei auf einer versteckten Freigabe eines Servers fort. Darin steht dann, auf welchem PC und wann sich der User angemeldet hat. So kann man leicht nachvollziehen, ob Adminpasswörter korrumpiert wurden. Bist du als einziger Admin nachts nicht da, das Log zeigt aber 23:40 uhr einen Adminzugriff auf PC xy, müsste man mal nachhaken. setlocal FOR /F "tokens=*" %%i IN ('date /t') do set a=%%i FOR /F "tokens=*" %%i IN ('time /t') do set b=%%i FOR /F "tokens=2" %%i IN ('isadmin') DO if "%%i"=="is" (echo %COMPUTERNAME%, %a%, %b%) >> \\server\freigabe$\admin_%USERNAME%.txt 2>nul endlocal Thomas Zitieren Link zu diesem Kommentar
Nick22 11 Geschrieben 17. Dezember 2003 Autor Melden Teilen Geschrieben 17. Dezember 2003 hi thomas, ich habe dein erstes skript ausprobiert und mit vielen variationen geändert: ----------------------------------------------------------------------------------- FOR /F %%a IN (server.txt) DO call:sub1 goto:end :sub1 ping -w 1000 -n 1 %%a | find "Antwort" 1>nul 2>nul if %ERRORLEVEL%==0{ rem hier wäre alles i.O. rem mache hier was ok macht} else { rem das wäre der Fehlerfall net send zumir %%a ist nicht erreichbar } :end ----------------------------------------------------------------------------------- die subroutine führt er aus, aber die variable %%a übergibt er einfach nicht an die subroutine. das 2. skript bin ich gerade am testen, das ist bestimmt nicht schlecht, um adminanmeldungen zu überprüfen. da werde ich mich nochmal mit beschäftigen. so langsam überlege ich, ob ich mir das nicht mit ner programmiersprache mache. danke dir aber schonmal, vielleicht fällt dir ja nochwas ein?! nick Zitieren Link zu diesem Kommentar
Nick22 11 Geschrieben 17. Dezember 2003 Autor Melden Teilen Geschrieben 17. Dezember 2003 hi thomas, ich bin damit jetzt endlich weitergekommen. immoment funktionieren die meisten bedingungen, die ich an das skript stelle, es ist aber noch verbesserungsfähig: (alles eine zeile) FOR /F %%a IN (server.txt) DO ping -w 1000 -n 1 %%a | find "Antwort" 1>nul 2>nul && echo Server OK: %%a || echo Server nicht erreichbar: %%a && call CSOUND 4186,2093,3136,1568,2637,1318,2093,1046(4),4186,2093,3136,1568,2637,1318,2093,1046(4) && net send RECHNERNAME Server %%a ist nicht erreichbar 1>nul 2>nul | IF %ERRORLEVEL%==0 blat -to email@adresse.de -subject Serverstatus -body Server %%a machte Probleme >> status.log die IF-anweisung, die eine email senden soll, wenn der nachrichtendienst nicht verfügbar ist, funktioniert nicht. und die protokollierung funktioniert auch nicht, aber das kann ich über ein call aus einer anderen batch machen. hast mir bis jetzt echt gut geholfen, danke dir nick Zitieren Link zu diesem Kommentar
himbidas 10 Geschrieben 17. Dezember 2003 Melden Teilen Geschrieben 17. Dezember 2003 naja, sag ich doch. Ist irgendwann sehr komplex und unüberschaubar, wenn man verkettet und mit erfolgsabhängigen Bedingungen arbeitet. Da kann man manchmal graue Haare bekommen. Das Problem mit den Variablen ist mir bekannt. Hab mich da auch schon echt oft verbogen. Deshalb hab ich auch mal das "Admin-Test-Script" reingestellt. Diese %%-Variablen sind ne besondere Art der Variablen durch die FOR-Klausel. Wenn's net funzt, versuche die %%-Variableninhalte an eine "normale" Variable zu übergeben --> ...do set myVar=%%a ->> danach %myVar% weiter in der Sub verwenden. Und aufpassen, falls du setlocal-endlocal verwendest. Dann muss die Sub natürlich innerhalb des setlocal-endlocal-Bereiches liegen. Ausserhalb sind die definierten Variablen nicht gültig. ach ja, Programmiersprache. Versuch's doch mal mit kixstart http://www.kixstart.org Ist ne mächtig gute "Kommandointerpreter-Erweiterung", mächtig, umfassend usw. Quellcodes gibt's zu Hauf im Net. Thomas Zitieren Link zu diesem Kommentar
Nick22 11 Geschrieben 18. Dezember 2003 Autor Melden Teilen Geschrieben 18. Dezember 2003 so, ich denke, ich habe fertig.. zumindest teilweise kannst dir das ja mal angucken. ist noch verbesserungsfähig, aber für den anfang solls reichen beachte readme, dann kann nix schiefgehen nick Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.