如果崩溃

时间:2017-05-14 20:00:37

标签: vbscript crash restart

我试图创建一个vb脚本,如果它崩溃,将重新启动另一个vb脚本。 我搜索过并搜索过,但我得到的是如何重新启动程序,因为vb脚本是后台进程,当你在Win32_Process中搜索时它不起作用。

这是我的代码

set Service = GetObject ("winmgmts:")
set Shell = WScript.CreateObject("WScript.Shell")

sEXEName = "Test_To_Block.vbs"

while true
 bRunning = false

 for each Process in Service.InstancesOf ("Win32_Process")
  if Process.Name = sEXEName then
   bRunning=true
   msgbox("I am active")
  End If
 next


if bRunning=False then
 msgbox("I am not active.")
 Shell.Run sEXEName
end if


WScript.Sleep(100)

wend

问题是,它永远不会看到文件正在运行,只是打开了数百个" Test_To_Stop.vbs""这解决了我必须重新启动计算机。

在我看来,应该改变的是代码所在的位置。

for each Process in Service.InstancesOf ("Win32_Process")

而不是查看" Win32_Process"你需要在任何背景过程中查看'运行

我是编码的新手,如果这是一个简单的问题就很抱歉。

提前谢谢。

此致

毒蛇

2 个答案:

答案 0 :(得分:1)

以下代码通过WshShell.Exec()方法重新启动自身,并通过返回对象的.Status属性跟踪正在运行的脚本的状态:

If Not WScript.Arguments.Named.Exists("task") Then
    Do
        With CreateObject("WScript.Shell").Exec("""" & WScript.FullName & """ """ & WScript.ScriptFullName & """ ""/task""")
            Do While .Status = 0
                WScript.Sleep 1
            Loop
        End With
    Loop
End If

MsgBox "This script will be restarted immediately after termination"

另一种方法是使用.Run()方法将第三个参数设置为True,等待启动进程终止:

If Not WScript.Arguments.Named.Exists("task") Then
    Do
        CreateObject("WScript.Shell").Run """" & WScript.FullName & """ """ & WScript.ScriptFullName & """ ""/task""", 1, True
    Loop
End If

MsgBox "This script will be restarted immediately after termination"

甚至更简单:

If Not WScript.Arguments.Named.Exists("task") Then
    Do
        CreateObject("WScript.Shell").Run """" & WScript.ScriptFullName & """ ""/task""", 1, True
    Loop
End If

MsgBox "This script will be restarted immediately after termination"

答案 1 :(得分:0)

可能是因为正在运行的进程的名称是' wscript.exe'而不是' Test_To_Block.vbs'。您可以使用this页面上提到的黑客来更改流程的名称:

如果您在本地运行脚本并运行一些常规脚本,请执行一次 常见的hack只是将wscript.exe复制并重命名为特定名称, 例如" MyScript1.exe"。然后使用快捷方式运行脚本 " ... \ MyScript1.exe MyScript1.vbs"。然后该过程将显示为 MyScript1.exe。

然后您可以使用sEXEName = "MyScript1.exe"

注意:而不是使用Shell.run sExeName使用Shell.run "Test_To_Block.vbs"