cscript jscript JSON

And*_*lli 9 json wsh jscript

这是一个非常非常(非常!!!)奇怪的问题.

我有一个在Windows XP和7上运行的JSCRIPT,CSCRIPT在一个名为的文件中使用dos testJSON.js.

if ( ! this.JSON ) WScript.Echo("JSON DOESN'T EXISTS");
Run Code Online (Sandbox Code Playgroud)

并且,消息出现,但是JSCRIPT的意外行为,因为JSON(如MSDN文档所述)是其中一个默认对象JSCRIPT 5.8,我的系统在Windows 7上运行完全正确JSCRIPT 5.8.

现在,我通过创建一个新的文本文件并手动编写一个有效的JSON字符串来临时解决了这个问题(在一个复杂的小脚本中)(显然,即使系统没有JSCRIPT 5.8JSON请求,一切也能正常工作))但我主要想知道两件事:

1st即使我的JSCRIPT版本是支持该对象的版本,为什么我也不能使用JSON对象?

第二部分我已经阅读了关于在JSCRIPT环境中"启用"JSON(和其他)不可用对象的内容,但所有示例都是针对C#的,我想知道是否存在一些JSCRIPT的等效代码.

roj*_*ojo 18

你可以eval()用来达到类似的效果JSON.parse().

eval('obj = {' + JSONstring + '}');
Run Code Online (Sandbox Code Playgroud)

然后,obj.toString()将让您检索类似的数据JSON.stringify()(只是没有美化选项).请参阅此答案以获取野外的示例.关键是,您可以从JSON文本创建对象,而无需加载任何外部库或切换解释器引擎.

大胖警告!!!

这会在运行代码的工作站中引入漏洞.如果您不控制要解析的JSON的生成,或者第三方可能在其生成和解释之间修改JSON,那么请考虑遵循Helen的建议.如果JSON中有不好的东西,它可能会导致你的WScript做坏事.例如,如果您的JSON字符串或文件包含以下内容:

};
var oSH = WSH.CreateObject("wscript.shell"),
    cmd = oSH.Exec("%comspec%");
WSH.Sleep(250);
cmd.StdIn.WriteLine("net user pwnd password /add");
WSH.Sleep(250);
cmd.StdIn.WriteLine("net group Administrators pwnd /add");
WSH.Sleep(250);
cmd.Terminate();
var obj = {
    "objName": {
        "item1": "value 1",
        "item2": "value 2"
    }
Run Code Online (Sandbox Code Playgroud)

...然后解析它将eval刚刚添加一个新的管理员到您的计算机,没有任何视觉指示它发生.

我的建议是随意雇用eval私人或临时使用; 但是对于广泛部署,考虑包括jlen2.js,正如海伦建议的那样. 编辑:或者......

htmlfile COM对象

您可以通过调用htmlfileCOM对象并通过以下<META>标记将其强制转换为IE9(或更高版本)兼容模式来导入JSON方法:

var htmlfile = WSH.CreateObject('htmlfile'), JSON;
htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=9" />');
htmlfile.close(JSON = htmlfile.parentWindow.JSON);
Run Code Online (Sandbox Code Playgroud)

使用这三行,JSON对象和方法被复制到JScript运行时,使您无需使用eval()或下载json2.js 即可解析JSON .你现在可以做这样的事情:

var pretty = JSON.stringify(JSON.parse(json), null, '\t');
WSH.Echo(pretty);
Run Code Online (Sandbox Code Playgroud)

这是一个细分:

// load htmlfile COM object and declare empty JSON object
var htmlfile = WSH.CreateObject('htmlfile'), JSON;

// force htmlfile to load Chakra engine
htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=9" />');

// The following statement is an overloaded compound statement, a code golfing trick.
// The "JSON = htmlfile.parentWindow.JSON" statement is executed first, copying the
// htmlfile COM object's JSON object and methods into "JSON" declared above; then
// "htmlfile.close()" ignores its argument and unloads the now unneeded COM object.
htmlfile.close(JSON = htmlfile.parentWindow.JSON);
Run Code Online (Sandbox Code Playgroud)

有关其他方法,请参阅此答案(通过XHR下载json2.js,InternetExplorer.ApplicationCOM对象,HTA混合方法和另一个示例htmlfile).

  • 我没有必要.它只是一个代码高尔夫技巧,将一个命令作为重载参数填充到一个不需要参数的方法中.3行代码看起来比4更令人印象深刻.这完全取决于个人喜好.[请参阅此答案](http://stackoverflow.com/a/34966337/1683264),了解如何将其他Chakra方法导入JScript. (2认同)

Hel*_*len 9

为什么即使我的JSCRIPT版本是支持该对象的版本,我也无法使用JSON对象?

根据MSDN,Windows Script Host默认使用JScript 5.7功能集以实现向后兼容.JScript 5.8功能集仅在IE8 +标准文档模式下的Internet Explorer中使用.

您有以下选择:

  1. 在脚本中包含json2.js.有关在JScript脚本中包含外部脚本的选项,请参阅此问题.

  2. 修改注册表以将IE9的JScript引擎公开给Windows脚本宿主.UPD:此解决方案使用IE的JScript DLL,但不激活5.8功能集.

  3. 使用Active Script接口IActiveScriptProperty::SetProperty编程方式创建JScript执行主机,并使用强制JScript 5.8功能集(SCRIPTLANGUAGEVERSION_5_8).这是一个C++示例.

我已经阅读了关于在JSCRIPT环境中"启用"JSON(和其他)不可用对象的内容,但所有示例都是针对C#的,我想知道是否存在一些JSCRIPT的等效代码.

自定义脚本执行主机只能使用具有适当COM支持的语言创建,例如C++,C#等.JScript不能用于此,因为,例如,它不支持输出参数.

  • 不幸,但真实。我无法理解为什么 wscript/script 上没有覆盖或参数。 (2认同)
  • 哇,那个`WSH`是个笑话.谢谢,微软! (2认同)