Запустить msgbox в фоновом режиме VBscript

Вопрос из двух частей:

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

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

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

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

2 ответа

Хитрость заключается в том, чтобы создать первый скрипт и запустить второй скрипт. Этот второй скрипт будет работать в фоновом режиме, а затем может подождать и убить начальный сценарий 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 в качестве механизма сценариев для вашей VBS, я думаю, что вы можете остановить сценарий, нажав CTRL + C в окне командной строки.

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

Не то, что я собирался, но это работа вокруг, которую я нашел. Это делает временный 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
Другие вопросы по тегам