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

Jon*_*Jon 5 html batch-file hta jscript

我正在用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"); }
Run Code Online (Sandbox Code Playgroud)

这是批处理文件.

@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
Run Code Online (Sandbox Code Playgroud)

和HTML

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

roj*_*ojo 4

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

s.WriteLine('pushd "%~dp0"');
Run Code Online (Sandbox Code Playgroud)

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

s.WriteLine('@echo off & setlocal');
Run Code Online (Sandbox Code Playgroud)

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


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

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

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

s.WriteLine('pushd "%~dp0"');
Run Code Online (Sandbox Code Playgroud)

前:

s.WriteLine('@echo off & setlocal');
Run Code Online (Sandbox Code Playgroud)

输出:

“JSON”未定义

后:

<meta http-equiv="x-ua-compatible" content="IE=9" />
Run Code Online (Sandbox Code Playgroud)

输出:

有用!


不过,这种黑客攻击并不限于 HTA。还可以通过创建htmlfileCOM 对象、<meta>向其写入标记,然后将新公开的方法和对象复制到当前脚本宿主中,使其适用于控制台 JScript 和 JScript.NET。