【问题标题】:Restart a vbs script if it crashes如果崩溃,请重新启动 vbs 脚本
【发布时间】:2017-05-21 04:46:52
【问题描述】:

我正在尝试制作一个 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”。

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

提前谢谢你。

问候,

毒蛇

【问题讨论】:

  • 你可以使用WshShell object.Exec("wscript.exe ""C:\Test\Test_To_Block.vbs"""方法来运行被跟踪的脚本,这个方法返回WshScriptExec对象,检查它的.Status属性你可以得到被跟踪的进程被终止,并且重新启动它。您甚至可以将所有功能组合到一个脚本文件中,然后自动启动。
  • @omega 我喜欢你把所有东西都放在一个代码中的想法,但是如果代码有错误,它如何仍然跟踪过程,代码不就结束了吗?
  • @omega 提前致谢!
  • @omega 正如我所说,我是脚本新手,能否请您举一个方法示例。我认为它是 'Set Shell = WshShell.Exec("wscript.exe ""C:\Test\Test_To_Block.vbs""")' 然后为了检查 'If objWshShell.Status = ?????然后''重启'我不知道这是否正确,请您纠正我吗?

标签: vbscript crash restart


【解决方案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"

【讨论】:

  • 我尝试使用它,它只是占用我的 CPU,也许它看不到程序?这就是我启动任何“.vbs”“Microsoft® Windows Based Script”时的名称。
  • 该代码对我来说运行良好,可能是您的 PC 上的 WSH 存在一些问题?尝试运行 .vbs 文件,其中包含 MsgBox 的唯一行。
  • 是的,msgbox 工作正常。但是关于 WSH,您使用的是什么窗口?我有一个 Windows 10。
  • 我之前评论的意思与您下面的答案相同。 “可能是因为正在运行的进程的名称是'wscript.exe'而不是'Test_To_Block.vbs'。您也许可以使用此页面上提到的hack来更改进程的名称:”但他的方式并没有为我工作,也许我误解了它?
  • 我使用的是 Win 7 HB x64 笔记本电脑。稍后我将尝试在另一台装有 Win 10 的笔记本电脑上测试代码。
【解决方案2】:

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

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

那你可以使用sEXEName = "MyScript1.exe"

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

【讨论】:

  • 我的代码名称是“Microsoft ® Windows Based Script”,如果我只检查 wscript.exe,那么它可能只会看到它自己。我试过你的“重命名”系统,但没有用。提前致谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 2013-07-30
相关资源
最近更新 更多