denebch
Goto Top

VBScript Server Statusabfrage, Probleme bei der Ausgabe

Hallo zusammen,

Ich habe folgendes Problem Ich habe hier ein VBScript das Server aus einer Liste per Ping abfragt ob sie erreichbar sind oder eben nicht,
und dann den Servernamen + Online oder eben Offline ausgibt.

Nun das funktioniert auch soweit, nur das Problem ist das für jede Anfrage eine neue Msgbox aufgeht und ich das aber in einer einzelnen
Messagebox brauche.

Hier erstmal das Script zur Abfrage des Serverstatuses
Dim inhalt(50)
Set MyShell = CreateObject("WScript.Shell")  
Set MyFiles = CreateObject("Scripting.FileSystemObject")  


Set InfoZeile = MyFiles.OpenTextFile("C:\ServerChecks\Logfile.txt",1)  
Do 
	n=n+1
       Inhalt(n) = InfoZeile.ReadLine
	if Inhalt(n)="" then n=n-1  
Loop Until InfoZeile.AtEndOfStream = True 
 

For x = 1 to n 
	Proggi = "%comspec% /c ping.exe -n 1 -a" & " " & Inhalt(x) & " " & ">>c:\ServerChecks\temp.txt"  
	Return = MyShell.Run(Proggi,0,True) 
	Set TempFile =MyFiles.OpenTextFile("C:\ServerChecks\temp.txt")         
       Abfrage = Tempfile.Readall
        If instr(Abfrage, "ytes=") > 0 Then  
		 Ausgabe = MsgBox("Host " + Inhalt(x) + " ist Online...", 1, "ServerCheck")  
	 Else
		 Ausgabe = MsgBox("Host " + Inhalt(x) + " ist Offline...", 1, "ServerCheck")  
	End if
	tempfile.close
       If Ausgabe = 2 Then WScript.Quit
Next    
Wie gesagt es funktioniert soweit nur bei über 40 Servern ist es echt nervend wenn jeder Server in einem eigener Msgbox auftaucht.
Mein Gedanke zur lösung ist das die Daten nicht gleich ausgegeben werden sondern erst in ein Array geschrieben werden und das Komplette
Array dann in einer einzelnen Msbbox dargestellt wird.

Ich denke der ansatz Stimmt ¦ lasse mich da aber gerne korrigieren face-wink ¦ nur das umsetzen da hackt es gewaltig

vielleicht kann mir ja hier jemand helfen wäre sehr froh darüber

Gruss
Deneb

[Edit Biber] Codetags nachgetragen. [/Edit]

Content-ID: 141028

Url: https://administrator.de/contentid/141028

Ausgedruckt am: 25.11.2024 um 20:11 Uhr

ChrFriedel
ChrFriedel 20.04.2010 um 11:50:40 Uhr
Goto Top
Also ich denk der Ansatz ist okay. Du solltest eben statt der Ausgabe mit MsgBoxen einen String zusammenbauen und den am Ende in einer Msgbox ausgeben. Hier ganz kurz das Prinzip dazu
dim string

string="test"  
string=string & vbLf & "test2"  

msgbox(string)

vbLF steht dabei für einen LineFeed, also eine neue Zeile der Übersicht halber...

grüße
77559
77559 20.04.2010 um 11:58:02 Uhr
Goto Top
Oder du gibst in ein Consolenfenster aus
Oder du verpackst das Script in eine hta mit eigener Gui
oder du schickst die Ausgabe an den Internet-Explorer.

Viele Wege führen nach Rom, die obigen 3 erzeugen eine kontinuierliche Ausgabe

Gruß
LotPings
DenebCH
DenebCH 20.04.2010 um 13:57:31 Uhr
Goto Top
Hallo und danke erstmal für die schnellen Antworten.

@ChrFriedel, ja das mit den Strings hört sich auch gut an habs auch mal versucht einzubauen aber ich bekomme nicht das geünschte ergebniss
ich habe nur noch 4 Server in der Liste die ich im Eingangs Post erwähnt habe damit das ganze übersichtlicher bleibt. nun nach dem ich das mit den
Strings versuchte kam ich zwar ein Resultat aber nicht wie gewünscht sondern es zeigt mir den ersten und den letzten Server an aber die 2 dazwischen
leider nicht.

Das Problem wird sein das ich einfach nocht kein gefühl für die abläufe habe da ich mit VBScript erst paar Tage arbeite.


@77559 das sind natürlich alles schöne Macharten und in zukunft sicher auch Sachen die von mir angestrebt werden aber zur Zeit bekomme
ich nicht mal dieses verhältnissmässig einfache Script hin.
ChrFriedel
ChrFriedel 20.04.2010 um 14:45:07 Uhr
Goto Top
Dann poste mal bitte den Teil in dem du die Strings zusammenbaust.

