阻止内部函数执行停止主执行

时间:2016-10-05 10:09:36

标签: javascript jscript internal wsh

背景

我在JScript下运行了WSH脚本。

脚本非常简单。它遍历一个字符串列表,每个字符串,一个JScript本身,并运行每个“内部”脚本。

问题

某些“内部”脚本可能会调用Quit method。这会导致主脚本停止,需要。

简单示例

var strSomeScript = "WScript.Quit(1)";

var F = new Function(strSomeScript);
var exitCode = (F)();

WScript.Echo("Continue doing more things...");

由于“内部”脚本停止执行,因此不会执行最后一行。

问题

如果我无法控制“内部”脚本的内容,我该如何防止它们破坏我的主流。

要求

我需要运行每个“内部”脚本,等待它完成并存储其退出代码。

1 个答案:

答案 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的每一个电话,你都可以做而不是明智无知。