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

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

最佳答案

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

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

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

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

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


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

Starting with JScript 5.8, by default, the JScript scripting engine supports the language feature set as it existed in version 5.7. This is to maintain compatibility with the earlier versions of the engine. To use the complete language feature set of version 5.8, the Windows Script interface host has to invoke 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' is undefined

之后:

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

输出:

It works!


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

关于html - 在 HTA 中从 JScript 运行批处理文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35600397/

相关文章:

Windows Batch 循环遍历具有动态 token 计数的变量

javascript - 升级 IIS/Classic ASP Javascript/JScript 脚本引擎(到 Chakra?)

javascript - 为 Enterprise Architect 编写脚本时,使用 VBScript 还是 JavaScript 更方便?

CSS Selector 无序列表图片名称

html - CSS3 动画过渡 : opacity not working

batch-file - 如何使用批处理脚本对两个十六进制数执行按位或运算?

java - 批处理文件未在 Windows 8.1 中执行所需的命令

javascript - 使用 Angular 从文本中获取图像

html - 如何让页脚留在底部?

javascript - JScript 5.8/WSH 中具有属性查找的函数名称