Top-Themen

Aktuelle Themen (A bis Z)

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
GELÖST

VBScript - Shutdowndialog mit Timer

Frage Entwicklung Batch & Shell

Mitglied: DerRegistrar

DerRegistrar (Level 1) - Jetzt verbinden

26.01.2011, aktualisiert 06:47 Uhr, 7658 Aufrufe, 11 Kommentare

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:
01.
set wshell = CreateObject("Wscript.shell") 
02.
 
03.
Dim Dialog, Waiting, a 
04.
 
05.
Dialog=0 
06.
Waiting=0 
07.
a="leer" 
08.
Do While (Running=1) 
09.
 
10.
	Do While (Dialog=0) AND (Waiting=0) 
11.
		Dialog=1 
12.
		Waiting=0 
13.
		runterfahren = MsgBox("Soll der Computer in 5 Minuten heruntergefahren werden?", vbYesNo + vbQuestion, "Herunterfahren") 
14.
		If runterfahren = vbNo Then 
15.
			ab = MsgBox("Der Computer wird nicht heruntergefahren. Erneuter Versuch in 1 Stunde.", vbOK, "Herunterfahren") 
16.
			Waiting=-3599700 
17.
		Else If runterfahren = vbYes Then 
18.
		Dialog=0 
19.
		Waiting=301 
20.
		End If 
21.
	Do While (Waiting<=300) 
22.
		wscript.sleep (1000) 
23.
		Waiting=Waiting+1 
24.
	Loop 
25.
	Do While (Dialog=0) AND (Waiting>=300) 
26.
		WScript.Quit 
27.
	Loop 
28.
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
Mitglied: TsukiSan
26.01.2011 um 06:58 Uhr
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:
01.
Set ws = CreateObject("WScript.Shell")  
02.
a = ws.popup( "Nach 3 Sekunden bin ich wieder weg.",3,"Messageboxmeldung",vbyesno) 
03.
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
01.
Dim Wartezeit 
02.
Wartezeit = 3600000 ' eine Stunde in Millisekunden 
03.
for i = 0 to 3 
04.
       'Aufruf einer Sub-Routine zum Beispiel 
05.
       ' in der du deine Abfragen reinbastelst 
06.
      Wscript.Sleep Wartezeit 
07.
next 
08.
 
09.
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
Bitte warten ..
Mitglied: DerRegistrar
26.01.2011 um 07:25 Uhr
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:
01.
Dim Wartezeit 
02.
Wartezeit = 3600000 ' eine Stunde in Millisekunden 
03.
for i = 0 to 3 
04.
		Set ws = CreateObject("WScript.Shell")  
05.
		a = ws.popup( "Der Computer soll in 1 Minute runterfahren. Abbrechen?",60,"Messageboxmeldung",vbyesno) 
06.
		msgbox a 
07.
	If (a=6) Then 
08.
      		Wscript.Sleep Wartezeit 
09.
	Else If (a=7) OR (a=-1) Then 
10.
		Set oShell = WScript.CreateObject("WScript.Shell")  
11.
		oShell.Run "C:\Users\User\Systemdateien\Shutdown\shutdown.bat", 0 
12.
 
13.
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?


01.
Dim Wartezeit 
02.
Wartezeit = 3600000 ' eine Stunde in Millisekunden 
03.
for i = 0 to 3 
04.
		Set ws = CreateObject("WScript.Shell")  
05.
		a = ws.popup( "Der Computer soll in 1 Minute runterfahren. Abbrechen?",60,"Messageboxmeldung",vbyesno) 
06.
		msgbox a 
07.
	If (a=6) Then 
08.
      		Wscript.Sleep Wartezeit 
09.
	Else If (a=7) OR (a=-1) Then 
10.
		Set oShell = WScript.CreateObject("WScript.Shell")  
11.
		oShell.Run "C:\Users\User\Systemdateien\Shutdown\shutdown.bat", 0 
12.
 
13.
End If 
14.
End If  
15.
Next 
16.
Wscript.Quit
Bitte warten ..
Mitglied: TsukiSan
26.01.2011 um 07:33 Uhr
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:
01.
Else 
02.
                Set oShell = WScript.CreateObject("WScript.Shell")  
03.
		oShell.Run "C:\Users\User\Systemdateien\Shutdown\shutdown.bat", 0 
04.
End If 
05.
 