ohne kann man leider keine Tipps geben warum nur der erste und der letzte berücksichtigt werden ;)
DenebCH
DenebCH 20.04.2010 um 15:00:22 Uhr
Goto Top
For x = 1 to n 
	Proggi = "%comspec% /c ping.exe -n 1 -a" & " " & Inhalt(x) & " " & ">>c:\ServerChecks\temp.txt"  
	Return = MyShell.Run(Proggi,0,True) 
	Set TempFile =MyFiles.OpenTextFile("C:\ServerChecks\temp.txt")         
       Abfrage = Tempfile.Readall
        If instr(Abfrage, "ytes=") > 0 Then  
		dim string

			string=Inhalt(x)
			string=string & vbLf & inhalt(n) ##red| Hier bin ich mir einfach nicht sicher wie weiter, oder eher bin ich mir sicher das ich das noch nicht 
                                                                                                                                     begriffen habe## 
			
			
	 Else
		 'noch offen  
	End if


	tempfile.close

        If Ausgabe = 2 Then WScript.Quit
msgbox(string)

Next  
  
77559
77559 20.04.2010 um 16:11:10 Uhr
Goto Top
Hallo DenebCH,

dein Ansatz ist eigentlich unnötig komplex.
Du kannst die gelesenen Zeilen direkt verarbeiten ohne Array.
Der Rückgabewert des Ping sollte ausreichen (Wenn nicht, ist die direkte Verarbeitung der Ausgabe von oExec günstiger als eine Temp-Datei)
Die Formatierung mit Code Tags in der Forumsoftware macht das Script lesbarer.
Das Kapseln in Funktionen vereinfacht den Aufbau.

' PingList.vbs  
Option explicit
Dim Fso, PingList, WshShell, Ausgabe

Set Fso = CreateObject("Scripting.FileSystemObject")  
Set PingList = fso.OpenTextFile("PingList.Txt")  
Set WshShell = WScript.CreateObject("WScript.Shell")  
Ausgabe = ""  

Do While Not (PingList.atEndOfStream)
  Ausgabe=Ausgabe & PingHost(PingList.ReadLine) & vbCRLF 
Loop

MsgBox Ausgabe, 0, "Ping Ergebnisse"  

Function PingHost(HostName)
	Dim Ping
	Ping = WshShell.Run("ping -n 1 -a " & HostName, 0, True)  
	Select Case Ping
		Case 0 PingHost = "On  Line: " & HostName  
		Case 1 PingHost = "Off Line: " & HostName  
	End Select
End Function

Edit: Zeile 06 musst du natürlich anpassen
DenebCH
DenebCH 21.04.2010 um 09:38:39 Uhr
Goto Top
Hallo LotPings

Danke dir ja so funktioniert es einwandfrei.

Warum es so kompliziert aussah, ich wollte hier erst mal mein Wissen schritt für schritt aufbauen und das Script dann als Hilfe für ein anderes Script verwenden... Ich wollte erst mal eine saubere Ausgabe erreichen damit ich dann das Script so anpassen kann das es
dem Ping auch die uptime abfragt.

Da für uns die Uptime auch sehr wichtig ist.

Der nächste Schritt wäre ein zweites Script das anstelle des Servers die Services überprüft da wir ein Paar wichtige services haben und diese gerne durch ein kleines Script checken wollen ob gestartet oder gestoppt.
ChrFriedel
ChrFriedel 21.04.2010 um 10:57:47 Uhr
Goto Top
Hi Deneb,

also die Lösung haste ja schon erhalten. Aber vielleicht nochmal zum Verständnis warum dein Code nicht funktioniert hat.

Der Teil

string=Inhalt(x)
string=string & vbLf & inhalt(n) Hier bin ich mir einfach nicht sicher wie weiter, oder eher bin ich mir sicher das ich das noch nicht
begriffen habe 

kann so nicht funktionieren. Du weist quasi im ersten schritt den inhalt an den String zu. Soweit okay. Dann hängst du an den String mittels der & symbole einen Zeilenumbruch und nochetwas an. Auch okay. Allerdings musst du bedenken das du in einer Schleife bist. Das heißt beim 2ten Durchlauf überschreibst du den Inhalt des Strings mit dem ersten Statement wieder. Das heißt alles was bisher im String stand ist nun wieder weg. Außerdem ist deine msgbox ebenfalls in der Schleife und wird somit solange die Variable Ausgabe auf 2 steht auch in jedem Durchlauf aufgerufen. Das war ja das was du nicht wolltest ;)

Aber wie gesagt das nur alles um dir vielleicht ein wenig beim Verständnis für Schleifen zu helfen.

grüße
DenebCH
DenebCH 23.04.2010 um 07:23:20 Uhr
Goto Top
Hallo LotPings,
habe da noch ne kleine frage.

