derregistrar
Goto Top

VBScript - Shutdowndialog mit Timer

Shutdown Dialog anzeigen mit Timer bis automatisch heruntergefahren oder durch den Benutzer über den Dialog abgebrochen wird.

Liebes Forum,

schon häufig habe ich mich bei IT-Problemen an Google gewandt und bin auf Euch gestossen um von der unglaublich tollen Hilfe etwas abzuschöpfen... Ihr habt mir bei so einigen Problemen weitergeholfen - VIELEN DANK DAFÜR!! Im Übrigen eine unglaublich vorbildliche Programmierung des Forums, habe bisher noch NIE ein so benutzerfreundliches gesehen, nicht nur die Programmierung - Auch die ART DER HILFE! - Revolution! (OK genug geschleimt ^^)

Nun zu meinem Problem!

Hintergrund:
Ich bin schon seit nunmehr 6 Stunden damit beschäftigt, den Laptop meiner werten Mutti wieder etwas mehr zu automatisieren.
Da meine liebe Mutti oft den Laptop mitsamt Video vor dem Einschlafen neben sich stehen lässt und es nicht mehr schafft ihn auszumachen. (Ein bisschen Öko bin ich ja schon)
Für die Umsetzung meiner Idee benötige ich die Möglichkeit, den Computer: Windows Vista, x86 (32-Bit) - Automatisch herunterfahren zu lassen, sobald keine Aktivität mehr vorhanden ist.

Einfach Programm aus dem Internet nutzen? - Will ich nicht! - Warum:
Dies lässt sich mit zwar mit externen Programmen (Autoshutdown etc.) realisieren, jedoch fehlt mir darin einfach die Transparenz, da solche Programme nicht OpenSource sind und ich mich bzw. meine Mutti 1. Performancemässig im Nachteil sehe, außerdem 2. Die Sicherheit fehlt, dass das Programm keinen Quatsch anstellt (Ala unnötige Registry-/Dll-/Treiber-Einträge o. ä.). - Das System soll ABSOLUT SAUBER vor solchem Quatsch bleiben, deswegen kommen auch nur die nötigsten und sinnvollsten Programme auf diesen Rechner.
Ich bitte diesbezüglich keine Diskussion anzufangen, ich möchte schließlich einen Lösungsweg zu meinem Problem der Realisierung dieser Idee (Das selbstständige Programmieren/Scripten einer solchen Dienstleistung) und nicht des (nichtvorhandenen Problemes) der "Nicht-Einsicht" bzw. der Nichtakzeptierung fremder Software. - Sofern das jemand annehmen sollte. - Ich möchte nicht diskutieren wie sinnvoll es ist, denn das ist es für mich.
- Gebe ich nur deswegen an, da in vielen Foren diskutiert wird warum und wie sehr man etwas möchte -

Meine Realisierungsidee:
Ich wollte das ganze nun per VBS-Script realisieren, konnte es aber in keinster Weise in eine Funktionalität zustandebringen, die weiterbrachte - meine Lösungsidee war nun, das Script um eine bestimmte Uhrzeit (22:30 Uhr) starten zu lassen, damit es:
Einen Dialog anzeigt mit der Frage, ob der Computer heruntergefahren werden soll.
Falls Nein, sollte das Script dann 1 Stunde warten und diesen Dialog erneut anzeigen.
Falls Ja, sollte das Script den Computer bei Ablauf der 5 Minuten ab dem Anzeigen des Dialoges ohne Wenn und Aber herunterfahren.
Falls 5 Minuten keine Eingabe im Dialog geschieht, soll der Computer ohne Wenn und Aber herunterfahren.

Mein Script (bin nicht stolz auf "Mein" Script, sondern möchte hier nur hervorheben damit man beim Überfliegen schnell findet was man sucht :P)
hatte viele verschiedene Aussehen, jedes mal in VBS, konnte jedoch keine Lösung erarbeiten.
Aktuell sieht es so aus:
set wshell = CreateObject("Wscript.shell")  

Dim Dialog, Waiting, a

