我在JScript
下运行了WSH
脚本。
脚本非常简单。它遍历一个字符串列表,每个字符串,一个JScript
本身,并运行每个“内部”脚本。
某些“内部”脚本可能会调用Quit method。这会导致主脚本停止,不需要。
var strSomeScript = "WScript.Quit(1)";
var F = new Function(strSomeScript);
var exitCode = (F)();
WScript.Echo("Continue doing more things...");
由于“内部”脚本停止执行,因此不会执行最后一行。
如果我无法控制“内部”脚本的内容,我该如何防止它们破坏我的主流。
我需要运行每个“内部”脚本,等待它完成并存储其退出代码。
答案 0 :(得分:0)
如果您只想阻止专门的WScript.Quit
来电,您可以通过简单的替换来简单地清理您的输入。 (*)如果您希望能够阻止任何停止脚本的方式 - 例如,var x = WScript; x.Quit();
- 您基本上都在尝试解决halting problem,我听说这有点难
如果您使用常规JS,您可以尝试类似:
WScript.Quit = function(e) {
// Assume there's something reasonable to put here
};
或:
var __WScript = WScript;
WScript = { ConnectObject: function(obj, pref) { __WScript.ConnectObject(obj, pref); },
CreateObject: function(progid, pref) { __WScript.CreateObject(obj, pref); },
... };
但WScript
对象并未实现IDIspatchEx
等,因此无法正常工作。
唯一的方法是确保任意字符串在解释为JavaScript代码时不会结束您的脚本不是eval
该字符串作为脚本的一部分,而是在品牌中运行它新的背景。 (并在该字符串上调用Function
控制器,然后调用结果对象与eval
几乎相同。)
您可以将此文件写入文件并使用此文件作为参数执行wscript.exe
,或者如果您不想将文件写入磁盘和/或想要将文件写入磁盘,请使用Microsoft脚本控件脚本从父脚本访问对象。
(*)并不是说这有任何意义。让我们说你唯一的问题是WScript.Quit
。你要放什么呢? return
?这不会削减它:
function bar(a) {
if (Pred(a)) {
WScript.Quit(123);
}
return 456;
}
function foo() {
var x = bar(789);
if (!x) {
DoSomethingBad();
}
}
foo();
过去以静默方式结束的脚本现在做了一件坏事。如果你"知道"将WScript.Quit
更改为return
并没有做任何不好的事情你也应该知道代码中没有任何WScript.Quit
个。
即使你能接到WScript.Quit
的每一个电话,你都可以做而不是明智无知。