Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

VBScript Server Statusabfrage, Probleme bei der Ausgabe

Frage Entwicklung VB for Applications

Mitglied: DenebCH

DenebCH (Level 1) - Jetzt verbinden

20.04.2010, aktualisiert 20:54 Uhr, 5773 Aufrufe, 14 Kommentare

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
01.
Dim inhalt(50) 
02.
Set MyShell = CreateObject("WScript.Shell") 
03.
Set MyFiles = CreateObject("Scripting.FileSystemObject") 
04.
 
05.
 
06.
Set InfoZeile = MyFiles.OpenTextFile("C:\ServerChecks\Logfile.txt",1) 
07.
Do  
08.
	n=n+1 
09.
       Inhalt(n) = InfoZeile.ReadLine 
10.
	if Inhalt(n)="" then n=n-1 
11.
Loop Until InfoZeile.AtEndOfStream = True  
12.
  
13.
 
14.
For x = 1 to n  
15.
	Proggi = "%comspec% /c ping.exe -n 1 -a" & " " & Inhalt(x) & " " & ">>c:\ServerChecks\temp.txt" 
16.
	Return = MyShell.Run(Proggi,0,True)  
17.
	Set TempFile =MyFiles.OpenTextFile("C:\ServerChecks\temp.txt")        
18.
       Abfrage = Tempfile.Readall 
19.
        If instr(Abfrage, "ytes=") > 0 Then 
20.
		 Ausgabe = MsgBox("Host " + Inhalt(x) + " ist Online...", 1, "ServerCheck") 
21.
	 Else 
22.
		 Ausgabe = MsgBox("Host " + Inhalt(x) + " ist Offline...", 1, "ServerCheck") 
23.
	End if 
24.
	tempfile.close 
25.
       If Ausgabe = 2 Then WScript.Quit 
26.
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 ¦ 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]
Mitglied: ChrFriedel
20.04.2010 um 11:50 Uhr
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
01.
dim string 
02.
 
03.
string="test" 
04.
string=string & vbLf & "test2" 
05.
 
06.
msgbox(string)
vbLF steht dabei für einen LineFeed, also eine neue Zeile der Übersicht halber...

grüße
Bitte warten ..
Mitglied: LotPings
20.04.2010 um 11:58 Uhr
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
Bitte warten ..
Mitglied: DenebCH
20.04.2010 um 13:57 Uhr
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.


@LotPings 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.
Bitte warten ..
Mitglied: ChrFriedel
20.04.2010 um 14:45 Uhr
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 ;)
Bitte warten ..
Mitglied: DenebCH
20.04.2010 um 15:00 Uhr
01.
For x = 1 to n  
02.
	Proggi = "%comspec% /c ping.exe -n 1 -a" & " " & Inhalt(x) & " " & ">>c:\ServerChecks\temp.txt" 
03.
	Return = MyShell.Run(Proggi,0,True)  
04.
	Set TempFile =MyFiles.OpenTextFile("C:\ServerChecks\temp.txt")        
05.
       Abfrage = Tempfile.Readall 
06.
        If instr(Abfrage, "ytes=") > 0 Then 
07.
		dim string 
08.
 
09.
			string=Inhalt(x) 
10.
			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  
11.
                                                                                                                                     begriffen habe##  
12.
			 
13.
			 
14.
	 Else 
15.
		 'noch offen 
16.
	End if 
17.
 
18.
 
19.
	tempfile.close 
20.
 
21.
        If Ausgabe = 2 Then WScript.Quit 
22.
msgbox(string) 
23.
 
24.
Next   
25.
  
Bitte warten ..
Mitglied: LotPings
20.04.2010 um 16:11 Uhr
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.

01.
' PingList.vbs 
02.
Option explicit 
03.
Dim Fso, PingList, WshShell, Ausgabe 
04.
 
05.
Set Fso = CreateObject("Scripting.FileSystemObject") 
06.
Set PingList = fso.OpenTextFile("PingList.Txt") 
07.
Set WshShell = WScript.CreateObject("WScript.Shell") 
08.
Ausgabe = "" 
09.
 
