我试图创建一个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"你需要在任何背景过程中查看'运行
我是编码的新手,如果这是一个简单的问题就很抱歉。
提前谢谢。
此致
毒蛇
答案 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"