Dialog=0
Waiting=0
a="leer"  
Do While (Running=1)

	Do While (Dialog=0) AND (Waiting=0)
		Dialog=1
		Waiting=0
		runterfahren = MsgBox("Soll der Computer in 5 Minuten heruntergefahren werden?", vbYesNo + vbQuestion, "Herunterfahren")  
		If runterfahren = vbNo Then
			ab = MsgBox("Der Computer wird nicht heruntergefahren. Erneuter Versuch in 1 Stunde.", vbOK, "Herunterfahren")  
			Waiting=-3599700
		Else If runterfahren = vbYes Then
		Dialog=0
		Waiting=301
		End If
	Do While (Waiting<=300)
		wscript.sleep (1000)
		Waiting=Waiting+1
	Loop
	Do While (Dialog=0) AND (Waiting>=300)
		WScript.Quit
	Loop
Loop

Wie Ihr sicher schon herausgelesen habt - besonders viel Erfahrung in VBS oder BATCH habe ich nicht, dennoch gebe ich mir alle Mühe.
Das einzige was ich relativ gut kenne ist LSL (Linden Scripting Language) und HTML.

Wie also könnte ich es noch realisieren?
Kann ich bei VBS etwas besser machen (Fehler)?
Sollte ich eine andere Programmiersprache benutzen?
Gibt es vielleicht sogar eine noch bessere Lösung (Mit Aktivitätsüberwachung und Shutdown-Timer) mithilfe von VBS und/oder Batch?
Oder gibt es für mich nur Hoffnung, ein Programm aus dem Netz zu benutzen (was ich nicht möchte).
Aber schließlich möchte ich auch nicht mein halbes Leben nur wegen einem "Shutdown Timer" verplempern... So viel ist es meiner Mutti dann sicher auch nicht wert...

Mit lieben Gruß
Der Registrar

Content-Key: 159428

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

Printed on: April 25, 2024 at 17:04 o'clock

Member: TsukiSan
TsukiSan Jan 26, 2011 at 05:58:00 (UTC)
Goto Top
Hallo Der Registrar,

ich würde es etwas anders machen. Warum?
1) wenn du eine Messagbox startest, dann wartet das Programm, bis jemand etwas tut
(ok oder cancel drücken, Stecker ziehen etc.)
Das heißt, dein "Timer" läuft da nicht und der Rechner bleibt schon wieder die ganze Nacht an.

Wie wäre da ein Popup-fenster an dieser Stelle, dass aussieht, wie eine Messagebox?
Beispiel:
Set ws = CreateObject("WScript.Shell")   
a = ws.popup( "Nach 3 Sekunden bin ich wieder weg.",3,"Messageboxmeldung",vbyesno)  
msgbox a
Jetzt könntest du "a" abfragen, ob was passiert ist und wenn JA, welcher Button wurde gedrückt.
JA = 6
Nein = 7
Keiner von beiden = -1

Du kannst auch die Stunde Wartezeit wie folgt ablaufen lassen
Dim Wartezeit
Wartezeit = 3600000 ' eine Stunde in Millisekunden  
for i = 0 to 3
       'Aufruf einer Sub-Routine zum Beispiel  
       ' in der du deine Abfragen reinbastelst  
      Wscript.Sleep Wartezeit
next

Wscript.Quit
jetzt würde die FOR-Schleife maximal 4 Mal aufgerufen. Heißt in dem Beispiel bis zu 4 Stunden maximal.

Vielleicht sind das ein paar Anregungen, dich in deinem Vorhaben weiterzubringen.

Gruss
Tsuki
Member: DerRegistrar
DerRegistrar Jan 26, 2011 at 06:25:53 (UTC)
Goto Top
Hi TsukiSan!!!

Vielen Dank für deine schnelle und aufschlussreiche Antwort, dies scheint mich doch etwas weiterzubringen.
Leider funktioniert mein darauf basierendes Script nicht, was mache ich bloss falsch?
Meine Fehlermeldung: ... Zeile 13 Zeichen 13 - End erwartet ...

Mein Script sieht jetzt wie folgt aus:
Dim Wartezeit
Wartezeit = 3600000 ' eine Stunde in Millisekunden  
for i = 0 to 3
		Set ws = CreateObject("WScript.Shell")   
		a = ws.popup( "Der Computer soll in 1 Minute runterfahren. Abbrechen?",60,"Messageboxmeldung",vbyesno)  
		msgbox a
	If (a=6) Then
      		Wscript.Sleep Wartezeit
	Else If (a=7) OR (a=-1) Then
		Set oShell = WScript.CreateObject("WScript.Shell")   
		oShell.Run "C:\Users\User\Systemdateien\Shutdown\shutdown.bat", 0  

Wscript.Quit


[EDIT]

