在HTA中从JScript运行批处理文件

时间:2016-02-24 11:06:36

标签: html batch-file jscript hta

我正在使用JScript创建此HTA应用程序,该应用程序将写入BAT文件,然后在cmd中将其打开。

如果我从Windows手动打开创建的BAT文件,它就会像它应该的那样工作 当我通过HTA打开它时,文件打开但只输出Echo并暂停。

请记住,我是非常非常新的编程。

这是JScript。

// Write the Bat file
// When run from HTA all I get is the "Echo Done" and "Pause"
// When I run from Windows without HTA, all of it works.
function writeBat() {
var fso = new ActiveXObject("Scripting.FileSystemObject");
var s = fso.CreateTextFile("C:/test/test.bat");
    s.WriteLine('@echo off');
    s.WriteLine('set output=C:/test/new/');
    s.WriteLine('FOR %%a in (*.mkv) DO ("C:/Program Files/MKVToolNix/mkvmerge.exe" -o "%output%%%~na.mkv" "%%a")');
    s.WriteLine('echo Done.');
    s.WriteLine('pause');
    s.Close(); }

// Run the Bat file.
function runBat() {
var MyObject = new ActiveXObject("wscript.shell");
MyObject.Run("C:/test/test.bat"); }

这是批处理文件。

@echo off
set output=C:/test/new/
FOR %%a in (*.mkv) DO ( "C:/Program Files/MKVToolNix/mkvmerge.exe" -o "%output%%%~na.mkv" "%%a")
echo Done.
pause

和HTML

<form>
<input type="button" value="Write Bat" onClick="writeBat()">
<input type="button" value="Run Bat" onClick="runBat()">
</form>

1 个答案:

答案 0 :(得分:4)

嗯,你找到了答案。 HTA的上下文与批处理脚本的上下文位于不同的工作目录中。您必须将批处理脚本cdpushd设置为"%~dp0"。这是添加到上下文菜单等的批处理脚本的标准。

s.WriteLine('pushd "%~dp0"');

...正如您已经做的那样是正确的解决方案。你也应该

s.WriteLine('@echo off & setlocal');

...将此批处理脚本中的变量范围限制为批处理脚本本身的运行时。

但我发布答案的主要原因是为了提供有关Chakra引擎的更多信息。即使使用IE9,10,11,Edge,无论安装什么,Windows脚本宿主都会维护JScript 5.7中存在的功能集。根据{{​​3}}:

  

从JScript 5.8开始,默认情况下,JScript脚本引擎支持5.7版本中存在的语言功能集。这是为了保持与早期版本引擎的兼容性。要使用版本5.8的完整语言功能集,Windows脚本界面主机必须调用MSDN documentation

这就是说,如果你想在JScript 5.8或更新版本中使用方法(例如JSON方法,Object.keysArray.prototype.forEach()等),你基本上必须自己编写Windows脚本宿主解释器。但是,使用HTA,可以轻松实现IE9功能。只需将以下行添加到HTA文件的顶部:

<meta http-equiv="x-ua-compatible" content="IE=9" />

在:

<script>
function get() {
    try {
        var json = JSON.parse(document.getElementById('json').value);
        alert(json.var1);
    }
    catch(e) {
        alert(e.message);
    }
}
</script>
<textarea id="json">{"var1": "It works!"}</textarea>
<button onclick="get()">Go!</button>

输出:

  

&#39; JSON&#39;未定义

后:

<meta http-equiv="x-ua-compatible" content="IE=9" />
<script>
function get() {
    try {
        var json = JSON.parse(document.getElementById('json').value);
        alert(json.var1);
    }
    catch(e) {
        alert(e.message);
    }
}
</script>
<textarea id="json">{"var1": "It works!"}</textarea>
<button onclick="get()">Go!</button>

输出:

  

有效!

但是,这个黑客并不局限于HTA。通过创建htmlfile COM对象,将<meta>标记写入其中,然后将IActiveScriptProperty::SetProperty写入当前脚本宿主,也可以使其适用于控制台JScript和JScript.NET。 p>