10.
Do While Not (PingList.atEndOfStream) 
11.
  Ausgabe=Ausgabe & PingHost(PingList.ReadLine) & vbCRLF  
12.
Loop 
13.
 
14.
MsgBox Ausgabe, 0, "Ping Ergebnisse" 
15.
 
16.
Function PingHost(HostName) 
17.
	Dim Ping 
18.
	Ping = WshShell.Run("ping -n 1 -a " & HostName, 0, True) 
19.
	Select Case Ping 
20.
		Case 0 PingHost = "On  Line: " & HostName 
21.
		Case 1 PingHost = "Off Line: " & HostName 
22.
	End Select 
23.
End Function
Edit: Zeile 06 musst du natürlich anpassen
Bitte warten ..
Mitglied: DenebCH
21.04.2010 um 09:38 Uhr
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.
Bitte warten ..
Mitglied: ChrFriedel
21.04.2010 um 10:57 Uhr
Hi Deneb,

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

Der Teil

01.
string=Inhalt(x) 
02.
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 
03.
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
Bitte warten ..
Mitglied: DenebCH
23.04.2010 um 07:23 Uhr
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.

01.
  
02.
Option explicit  
03.
Dim Fso, Servicelist, WshShell, Ausgabe, WL, text  
04.
 
05.
Set Fso = CreateObject("Scripting.FileSystemObject")  
06.
Set Servicelist = fso.OpenTextFile("serviceliste2.txt")  
07.
Set WshShell = WScript.CreateObject("WScript.Shell")  
08.
Set WL = fso.OpenTextFile("text.txt")  
09.
text = wl.ReadLine 
10.
Ausgabe = ""  
11.
 
12.
 
13.
Do While Not (serviceList.atEndOfStream)  
14.
	Ausgabe=Ausgabe & ServiceCheck(serviceList.ReadLine) & vbCRLF   
15.
Loop  
16.
 
17.
MsgBox Ausgabe, 0, "Service Status Check "  
18.
 
19.
Function ServiceCheck(ServiceName) 
20.
	Dim Service 
21.
	##red|Service = WshShell.Run("sc query " & ServiceName & "| FIND /I "STATE              : 4  RUNNING"", 0, True)rot,##  
22.
	Select Case Service 
23.
		Case 0 ServiceCheck = " Gestartet: " & ServiceName  
24.
		Case 1 ServiceCheck = " Gestoppt: " & ServiceName  
25.
	End Select 
26.
End Function 
27.
 
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
01.
@echo off 
02.
sc query AVP| find /I "STATE              : 4  RUNNING" 
03.
IF "%ERRORLEVEL%"=="0" GOTO RUNNING 
04.
 
05.
:STOPPED 
06.
ECHO NOT RUNNING 
07.
GOTO END 
08.
 
09.
:RUNNING 
10.
ECHO RUNNING 
11.
 
12.
:END  
13.
pause 
14.
 
Bitte warten ..
Mitglied: ChrFriedel
23.04.2010 um 10:11 Uhr
Moin,

Könnte das helfen?

01.
Service = WshShell.Run("sc query " & ServiceName & "| FIND /I" & "STATE : 4 RUNNING", 0, True)
Sicher bin ich mir aber nicht.

grüße
Bitte warten ..
Mitglied: DenebCH
23.04.2010 um 10:28 Uhr
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
Bitte warten ..
Mitglied: LotPings
23.04.2010 um 13:13 Uhr
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 Code Tags einbetten!
Bitte warten ..
Mitglied: Biber
23.04.2010 um 17:15 Uhr
[OT]
Zitat von LotPings:
Du solltest zur besseren Lesbarkeit unbedingt deinen Code in entsprechende Code Tags einbetten!

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

Grüße
Biber
[/OT]
Bitte warten ..
Mitglied: Biber
26.04.2010 um 07:57 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Windows Server
Windows-File-Server - Macs - Probleme (5)

Frage von guenthergranate zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 unter Windows 10 hat Probleme mit Exchange Server 2010 (3)

Frage von Speedflo zum Thema Outlook & Mail ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (22)

Frage von patz223 zum Thema Windows Userverwaltung ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (19)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...