06.
Next
Gruss
Tsuki
Bitte warten ..
Mitglied: DerRegistrar
26.01.2011 um 07:40 Uhr
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

01.
Dim Wartezeit 
02.
Wartezeit = 3600000 ' eine Stunde in Millisekunden 
03.
for i = 0 to 3 
04.
		Set ws = CreateObject("WScript.Shell")  
05.
		a = ws.popup( "Der Computer soll in 1 Minute runterfahren. Abbrechen?",60,"Messageboxmeldung",vbyesno) 
06.
		msgbox a 
07.
	If (a=6) Then 
08.
      		Wscript.Sleep Wartezeit 
09.
	End If 
10.
	Next 
11.
	Else 
12.
                Set oShell = WScript.CreateObject("WScript.Shell")  
13.
		oShell.Run "C:\Users\User\Systemdateien\Shutdown\shutdown.bat", 0 
14.
	End If 
15.
	Next 
16.
Wscript.Quit 
Bitte warten ..
Mitglied: TsukiSan
26.01.2011 um 07:46 Uhr
Ok, ich sehe - Ein vollnoob am Werk *schäm*.

Macht ja nix. Wir üben alle noch

vergleiche mal bitte:
01.
Dim Wartezeit 
02.
Wartezeit = 3600000 ' eine Stunde in Millisekunden 
03.
for i = 0 to 3 
04.
		Set ws = CreateObject("WScript.Shell")  
05.
		a = ws.popup( "Der Computer soll in 1 Minute runterfahren. Abbrechen?",60,"Messageboxmeldung",vbyesno) 
06.
	If a=6 Then 
07.
      		Wscript.Sleep Wartezeit 
08.
	Else 
09.
                Set oShell = WScript.CreateObject("WScript.Shell")  
10.
		oShell.Run "C:\Users\User\Systemdateien\Shutdown\shutdown.bat", 0 
11.
	End If 
12.
Next
Gruss
Tsuki
Bitte warten ..
Mitglied: DerRegistrar
26.01.2011 um 07:55 Uhr
*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?
Bitte warten ..
Mitglied: TsukiSan
26.01.2011 um 07:58 Uhr
Freud mich, dass es funktioniert!

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

Gruss
Tsuki
Bitte warten ..
Mitglied: 76109
26.01.2011 um 09:07 Uhr
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äßt

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:
01.
Const Msg = "Soll der Laptop jetzt herunterfahren?" 
02.
  
03.
Set oShell = CreateObject("WScript.Shell") 
04.
     
05.
Do While oShell.PopUp(Msg, 60, "Meldung...", vbYesNo) = vbNo 
06.
   Wscript.Sleep 3600000 
07.
Loop 
08.
 
09.
oShell.Run "C:\Users\User\Systemdateien\Shutdown\shutdown.bat", 0 
Gruß Dieter
Bitte warten ..
Mitglied: DerRegistrar
26.01.2011 um 17:27 Uhr
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

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

VBS:
01.
Dim Wartezeit 
02.
Wartezeit = 3600000 ' eine Stunde in Millisekunden 
03.
for i = 0 to 3 
04.
		Set ws = CreateObject("WScript.Shell")  
05.
		a = ws.popup( "Der Computer soll heruntergefahren werden." & vbLf & "Ja - Jetzt herunterfahren" & vbLf & "Nein - In 1 Stunde nochmal fragen",30,"Herunterfahren",vbyesno) 
06.
		If (a=-1) Then 
07.
		a = ws.popup( "Der Computer soll heruntergefahren werden." & vbLf & "Ja - Jetzt herunterfahren" & vbLf & "Nein - In 1 Stunde nochmal fragen",30,"Herunterfahren",vbyesno) 
08.
		End If 
09.
		If (a=-1) Then 
10.
		a = ws.popup( "Der Computer soll heruntergefahren werden." & vbLf & "Ja - Jetzt herunterfahren" & vbLf & "Nein - In 1 Stunde nochmal fragen",30,"Herunterfahren",vbyesno) 
11.
		End If 
12.
	If a=7 and i<=3 Then 
13.
		a = ws.popup( "Es wird in 1 Stunde erneut gefragt, ob der Computer heruntergefahren werden soll.",15,"Herunterfahren") 
14.
      		Wscript.Sleep Wartezeit 
15.
	Else 
16.
		a = ws.popup( "Der Computer wird in 1 Minute heruntergefahren.",10,"Runterfahrn") 
