Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vbscript 如果vbs脚本崩溃,请重新启动它_Vbscript_Crash_Restart - Fatal编程技术网

Vbscript 如果vbs脚本崩溃,请重新启动它

Vbscript 如果vbs脚本崩溃,请重新启动它,vbscript,crash,restart,Vbscript,Crash,Restart,我正在尝试创建一个vb脚本,如果它崩溃,它将重新启动另一个vb脚本。 我已经搜索过了,搜索过了,但我得到的只是如何重新启动一个程序,而且由于vb脚本是一个后台进程,所以在Win32_进程中搜索时它不起作用 这是我的密码 set Service = GetObject ("winmgmts:") set Shell = WScript.CreateObject("WScript.Shell") sEXEName = "Test_To_Block.vbs" while true bRunnin

我正在尝试创建一个vb脚本,如果它崩溃,它将重新启动另一个vb脚本。 我已经搜索过了,搜索过了,但我得到的只是如何重新启动一个程序,而且由于vb脚本是一个后台进程,所以在Win32_进程中搜索时它不起作用

这是我的密码

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_进程”

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

先谢谢你

问候,


Viper

可能是因为正在运行的进程的名称是“wscript.exe”,而不是“Test_To_Block.vbs”。您可以使用第页中提到的hack更改进程名称:

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

然后可以使用
sEXEName=“MyScript1.exe”


注意:以下代码不是使用
Shell.run sExeName
而是使用
Shell.run“Test\u To_Block.vbs”

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

如果不是WScript.Arguments.Named.Exists(“任务”),则
做
使用CreateObject(“WScript.Shell”).Exec(“&WScript.FullName&&WScript.ScriptFullName&&WScript.ScriptFullName&/task”)
执行While.Status=0
WScript.Sleep 1
环
以
环
如果结束
MsgBox“此脚本将在终止后立即重新启动”
另一种方法是使用
.Run()
方法,将第三个参数设置为
True
,以等待启动的进程终止:

如果不是WScript.Arguments.Named.Exists(“任务”),则
做
CreateObject(“WScript.Shell”)。运行“”&WScript.FullName&&WScript.ScriptFullName&&WScript.ScriptFullName&/task“”,1,True
环
如果结束
MsgBox“此脚本将在终止后立即重新启动”
或者更简单一些:

如果不是WScript.Arguments.Named.Exists(“任务”),则
做
CreateObject(“WScript.Shell”)。运行“”&WScript.ScriptFullName&“”/task“”,1,True
环
如果结束
MsgBox“此脚本将在终止后立即重新启动”

您可以使用
.Exec(“wscript.exe”C:\Test\Test\u To_Block.vbs“”
method运行要跟踪的脚本,此方法返回
wshscript exec
对象,检查它的
。Status
属性您可以获得跟踪过程终止,然后重新启动它。您甚至可以将所有功能合并到一个脚本文件中,该脚本文件将自动启动。@omega我喜欢您关于将所有内容放在一起的想法在一个代码中,但是如果代码有错误,它如何跟踪过程,代码不是刚刚结束吗?@omega提前谢谢!@omega正如我所说的,我对脚本是新手,请你举一个方法的例子。我想它是“Set Shell=WshShell.Exec”(“wscript.exe”“C:\Test\Test\u to_Block.vbs”“)'然后为了检查'If objWshShell.Status=???'然后重新启动',我不知道这是否正确,请你纠正一下,我的代码名是“基于Microsoft®Windows的脚本”,如果我只检查wscript.exe,它可能只会看到它自己。我尝试了你的“重命名”系统,但它不工作。提前谢谢!我试过使用它,它占用了我的CPU,可能它看不到程序?这就是我启动任何“.vbs”基于Microsoft®Windows的脚本时的名称。代码对我来说很好,可能你的电脑上的WSH有一些问题吗?试着用
MsgBox
运行包含唯一一行的.vbs文件。是的,MsgBox很好。但是关于WSH,你使用的是什么窗口?我有一个windows 10。我之前的评论与你说的答案是一样的。“可能是因为正在运行的进程的名称是‘wscript.exe’,而不是‘Test_To_Block.vbs’。您可以使用本页中提到的hack来更改进程的名称:“但是他的方式对我不起作用,可能我误解了?我使用的是Win 7 HB x64笔记本电脑。稍后,我将尝试在另一台使用Win 10的笔记本电脑上测试代码。