Ich habe den Fehler gefunden, jedoch habe ich jetzt ein anderes Problem.
Sobald ich auf "Nein" klicke, bekomme ich ein Popup mit "7" und dem Button "OK".
Warum?


Dim Wartezeit
Wartezeit = 3600000 ' eine Stunde in Millisekunden  
for i = 0 to 3
		Set ws = CreateObject("WScript.Shell")   
		a = ws.popup( "Der Computer soll in 1 Minute runterfahren. Abbrechen?",60,"Messageboxmeldung",vbyesno)  
		msgbox a
	If (a=6) Then
      		Wscript.Sleep Wartezeit
	Else If (a=7) OR (a=-1) Then
		Set oShell = WScript.CreateObject("WScript.Shell")   
		oShell.Run "C:\Users\User\Systemdateien\Shutdown\shutdown.bat", 0  

End If
End If 
Next
Wscript.Quit
Member: TsukiSan
TsukiSan Jan 26, 2011 at 06:33:02 (UTC)
Goto Top
Hi Der Registrar,

da fehlen am Ende das "END IF" und danach das "Next". Das mal vorneweg.

ansonsten könntest du ab Zeile 09 es etwas umschreiben:
Else
                Set oShell = WScript.CreateObject("WScript.Shell")   
		oShell.Run "C:\Users\User\Systemdateien\Shutdown\shutdown.bat", 0  
End If

Next

Gruss
Tsuki
Member: DerRegistrar
DerRegistrar Jan 26, 2011 at 06:40:38 (UTC)
Goto Top
Ok, ich sehe - Ein vollnoob am Werk *schäm*.

Also ich habe den Code jetzt ergänzt, bekomme wieder einen Fehler:
Zeile: 11
Zeichen: 2
Fehler: Syntaxfehler

Dim Wartezeit
Wartezeit = 3600000 ' eine Stunde in Millisekunden  
for i = 0 to 3
		Set ws = CreateObject("WScript.Shell")   
		a = ws.popup( "Der Computer soll in 1 Minute runterfahren. Abbrechen?",60,"Messageboxmeldung",vbyesno)  
		msgbox a
	If (a=6) Then
      		Wscript.Sleep Wartezeit
	End If
	Next
	Else
                Set oShell = WScript.CreateObject("WScript.Shell")   
		oShell.Run "C:\Users\User\Systemdateien\Shutdown\shutdown.bat", 0  
	End If
	Next
Wscript.Quit 
Member: TsukiSan
TsukiSan Jan 26, 2011 at 06:46:43 (UTC)
Goto Top
Ok, ich sehe - Ein vollnoob am Werk *schäm*.

Macht ja nix. Wir üben alle noch face-wink

vergleiche mal bitte:
Dim Wartezeit
Wartezeit = 3600000 ' eine Stunde in Millisekunden  
for i = 0 to 3
		Set ws = CreateObject("WScript.Shell")   
		a = ws.popup( "Der Computer soll in 1 Minute runterfahren. Abbrechen?",60,"Messageboxmeldung",vbyesno)  
	If a=6 Then
      		Wscript.Sleep Wartezeit
	Else
                Set oShell = WScript.CreateObject("WScript.Shell")   
		oShell.Run "C:\Users\User\Systemdateien\Shutdown\shutdown.bat", 0  
	End If
Next

Gruss
Tsuki
Member: DerRegistrar
DerRegistrar Jan 26, 2011 at 06:55:56 (UTC)
Goto Top
*facepalm*

Wieso klappt es nur bei mir nie ^^!!!
Ach bin ich glücklich, dass es nun endlich klappt!!!!!!!!!!!!!!

Mutti wird sich freunnnnnnnnnnnnn!!!!
Und die Umwelt auch! ( Dafür der Energiekonzern umso weniger )

DAUMEN HOCH (wobei, lieber führen wir diesen bescheuerten Trend hier nicht ein) für ADMINISTRATOR.de und TsukiSan!
Vielen Dank für die zur Problemlösung sehr beitragende Unterstützung!!!

Wie kann ich mich adäquat revangieren?
Member: TsukiSan
TsukiSan Jan 26, 2011 at 06:58:11 (UTC)
Goto Top
Freud mich, dass es funktioniert!

Wie kann ich mich adäquat revangieren?
immer mal vorbeischauen und oben grünes Häkchen setzen face-smile

Gruss
Tsuki
Mitglied: 76109
76109 Jan 26, 2011 at 08:07:12 (UTC)
Goto Top
Hallo zusammen!