17.
                Set oShell = WScript.CreateObject("WScript.Shell") 
18.
		oShell.Run "C:\Users\User\Systemdateien\Shutdown\shutdown.bat", 0 
19.
		Wscript.Quit 
20.
	End If 
21.
Next
BATCH:
01.
@echo off 
02.
cd\ 
03.
cls 
04.
echo Shutdown..... 
05.
shutdown -s -t 60 -f -c "Herunterfahren in 1 Minute."
Bitte warten ..
Mitglied: 76109
27.01.2011 um 09:42 Uhr
Hallo DerRegistrar!

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

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

Jedenfalls, brauchst mit dieser Codezeile keine extra Batch-Datei:
01.
oShell.Run "cmd \c shutdown -s -t 60 -f", 0
Gruß Dieter
Bitte warten ..
Mitglied: TsukiSan
27.01.2011 um 13:48 Uhr
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:
01.
oShell.Run "shutdown.exe /s /T 20 /C """ & "PC wird runtergefahren!""" 
Viele Grüße

Tsuki
Bitte warten ..
Ähnliche Inhalte
VB for Applications
VBScript und OR
gelöst Frage von InvisanVB for Applications5 Kommentare

Hi zusammen, derzeit bastel ich ein bisschen in VBScript rum. Leider habe ich mit dem OR Operator einige Probleme. ...

Mac OS X
Time Machine - Wird der Schlüsselbund gesichert?
gelöst Frage von 119851Mac OS X3 Kommentare

Hallo Leute, ich nutze seit kurzem Time Machine für meine Backups (+ File Vault 2). Nun wollte ich mal ...

Netzwerkmanagement
DHCP Lease Time Empfehlung?
gelöst Frage von lcer00Netzwerkmanagement6 Kommentare

Hallo zusammen, Beim DHCP- oder DNS-Serverwechsel habe ich mir angewöhnt die DHCP-Lease-Time auf einen möglichst geringen Wert einzustellen um ...

Datenbanken
HILFE :-) Time Fehler bei MySQL
gelöst Frage von oneofakind88Datenbanken2 Kommentare

Hallo zusammen, bin hier auf einen Fehler gestoßen und komme einfach nicht dahinter wiso mir MySQL einen NULL wert ...

Neue Wissensbeiträge
Perl

Perl hat heute Geburtstag: 30 Jahre Perl: Lange Gesichter zum Geburtstag

Information von Penny.Cilin vor 5 StundenPerl2 Kommentare

Hallo, auch wenn es wenige wissen und noch weniger Leute es nutzen. Perl hat heute Geburtstag. 30 Jahre Perl ...

Sicherheit

Blackberry stirbt - Keine Updates für Priv mehr

Tipp von certifiedit.net vor 5 StundenSicherheit

Blackberry wird zu einer 08/15 Firma und geht wohl mehr und mehr den Weg, den HTC schon ging. Von ...

Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 2 TagenWindows 1010 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 2 TagenSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Heiß diskutierte Inhalte
Batch & Shell
Kann man mit einer .txt Datei eine .bat Datei öffnen?
gelöst Frage von HelloWorldBatch & Shell22 Kommentare

Wie schon im Titel beschrieben würde ich gerne durch einfaches klicken auf eine Text oder Word Datei eine Batch ...

Netzwerkgrundlagen
Belibiges Teilnetz einer Subnetzmaske rausfinden?
gelöst Frage von CenuzeNetzwerkgrundlagen17 Kommentare

Wundervollen Gutentag, mittlerweile kann ich Subnetting so einigermaßen, aber ein Problem habe ich noch. Netzwerkadresse und Boradcast errechnen ist ...

LAN, WAN, Wireless
WLAN Reichweite erhöhen mit neuer Antenne
gelöst Frage von gdconsultLAN, WAN, Wireless12 Kommentare

Hallo, ich besitze einen TL-WN722N USB-WLAN Dongle mit einer richtigen Antenne. Ich frage mich jetzt ob man die Reichweite ...

Windows Server
Logging von "gesendeten Nachrichten" auf Terminalservern
gelöst Frage von Z3R0C0MM4N0THiN6Windows Server10 Kommentare

Hallo zusammen, kann mir jemand auf kurzem Wege sagen ob 1) die per Task-Manager (oder damals tsadmin) an Benutzer ...