防止内部函数执行停止主执行
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,然后调用生成的对象与 eval
ing 它几乎相同。)
您可以将其写入文件并以该文件作为参数执行 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
.
的每次呼叫,您也无能为力,只能退出
背景
我在 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,然后调用生成的对象与 eval
ing 它几乎相同。)
您可以将其写入文件并以该文件作为参数执行 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
.