JavaScript-获取文件路径掉入HTA
-
09-09-2019 - |
题
我正在构建一些HTA供个人使用,并希望能够将文件拖放到界面。文件删除后,我要么自动运行它(假设它适合我设置的某些参数,例如文件扩展名),或者至少填写了HTA接口上的输入框。
我已经广泛搜索,但找不到解决方案。想法?
解决方案
HTA显然不能成为外壳下降操作的目标 - 至少在我的系统上,将某些东西放在HTA上是不可能的。
这意味着你不能 直接地 做你打算的事情。
但是,.vbs可以是下降目标。丢弃文件的完整路径可通过 WScript.Arguments.Unnamed
收藏。
HTA可以通过访问其命令行参数 命令行属性. 。这意味着您可以构建一个小型助手VBScript,将删除的文件转换为命令行并为您调用HTA。
请注意,您不能在.vbs上删除无数文件,并且命令行也不是无限的。几个KB的区域将有一个长度限制(我没有试图找到限制到底位置,只需准备面对限制即可。)
其他提示
托马拉克(Tomalak)在他的陈述中是不正确的...有办法做您想做的事,除了您必须在hta文件注册表中添加drophandler,这真的很容易做到,一旦完成,您将能够准确地尝试您的尝试去做。我找不到太多的文档,但是这是一个很久以前由一个名叫Michel Gallant的家伙写的HTA的链接,向您展示了如何: http://www.jensign.com/javascience/www/wsh/imager/index.html
启动HTA时,看起来您是否已经配置了Drophandler。如果您不这样做,它为您提供了为您配置它的选项。一旦配置您要做的就是关闭并重新打开HTA和Wallah,就可以在HTA文件中拖放支持。
如果您不想启用Drop Hander,我可以想象一种可能的方法。这是一条喜剧链,但是如果我被倒入角落并需要该功能,我可以看到自己正在实施它。
您可以创建一个将其SRC作为临时文件夹的iframe。该文件夹将显示为探索器视图。然后,您可以将文件拖入其中。对该文件夹设置投票例程,以查看是否有任何新文件。瞧,您有一种用给定文件支持拖放操作的la脚方法。
去尝试提供拖放的Google齿轮。
您甚至可以在HTA中使用MySQL。
Google Gears在HTA中不可用,但是,您可以在HTML文件中创建ActiveXobject,然后使用一个 iframe(<iframe application="true" src=".."></iframe>)
之后,您可以使用 activexobject
通过 iframe
.
关于 …
“希望能够将文件拖放到[HTA]接口”
…我将其解释为希望将文件删除到HTA的运行窗口,而不是将文件放在HTA文件本身或捷径上。
使用HTML5,掉落本身很容易。使用,例如a <div>
元素作为下降区域。对于此元素处理事件 dragenter
, dragover
和 drop
. 。例如,Drop处理程序看起来像这样:
function on_drop( e )
{
e.preventDefault(); // stops the browser from redirecting off to the file
var dt = e.dataTransfer
var is_file_transfer = false;
for( var i = 0; i < dt.types.length; ++i )
{
if( dt.types[i].toLowerCase() == 'files' )
{
is_file_transfer = true;
}
}
if( !is_file_transfer )
{
return false;
}
on_files_dropped( dt.files );
return true;
}
… 在哪里 on_files_dropped
是您定义的功能,可以处理文件删除。
在文档加载事件中动态添加事件处理程序可以看起来像:
var dropbox = document.getElementById( 'blah' );
dropbox.addEventListener( 'dragenter', on_dragenter, false );
dropbox.addEventListener( 'dragover', on_dragover, false );
dropbox.addEventListener( 'drop', on_drop, false );
到目前为止,一切都很好。
但是,安全措施限制: 您没有直接了解原始文件路径, ,仅文件名和文件大小。因为此功能是为Web设计的,而不是针对本地受信任的HTML应用程序设计的。因此,这可能是或不一定是一个问题。
为了将删除的文件用作 资源 对于HTML元素,通常用于读取删除文件,HTML5提供了
FileReader
(有很多 教程 可用,与技术文档进一步链接)。在需要本地路径的地方,例如在Windows Mediaplayer中播放文件,您可以 认为 该拖动操作源于Windows Explorer,现在也称为文件资源管理器,然后只需检查Explorer窗口(如果有)包含具有该名称和大小的文件。
希望能找到不超过一个这样的原始窗口。
var shell = new ActiveXObject( "Shell.Application" );
var fso = new ActiveXObject( "Scripting.FileSystemObject" );
function possible_paths_for( filename )
{
var windows = shell.windows(); // Windows Explorer windows.
var n_windows = windows.Count;
var lowercase_filename = filename.toLowerCase();
var paths = Array();
for( var i = 0; i < n_windows; ++i )
{
var url = windows.Item(i).LocationURL;
var path = decodeURI( url.substr( 8 ) ).replace( /\//g, '\\' );
// The path can be the path of this HTML application (.hta file), so:
if( fso.FolderExists( path ) )
{
var folder = fso.GetFolder( path );
for( var it = new Enumerator( folder.Files ); !it.atEnd(); it.moveNext() )
{
var file = it.item();
if( file.Name.toLowerCase() == lowercase_filename )
{
paths.push( file.Path.toLowerCase() );
}
}
}
}
return paths;
}
本质上就是这样。除了,也许由于HTA默认为IE7,因此如何获得HTML5功能。可以通过Doctype声明,但是到目前为止,在我的小实验中,我只使用以下内容:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<!-- A windows web control defaults to quirky IE7 semantics. Request for better: -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta http-equiv="MSThemeCompatible" content="yes">
这为您提供了最新的Internet Explorer引擎 HTA
元素,因此无法直接访问命令行。我找到 可以通过运行Windows的命令行检索该命令行 wmic
程序, ,但这是一个糟糕的黑客。整个问题领域,最明显的开放道路已被封闭,这似乎是微软现在考虑到HTAS的结果 一个 旧技术, ,悄悄淘汰以支持全屏addridder Windows 8 AppStore应用程序.
无论如何,祝你好运!