2013-10-25 4 views
0

Две части вопрос:запустить MsgBox в фоновом режиме VBscript

  1. Я пытаюсь написать VBscript, где пробегает цикл, но есть окно с сообщением о том, что пользователь может использовать, чтобы прервать последовательность в любое время. Я знаю, что если у вас есть последовательность с msgbox в нем, скрипт прекратит выполнение до получения ответа, но могу ли я запустить его как индекс, чтобы он не мешал основному скрипту?

, когда я использую следующий сценарий, я никогда не увидеть MsgBox

function test() 
msgbox ("test") 
end function 
wscript.sleep 1000 
msgbox "done 

я был под впечатлением, что функция позволит вам получить входы. Можно ли это сделать даже с чистым vbscript?

+0

Не совсем, когда вы вызываете функцию, ваш код не будет продолжаться в '' main '' и в функции. Ваш основной процесс перейдет в функцию. Мой подход должен был бы сделать это: делайте свои циклы, но на каждой итерации проверяйте, была ли нажата кнопка, если это было esc, запросить msgbox, чтобы спросить, хочет ли он выйти –

+0

. Как бы проверить, был ли ключ esc нажата? – jeffpkamp

+0

использовать событие keyDown –

ответ

0

Не то, что я собирался, но это работа, которую я нашел. Он создает временный msgbox, который закрывается через некоторое время. Дает пользователю 5-секундное окно, чтобы прервать последовательность каждого цикла.

set infobox = createobject("Wscript.shell") 
do while E<N+1 
    E=E+1 
    if InfoBox.Popup ("Click cancel to stop sequence", _ 
      5, "Abort Sequence?", 1) = 2 then 
      E=N+1 
    end if 
    loop 
0

Трюк здесь заключается в том, чтобы создать первый скрипт и запустить второй скрипт. Этот второй скрипт будет запускаться только в фоновом режиме и может ждать и убивать начальный скрипт Process ... Это можно легко выполнить с помощью функции и вызывать в начале вашего скрипта. Когда ваш основной скрипт заканчивается, он просто убивает ранее созданный второй скрипт. Примечание: второй созданный скрипт автоматически удалит себя при запуске. Смотрите ниже сценария для хорошего рабочего примера:

Dim iKillPID 

'Start Kill Script At Start Of Script 
iKillPID = KillPID() 

For X = 10 To 0 Step -1 
    WScript.Echo "Closing in " & X & " Seconds" 
    WScript.Sleep 1000 
Next 

'Kill The Kill Script At End Of Script 
GetObject("winmgmts:root\cimv2:Win32_Process.Handle='" & iKillPID & "'").Terminate 
MsgBox "This Script is Complete" 

'$$$$$$$$$$ 
Function KillPID() 
Dim strKillScriptPath, strKillCommand, KillFile, StrFileKill, iScriptPID 
Dim objFSO: Set objFSO = CreateObject("Scripting.FileSystemObject") 
    'Generates a Unique Temp File Name In The Same Directory As The Current Script 
strKillScriptPath = objFSO.GetParentFolderName(WScript.ScriptFullName) & Chr(92) & Replace(objFSO.GetTempName, ".tmp", ".vbs") 
    'Command Line To New Kill Script 
strKillCommand = "WScript.exe " & Chr(34) & strKillScriptPath & Chr(34) 
    'This part gets the Process ID of the Current Running Script 
iScriptPID = GetObject("winmgmts:root\cimv2:Win32_Process.Handle='" & _ 
CreateObject("WScript.Shell").Exec("CMD /C ping 127.0.0.1 -n 2 > nul").ProcessID & "'").ParentProcessID 
    'String With Kill File Code (Script Process ID Included) 
StrFileKill = _ 
"Const iKillProc = " & iScriptPID & vbCrLf & _ 
"Dim objFSO: Set objFSO = CreateObject(" & Chr(34) & "Scripting.FileSystemObject" & Chr(34) & ")" & vbCrLf & _ 
"objFSO.DeleteFile WScript.ScriptFullName, True" & vbCrLf & _ '<-- Deletes itself immediately upon running 
"On Error Resume Next" & vbCrLf & _ 
"Set objKillProc = Nothing" & vbCrLf & _ 
"Set objKillProc = GetObject(" & Chr(34) & "winmgmts:root\cimv2:Win32_Process.Handle='" & Chr(34) & " & iKillProc & " & Chr(34) & "'" & Chr(34) & ")" & vbCrLf & _ 
"If objKillProc Is Nothing Then" & vbCrLf & _ 
" MsgBox " & Chr(34) & "The Process Is Not Running" & Chr(34) & vbCrLf & _ 
" WScript.Quit" & vbCrLf & _ 
"End If" & vbCrLf & _ 
"MsgBox " & Chr(34) & "Click OK To Kill The Script Process" & Chr(34) & vbCrLf & _ 
"Call KillProcess(iKillProc)" & vbCrLf & _ 
"WScript.Quit" & vbCrLf & _ 
"Sub KillProcess(iProcID)" & vbCrLf & _ 
"Dim objKillProc, strParentProc" & vbCrLf & _ 
"On Error Resume Next" & vbCrLf & _ 
"Set objKillProc = Nothing" & vbCrLf & _ 
"Set objKillProc = GetObject(" & Chr(34) & "winmgmts:root\cimv2:Win32_Process.Handle='" & Chr(34) & " & iProcID & " & Chr(34) & "'" & Chr(34) & ")" & vbCrLf & _ 
"If Err = 0 And Not objKillProc Is Nothing Then" & vbCrLf & _ 
" If StrComp(objKillProc.Name, " & Chr(34) & "cmd.exe" & Chr(34) & ", 1) = 0 Or _" & vbCrLf & _ 
"  StrComp(objKillProc.Name, " & Chr(34) & "cscript.exe" & Chr(34) & ", 1) = 0 Or _" & vbCrLf & _ 
"  StrComp(objKillProc.Name, " & Chr(34) & "wscript.exe" & Chr(34) & ", 1) = 0 Then" & vbCrLf & _ 
"  strParentProc = objKillProc.ParentProcessID" & vbCrLf & _ 
"  objKillProc.Terminate()" & vbCrLf & _ 
" Call KillProcess(strParentProc)" & vbCrLf & _ 
" End If" & vbCrLf & _ 
"End If" & vbCrLf & _ 
"Set strParentProc = Nothing" & vbCrLf & _ 
"Err.Clear" & vbCrLf & _ 
"End Sub" 
    'Write the Code To File 
Set KillFile = objFSO.CreateTextFile(strKillScriptPath, True) 
KillFile.WriteLine StrFileKill 
KillFile.Close 
Set KillFile = Nothing 
WScript.Sleep 250 
    'Execute The Script and Return the Script Process ID So You Can Kill It When The Script Ends 
KillPID = CreateObject("WScript.Shell").Exec(strKillCommand).ProcessID 
End Function 
'$$$$$$$$$$ 

Кроме того, если вы используете CScript как Scripting Engine для вашего VBS, я полагаю, вы можете остановить скрипт, нажав сочетание клавиш CTRL + C в окне командной строки ,

Теперь, если ваш супермотивирован, вы можете создать HTA, который делает примерно то же самое, но при условии, что пользовательское окно или пользовательское окно Internet Explorer нажимают, а также могут прокручиваться и проверять, продолжает ли процесс и закрывается, когда сценарий завершен, и этот процесс больше не работает. Вы можете добавить красивые цвета и все!

Смежные вопросы