Habe nun das script einwenig für die zweite aufgabe verändert, Genau wie oben soll es aus einer Liste auslesen aber anstelle von Servernamen stehen da die namen von gewissen Servicen die laufen und geprüft werden sollen. Und dann auch wieder die Ausbe in einer MSGbox.

 
Option explicit 
Dim Fso, Servicelist, WshShell, Ausgabe, WL, text 

Set Fso = CreateObject("Scripting.FileSystemObject")   
Set Servicelist = fso.OpenTextFile("serviceliste2.txt")   
Set WshShell = WScript.CreateObject("WScript.Shell")   
Set WL = fso.OpenTextFile("text.txt")   
text = wl.ReadLine
Ausgabe = ""   


Do While Not (serviceList.atEndOfStream) 
	Ausgabe=Ausgabe & ServiceCheck(serviceList.ReadLine) & vbCRLF  
Loop 

MsgBox Ausgabe, 0, "Service Status Check "   

Function ServiceCheck(ServiceName)
	Dim Service
	##red|Service = WshShell.Run("sc query " & ServiceName & "| FIND /I "STATE              : 4  RUNNING"", 0, True)rot,##  
	Select Case Service
		Case 0 ServiceCheck = " Gestartet: " & ServiceName   
		Case 1 ServiceCheck = " Gestoppt: " & ServiceName   
	End Select
End Function

Die Zeile die rot ist macht das Problem ich muss ja mit "" das einführen des Codes anzeigen habe aber in meinem code beim FIND schon "" und das scheint Probleme zu machen ich habe es schon versucht mit den einzelnen ' aber das klappt nicht.

Der Code sc query %Servicename% | FIND /I "STATE : 4 RUNNING habe ich getestet mit einer Batch datei und er funktioniert wie gewünscht nur êben das einfügen in dieses Script macht noch schwierigkeiten. siehst du vll denn Fehler den ich mache?

So habe ich den Cde in einer Batchdatei geprüft
@echo off
sc query AVP| find /I "STATE              : 4  RUNNING"  
IF "%ERRORLEVEL%"=="0" GOTO RUNNING  

:STOPPED
ECHO NOT RUNNING
GOTO END

:RUNNING
ECHO RUNNING

:END 
pause
ChrFriedel
ChrFriedel 23.04.2010 um 10:11:30 Uhr
Goto Top
Moin,

Könnte das helfen?

Service = WshShell.Run("sc query " & ServiceName & "| FIND /I" & "STATE : 4 RUNNING", 0, True)  

Sicher bin ich mir aber nicht.

grüße
DenebCH
DenebCH 23.04.2010 um 10:28:34 Uhr
Goto Top
Hallo ChrFriedel,

habs ausprobiert aber das Script macht keinen Wank, kein Fehlercode kein Fenster das auf geht, einfach nada....

Ich bin mir nicht mehr sicher ob es an dem "" liegt.... ich habe das folgende script das ich als test für den sc query befehl geschrieben habe abgeändert und bei STATE : 4 Running die " durch ' ersetzt und es hat immer noch funktioniert.

mache ich das aber hier Service = WshShell.Run("sc query " & ServiceName & "| FIND /I 'STATE : 4 RUNNING'", 0, True)
hat es keine wirkung
77559
77559 23.04.2010 um 13:13:00 Uhr
Goto Top
Hallo Deneb,

Um Anführungszeichen innerhalb eines Vbstrings zu erhalten kannst du :
  • den Ascii Code nutzen:
set text = "Das " &  chr(34) & "-Zeichen"
  • Innerhalb des Textes ein 3-faches Anführungszeichen setzen
set text = "Das """-Zeichen"

Wobei mir im moment nicht klar ist ob du den Errorlevel des find überhaupt durchgereicht bekommst, oder das nur den Errorlevel des Wshrun zurückgibt.

Du brauchst aber das Rad auch nicht neu erfinden, mit WMI kannst du innerhalb von Vbscript die Services direkt abfragen dazu gibt es reichlich Beispiele im Internet

Gruß
Lotpings

Du solltest zur besseren Lesbarkeit unbedingt deinen Code in entsprechende einbetten!
Biber
Biber 23.04.2010 um 17:15:09 Uhr
Goto Top
[OT]
Zitat von @77559:
Du solltest zur besseren Lesbarkeit unbedingt deinen Code in entsprechende einbetten!

Oder, anders formuliert, manchmal werden schlecht lesbare Beiträge in andere Bereiche umgebettet. Speziell Montag morgens.

Grüße
Biber
[/OT]
Biber
Biber 26.04.2010 um 07:57:24 Uhr
Goto Top
BTW, DenebCH,

Zitat von @Biber:
Oder, anders formuliert, manchmal werden schlecht lesbare Beiträge in andere Bereiche umgebettet. Speziell Montag morgens.
übrigens ist gerade JETZT Montag morgens.... *sensibilisier*

Grüße
Biber aka der Sanftmütige