Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 在HTA中从JScript运行批处理文件_Html_Batch File_Jscript_Hta - Fatal编程技术网

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

Html 在HTA中从JScript运行批处理文件,html,batch-file,jscript,hta,Html,Batch File,Jscript,Hta,我正在用JScript创建这个HTA应用程序,它编写一个BAT文件,然后在cmd中打开它 如果我从windows手动打开创建的BAT文件,它会正常工作。 当我通过HTA打开它时,文件会打开,但只输出Echo和pause 请记住,我对编程非常陌生 这是JScript // Write the Bat file // When run from HTA all I get is the "Echo Done" and "Pause" // When I run from Windows withou

我正在用JScript创建这个HTA应用程序,它编写一个BAT文件,然后在
cmd
中打开它

如果我从windows手动打开创建的BAT文件,它会正常工作。
当我通过HTA打开它时,文件会打开,但只输出Echo和pause

请记住,我对编程非常陌生

这是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关闭
设置输出=C:/test/new/
对于(*.mkv)DO中的%%a(“C:/Program Files/MKVToolNix/mkvmerge.exe”-o“%output%%%~na.mkv”“%%a”)
回音完毕。
暂停
还有HTML

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

好吧,你找到了答案。HTA的上下文与批处理脚本的上下文位于不同的工作目录中。您必须将批处理脚本
cd
pushd
发送到
“%~dp0”
。这对于添加到上下文菜单中的批处理脚本来说是相当标准的

s.WriteLine('pushd "%~dp0"');
。。。正如您所做的那样,这是正确的解决方案。你也应该

s.WriteLine('@echo off & setlocal');
。。。将此批处理脚本中变量的范围限制为批处理脚本本身的运行时


但我发布答案的主要原因是为了提供更多关于脉轮引擎的信息。即使安装了IE9、10、11和Edge,Windows脚本主机也会保持JScript 5.7中存在的功能集。根据:

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

这意味着,如果您想使用JScript 5.8或更高版本中的方法(例如JSON方法、
Object.keys
Array.prototype.forEach()
,等等),您基本上必须编写自己的Windows脚本主机解释器。但是,有了HTA,就有了一个简单的黑客可以启用IE9功能。只需将以下行添加到HTA文件的顶部:


之前:


函数get(){
试一试{
var json=json.parse(document.getElementById('json').value);
警报(json.var1);
}
捕获(e){
警报(e.message);
}
}
{“var1”:“它有效!”}
走!
输出:

“JSON”未定义

之后:


函数get(){
试一试{
var json=json.parse(document.getElementById('json').value);
警报(json.var1);
}
捕获(e){
警报(e.message);
}
}
{“var1”:“它有效!”}
走!
输出:

它起作用了



不过,这种攻击并不局限于HTA。通过创建
htmlfile
COM对象,并将
标记写入其中,还可以使其适用于console JScript和JScript.NET,然后进入当前脚本主机。

在批处理文件中添加一个
echo%cd%
,以检查正在运行的目录,如果需要,添加其他
pushd c:\directory
line.JavaScript和JScript,同时语法类似。你在这里写的是JScript。正如我在帖子中所说的,我在这方面很新。谢谢你清理了Jscript的东西。至于答案,
%cd%
显示了桌面的路径,所以我添加了
s.WriteLine('pushd“%~dp0')在顶部,它可以工作!!非常感谢你!谢谢你的意见!我在读一本书,除非迫不得已,否则我不应该用它。似乎我可以跳过这个项目,可以方便地下一个项目。谢谢你花时间。