fixu
Goto Top

VBS - Sub soll um eine bestimme Uhrzeit gestartet werden

Ich habe ein VBS Script welches um 2:00 Uhr einen Prozess killt und den selbigen um 3:00 wieder startet. Dies habe ich in einem Skript mit 2 Subs gelöst, Sub kill und Sub start. Beide sind in einem loop da es täglich ausgeführt wird und das Script immer im Hintergrund läuft. Damit dies mit der Zeitplanung hin kommt, arbeite ich mit einem Sleep. Dies ist aber sehr mühsam, da jedes Mal bei einem Neustart des Skripts die Sleepdauer neu ausgerechnet und eingetragen werden muss. Daher möchte ich dies via Uhrzeit steuern. Sprich, wenn die Systemzeit = 2:00 Uhr starte Sub kill, wenn Systemzeit = 3:00 starte Sub start. Wie kriege ich das hin in VBS?

Content-ID: 115736

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

Ausgedruckt am: 23.11.2024 um 16:11 Uhr

16568
16568 11.05.2009 um 11:01:18 Uhr
Goto Top
MUHAHAHAHAHAHAHHAAHHAHAHA, selten so gelacht...

Frage: kennst Du den Taskplaner?

Machst Du 2x Script, eines für 2:00 Uhr, anderes für 3:00 Uhr...


Lonesome Walker
Fixu
Fixu 11.05.2009 um 11:05:50 Uhr
Goto Top
Grundsätzlich hast du Recht, es ist wie ein Task für den Tasklplaner. Aber auf der Maschine habe ich keine Berechtigung Tasks zu definieren, daher muss ich auf das VBS ausweichen. Und, lachst du noch immer? =)
60730
60730 11.05.2009 um 11:06:26 Uhr
Goto Top
Servus,

entweder wie LSW schon schrieb zwei scripte - oder:

  • wenn Dienst aktiv stoppen - und weiter im Text
  • wenn DIenst gestoppt starten - und weiter im Text

PS: DIe Kombination von:
Ich habe ein VBS Script
Wie kriege ich das hin in VBS?

Wird Hier nicht gerne gesehen - wenn dann das Script - wobei es egal ist ob es sich um VBS/CMD oder Trallala² handelt
- nicht "dabei" ist.

Gruß
Logan000
Logan000 11.05.2009 um 11:43:57 Uhr
Goto Top
Moin Moin

Zitat von @Fixu:
Grundsätzlich hast du Recht, es ist wie ein Task für den Tasklplaner.
Aber auf der Maschine habe ich keine Berechtigung Tasks zu definieren, daher muss ich auf das VBS ausweichen.
Und, lachst du noch immer? =)
Nun ich finde es zumindest erheiternd das du keine Task definieren darfst, aber Prozesse automatisch per Skript killen darfst.
Entweder du gibst deinen Account die Rechte oder du wendest dich an die Person die das darf.
Alles andere ist eher Klöterkram.

Gruß L.
Fixu
Fixu 11.05.2009 um 11:46:13 Uhr
Goto Top
Mit untem stehenden Skript wollte ich, dass bei erfolgreicher Übereinstimmung der Uhrzeit eine MsgBox kommt (diese würde nachher durch einen Sub Aufruf ersetzt). Jedoch funktioniert es nicht - ich nehme an es liegt an der Zeit Variable welche er nicht richtig interpretiert...

Option Explicit

Dim Zeit
Zeit="& time &"

Call Schleife

Sub Schleife
Do
Call Vergleich
loop
End Sub


Sub Vergleich
If Zeit = "11:41:30" Then
Info = MsgBox("Zeit ok", vbInformation, "Info")
else
end if
End Sub

Wscript.Quit
76109
76109 11.05.2009 um 12:10:39 Uhr
Goto Top
Hallo Fixu,

also wenn schon, dann muss es so heissen:
Zeit = "& time &"     Ergebnis = "& Time &"  
Zeit = ""& time &""   Ergebnis = "Time"  

Besser ist aber:
If Time = CDate("11:41:30") Then  

Gruß Dieter
Fixu
Fixu 11.05.2009 um 13:26:07 Uhr
Goto Top
Vielen Dank, habe das Ganze nun wie folgt gelöst:

Option Explicit

Dim objWMIService, objProcess, colProcess, WshShell
Dim strComputer, strProcessKill

Set WshShell = CreateObject("WScript.Shell")
strComputer = "."
strProcessKill = "'Datei.exe'"


Call Schleife

Sub Schleife
Do
wscript.sleep 1000
Call Vergleich
loop
End Sub