Das Problem hat Tsuki mit den richtigen Ansätzen ja eigentlich schon gelöst, aber es könnte auch etwas einfacher gehen.

Auf jeden Fall, würde ich bei älteren Leuten eine einfachere Fragestellung in der PopUp-Meldung ausgeben, die unmissverständlich eine Ja/Nein-Beantwortung zuläßtface-wink

Das mit der For-Schleife verstehe ich auch nicht ganz, weil wenn Deine Omi 4 Stunden durchhält, dann würde der Laptop danach ohne weitere Abfragen die ganze Nacht über durchlaufen?

Also mein Lösungsvorschlag würde etwas vereinfacht so aussehen:
Const Msg = "Soll der Laptop jetzt herunterfahren?"  
 
Set oShell = CreateObject("WScript.Shell")  
    
Do While oShell.PopUp(Msg, 60, "Meldung...", vbYesNo) = vbNo  
   Wscript.Sleep 3600000
Loop

oShell.Run "C:\Users\User\Systemdateien\Shutdown\shutdown.bat", 0   

Gruß Dieter
Member: DerRegistrar
DerRegistrar Jan 26, 2011 at 16:27:05 (UTC)
Goto Top
Hi Dieter!

Danke für deinen Vorschlag, OMI ist sie zwar zum glück nicht, aber noch einfacher, noch besser ;).
Ich habe jedoch so lange an dem Code rumgebastelt... "never touch a running system...".
Vielleicht später face-big-smile

Hier mein aktueller, funktionsfähiger Code inklusive der BATCH Datei:

VBS:
Dim Wartezeit
Wartezeit = 3600000 ' eine Stunde in Millisekunden  
for i = 0 to 3
		Set ws = CreateObject("WScript.Shell")   
		a = ws.popup( "Der Computer soll heruntergefahren werden." & vbLf & "Ja - Jetzt herunterfahren" & vbLf & "Nein - In 1 Stunde nochmal fragen",30,"Herunterfahren",vbyesno)  
		If (a=-1) Then
		a = ws.popup( "Der Computer soll heruntergefahren werden." & vbLf & "Ja - Jetzt herunterfahren" & vbLf & "Nein - In 1 Stunde nochmal fragen",30,"Herunterfahren",vbyesno)  
		End If
		If (a=-1) Then
		a = ws.popup( "Der Computer soll heruntergefahren werden." & vbLf & "Ja - Jetzt herunterfahren" & vbLf & "Nein - In 1 Stunde nochmal fragen",30,"Herunterfahren",vbyesno)  
		End If
	If a=7 and i<=3 Then
		a = ws.popup( "Es wird in 1 Stunde erneut gefragt, ob der Computer heruntergefahren werden soll.",15,"Herunterfahren")  
      		Wscript.Sleep Wartezeit
	Else
		a = ws.popup( "Der Computer wird in 1 Minute heruntergefahren.",10,"Runterfahrn")  
                Set oShell = WScript.CreateObject("WScript.Shell")  
		oShell.Run "C:\Users\User\Systemdateien\Shutdown\shutdown.bat", 0  
		Wscript.Quit
	End If
Next

BATCH:
@echo off
cd\
cls
echo Shutdown.....
shutdown -s -t 60 -f -c "Herunterfahren in 1 Minute."  
Mitglied: 76109
76109 Jan 27, 2011 at 08:42:48 (UTC)
Goto Top
Hallo DerRegistrar!

Sorry, weiß auch nicht, wie ich auf die Omi gekommen bin. War jedenfalls mit "i" am Endeface-smile

Naja und zu Deinem Code, den Du so mühsam erarbeitet hast, sage ich mal besser nixface-wink

Jedenfalls, brauchst mit dieser Codezeile keine extra Batch-Datei:
oShell.Run "cmd \c shutdown -s -t 60 -f", 0  

Gruß Dieter
Member: TsukiSan
TsukiSan Jan 27, 2011 at 12:48:06 (UTC)
Goto Top
Hallo didi1954,

eigentlich ist der Beitrag ja gelöst, aber NUR für diejenigen, die eine XP-Maschine haben
und die es interessiert dieser Zusatz
zum Runterfahren des Rechners aus VBS heraus:
oShell.Run "shutdown.exe /s /T 20 /C """ & "PC wird runtergefahren!"""   

Viele Grüße

Tsuki