Jump to content

Dateiinhalt in Variable


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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?

Link zu diesem Kommentar

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 :confused:

 

Thomas

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...