Hallo,
...die Execute-Methode des Windows Scripting Host ...
weil sie es ermöglicht, einen Prozess asynchron auszuführen und auf sein Ende zu reagieren - und es die erste war, die mir eine Suche präsentierte.Der Sinn des ScrollLock-Blinkens ist - wie schon Eingangs erwähnt - (Zitat: "Während Download ... im "Hide-Modus ..."), dass eine optische Kontrolle vorhanden ist, während das Programm ohne Ausgabe auf dem Monitor läuft - da scheidet die Execute-Methode wohl aus.
Nö. Klappt wunderbar. Execute() ist *nicht* Exec()!
Die Run-Methode des WScript.Shell-Objektes erlaubt Dir ebenfalls, einen Prozess asynchron auszuführen, ich hab' allerdings auf die Schnelle keine Möglichkeit gesehen, wie man auf das Ende des Prozesses reagieren kann. Du verhinderst die asynchrone Ausführung explizit mit Deinem dritten Parameter, dem Du den Wert true zuweist.
Ich weiss, den Wert true muss ich jedoch zwangsweise zuweisen, da ich bei false sonst keinen Rückgabewert bekomme, den ich jedoch zum Abbrechen der FlashLight-Schleife benötigen würde.
' TODO: Zähler einbauen, um am Ende Scroll-Lock wieder auszuschalten,
' wenn die Anzahl der Aufrufe von Flashlight() ungerade war....danke, ist in der ausfühlichen Flashlight() Funktion natürlich berücksichtigt.
Dachte ich mir. Ist nur überflüssig. Der Zähler kommt außenrum, um den Aufruf.
Flashlight() braucht nicht mehr zu können, als die von mir skizzierte Geschichte:
schlafen
Taste drücken
Mein jetziger Lösungsansatz:
ist unschön. Was nach Anlaufproblemen wunderbar funktionierte war eine Aufteilung in zwei Skripte:
a) Steuerskript
b) Downloadskript
a) Steuerskript (jps.vbs)
' --------------------------------------------------------------------------
Option Explicit
Dim WshShell : Set WshShell = WScript.CreateObject("WScript.Shell")
Dim Controller : Set Controller = WScript.CreateObject("WSHController")
' Starte Downloadskript
Dim RemoteScript : Set RemoteScript = Controller.CreateScript("download.vbs")
RemoteScript.Execute
Dim LightOn : LightOn = False
' Lass es blinken, solange das Downloadskript läuft
Do While RemoteScript.Status <> 2
wscript.sleep 200
WshShell.sendkeys "{SCROLLLOCK}"
LightOn = Not LightOn
Loop
' Schalte, falls nötig Scroll-Lock aus
If LightOn = True Then
WshShell.sendkeys "{SCROLLLOCK}"
End If
' --------------------------------------------------------------------------
b) Downloadskript (download.vbs)
' --------------------------------------------------------------------------
Option Explicit
Dim WshShell : Set WshShell = WScript.CreateObject("WScript.Shell")
Dim downloadpath : downloadpath = "K:\test"
Dim logfile : logfile = downloadpath & "\Download.log"
Dim debug : debug = 1 ' 0=Debug auf Konsole; 1=Debug in Logfile
Dim wndmode : wndmode = 3 ' 0=hide; 1=default; 2=minimized; 3=maximized
Dim zipfile :zipfile = "http://downloads1.kaspersky-labs.com/zips/av-i386-weekly.zip"
GetFile zipfile, downloadpath, debug, logfile, wndmode
'************************
Function GetFile(sfile,dest,plog,logfile,wndstate)
'************************
' plog (0=Debug auf Konsole; 1=Debug in Logfile)
' WGet Parameter
' --------------
' -t (Number of Tries)
' -T (Network "timeout" in sec)
' -N (Turn on time-stamping)
' -P (Präfix for Downloadpath)
' -o (Präfix for Logfile)
Dim appl
appl = "K:\Test\WGet.exe -t 3 -T 10 -N -P "
Dim vt
Select Case plog
Case 0 vt = ""
Case 1 vt = "-o "
End Select
Dim srun
srun = appl & chr(34) & dest & chr(34) & _
chr(32) & sfile & chr(32) & _
vt & chr(34) & logfile & chr(34)
WshShell.run srun, wndstate, true
End Function
' --------------------------------------------------------------------------
und nun kannst Du wieder wunderbar den Fensterstatus beeinflussen.
Vergleichbar könntest Du bestimmt mit Exec() ein Skript aufrufen, statt wget direkt. Hab' ich nicht ausprobiert.
Freundliche Grüße
Vinzenz