Sub Vergleich
If Time = CDate("02:00:00") Then
Call Kill
else If Time = CDate("03:00:00") Then
Call Start
End If End If
End Sub

Sub Kill
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = " & strProcessKill )
For Each objProcess in colProcess
objProcess.Terminate()
Next
End Sub

Sub Start
WshShell.Run "Hier kommt die .exe rein"
End Sub

Wscript.Quit
76109
76109 11.05.2009 um 13:43:55 Uhr
Goto Top
Hallo Fixu,

so wird das nicht funktionieren. Durch Dein Sleep, kannst Du keinen erfolgreichen Vergleich dürchführen.

In jedem Fall sollte ein Zeitfenster geprüft werden z.B.:

If Time >= CDate("02:00:00") And <=  CDate("02:01:00") Then  


Gruß Dieter
Fixu
Fixu 11.05.2009 um 13:55:55 Uhr
Goto Top
Hatte es vorhin mit Calc.exe getestet, da ging es problemlos. Den Sleep habe ich nur eingebaut, damit er nicht x mal pro Sekunde die Schlaufe durchgeht (CPU Auslastung) und den Wert 1000 musste ich nehmen da er mir sonst die Anwendung mehr als 1x gestartet hat.
76109
76109 11.05.2009 um 14:15:27 Uhr
Goto Top
Hallo Fixu,

stimmt, dass hatte ich jetzt nicht bedachtface-smile.

Aber dann könnte ma ja mit Time eine Variable auf True/False setzen und diese wiederum gegenseitig zurücksetzen oder zu einem späteren Zeitpunkt beide zurücksetzen. Nur so ein Gedanke.

Gruß Dieter

PS. Bleibt auch noch die Möglichkeit mit Zeitfenster das ganze Script zu überspringen.
77559
77559 11.05.2009 um 15:40:15 Uhr
Goto Top
IMO ist doch nur eine zusätzliche Abfrage nötig,

Im Zeitfenster Killen wenn läuft,
Ausserhalb starten wenn nicht läuft.

Option Explicit

Dim objWMIService, objProcess, colProcess, WshShell
Dim strComputer, strProcessKill
Dim Anfang, Ende
Set WshShell = CreateObject("WScript.Shell")  
strComputer = "."  
strProcessKill = "'Datei.exe'"  
Anfang = CDate("02:00:00")  
Ende = CDate("03:00:00")  

Call Schleife

Sub Schleife
  Do
    wscript.sleep 1000
    Call Vergleich
  loop
End Sub

Sub Vergleich
  If ((Time >= Anfang) And (Time <= Ende))
    Call Kill
  else
    Call Start
  End If
End Sub

Sub Kill
  Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" _  
    & strComputer & "\root\cimv2")  
  Set colProcess = objWMIService.ExecQuery _
    ("Select * from Win32_Process Where Name = " & strProcessKill )  
  For Each objProcess in colProcess
    objProcess.Terminate()
  Next
End Sub

Sub Start
   Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" _  
    & strComputer & "\root\cimv2")  
  Set colProcess = objWMIService.ExecQuery _
    ("Select * from Win32_Process Where Name = " & strProcessKill )  
  For Each objProcess in colProcess
    Exit Sub   ' Wenn Proc schon läuft brauchen wir nicht starten  
  Next
 WshShell.Run "Hier kommt die .exe rein"  
End Sub

Wscript.Quit

Gruß
LotPings

Edit Zeile 24 geändert; falsches if Then entsorgt
76109
76109 11.05.2009 um 17:54:34 Uhr
Goto Top
Hallo LotPings,

also, irgendwie steh ich jetzt auf 'm Schlauchface-smile

Die Funktion Kill und Start soll doch jeweils nur einmal ausgeführt werden oder?

und was ist bitte in Zeile 24:
else If Then

ist das auch ein Trick, den ich nocht nicht kenne.

Gruß Dieter
77559
77559 11.05.2009 um 18:19:09 Uhr
Goto Top
Nö, da hat sich mein Editor vergaloppiert und ich habs nicht gemerkt, soll nur ein else sein. Ich ändere das oben.

Da das Script nach der Änderung ja prüft ob der Process läuft, wird auch nur einmal ausserhalb des Zeitfensters gestartet.

Umgekeht wird innerhalb des Zeitfensters ja kein Process mehr gefunden der gestoppt werden könnte wenn er nicht läuft.

Gruß
LotPings
76109
76109 11.05.2009 um 18:42:48 Uhr
Goto Top
Hallo LotPings,

aja, hab ich doch glatt übersehen, dass Du den unteren Teil auch geändert hastface-smile


Gruß