我正在使用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>
答案 0 :(得分:4)
嗯,你找到了答案。 HTA的上下文与批处理脚本的上下文位于不同的工作目录中。您必须将批处理脚本cd
或pushd
设置为"%~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.keys
,Array.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>