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

Prevent an internal Function execution stopping the main execution

背景

我在 WSH 下有一个 JScript 脚本 运行ning。

脚本相当简单。它遍历字符串列表、每个字符串、JScript 本身和 运行 每个“内部”脚本。

问题

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

简单示例

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

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

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

最后一行将不会执行,因为“内部”脚本停止了执行。

问题

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

要求

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

如果您只想阻止特定的 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 contrcutor,然后调用生成的对象与 evaling 它几乎相同。)

您可以将其写入文件并以该文件作为参数执行 wscript.exe,或者如果您不想将文件写入磁盘,请使用 Microsoft Script Control and/or 想要让脚本访问父脚本中的对象。


(*) 这两种方式都没有任何意义。甚至可以说您唯一的问题是 WScript.Quit。你要放什么? return?这不会削减它:

function bar(a) {
    if (Pred(a)) {
        WScript.Quit(123);
    }
    return 456;
}

function foo() {
    var x = bar(789);
    if (!x) {
        DoSomethingBad();
    }
}

foo();

一个过去默默结束的剧本现在做了坏事。如果您 "know" 认为将 WScript.Quit 更改为 return 没有任何坏处,您还应该知道代码中没有任何 WScript.Quit .

即使您能赶上对 WScript.Quit.

的每次呼叫,您也无能为力,只能退出