【问题标题】:Running Batch file from JScript in HTA在 HTA 中从 JAVAScript 运行批处理文件
【发布时间】:2016-02-25 22:34:59
【问题描述】:

我正在使用 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>

【问题讨论】:

  • 在批处理文件中添加一个echo %cd%以检查运行目录,如果需要添加额外的pushd c:\directory行。
  • JavaScript 和 JScript 虽然语法相似,但都是not equivalent。你这里写的是JScript。
  • 正如我在帖子中所说,我对此很陌生。感谢您清理 Jscript 的事情。至于答案,%cd% 显示到桌面的路径,所以我在顶部添加了s.WriteLine('pushd "%~dp0"');,它可以工作!!非常感谢!

标签: html batch-file jscript hta


【解决方案1】:

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

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

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

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

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


但我发布答案的主要原因是为了提供有关 Chakra 引擎的更多信息。即使安装了 IE9、10、11、Edge,无论安装什么,Windows Script Host 都保持 JScript 5.7 中存在的功能集。根据MSDN documentation

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

也就是说,如果你想使用 JScript 5.8 或更高版本中的方法(例如 JSON 方法、Object.keysArray.prototype.forEach() 等),你基本上必须编写自己的 Windows Script Host 解释器.但是,对于 HTA,有一个简单的 hack 可以启用 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>

输出:

'JSON' 未定义

之后:

<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>

输出:

有效!


不过,此 hack 不仅限于 HTA。也可以通过创建htmlfile COM 对象,将&lt;meta&gt; 标记写入它,然后将copying the newly exposed methods and objects 写入当前脚本宿主,使其适用于控制台JScript 和JScript.NET。

【讨论】:

  • 感谢您的意见!我正在阅读一些我不应该使用 的地方,除非我必须这样做。看来我可以为这个项目跳过它,可以为下一个项目派上用场。感谢您抽出宝贵时间。
猜你喜欢
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 2011-10-29
  • 2012-08-07
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多