
本文详解如何在hta应用中通过wscript.shell正确调用同目录或子目录下的hta文件,解决因工作目录未设置导致的相对路径失效问题,并提供兼容ie模式、代码复用与路径标准化的最佳实践。
在HTA(HTML Application)开发中,WScript.Shell.Run() 方法默认以系统当前工作目录(通常是 C:WindowsSystem32 或用户启动目录)为基准解析路径,而非HTA脚本所在目录。这导致看似正确的相对路径(如 "WIsWRLK/Triangulacao/trian.hta")无法被识别——因为Shell根本不在你的项目根目录下执行。
根本解法是:显式设置 WshShell.CurrentDirectory 为HTA文件所在的物理目录,再以该目录为基准运行相对路径。关键在于准确获取HTA的本地路径。由于HTA运行于本地文件系统(协议为 file://),可通过 document.URL 提取路径并转换为标准Windows格式:
- document.URL 返回形如 file:///C:/Project/WIsWRLK/main.hta 的字符串;
- 去掉开头的 file:///(即 substr(7));
- 使用 FileSystemObject.GetParentFolderName() 获取其所在文件夹路径;
- 将该路径赋值给 WshShell.CurrentDirectory,此后所有相对路径均以此为根。
以下为优化后的完整示例(已整合初始化逻辑、兼容性声明与健壮路径处理):
程序介绍:程序采用.net 2.0进行开发,全自动应用淘客api,自动采集信息,无需,手工更新,源码完全开放。(程序改进 无需填入阿里妈妈淘客API 您只要修改app_code文件下的config.cs文件中的id为你的淘客id即可)针对淘客3/300毫秒的查询限制,系统采用相应的解决方案,可以解决大部分因此限制带来的问题;程序采用全局异常,避免偶尔没考虑到的异常带来的问题;程序源码全部开放,请使
<html>
<head>
<meta http-equiv="x-ua-compatible" content="IE=9">
<hta:application
icon="loader2.ico"
singleinstance="yes"
contextmenu="no"
scroll="no"
selection="no"
showintaskbar="no"
maximizebutton="no"
minimizebutton="no"
caption="no"
/>
<script language="JScript">
// ✅ 一次性创建核心对象(避免重复实例化)
var oWSH = new ActiveXObject("WScript.Shell");
var oFSO = new ActiveXObject("Scripting.FileSystemObject");
// ✅ 安全提取HTA所在目录(兼容空格、特殊字符)
var urlPath = document.URL.substr(7); // 去除 "file:///"
var scriptDir = oFSO.GetParentFolderName(urlPath).replace(///g, "\"); // 统一为反斜杠
oWSH.CurrentDirectory = scriptDir;
// ✅ 窗口自适应(居中+固定比例)
var w = screen.availWidth / 6.5;
var h = screen.availHeight / 2.143;
window.resizeTo(w, h);
window.moveTo(screen.availWidth - w, screen.availHeight - h);
// ✅ 所有函数均可直接使用相对路径(无需重复创建对象)
function CLOSE() {
oWSH.Run(".\WIs-1.hta", 1, false);
}
function Trian() {
oWSH.Run(".\WIsWRLK\Triangulacao\trian.hta", 1, false);
}
function nodongle() {
oWSH.Run(".\WIsWRLK\nodongle\nodongle.hta", 1, false);
}
</script>
</head>
<body onload="window.focus();">
<button onclick="CLOSE()">关闭</button>
<button onclick="Trian()">三角化</button>
<button onclick="nodongle()">无加密狗模式</button>
</body>
</html>? 关键注意事项:
- 路径分隔符必须用反斜杠 :Windows Shell不识别 / 作为路径分隔符(即使URL中常见)。示例中 .\WIsWRLK\Triangulacao\trian.hta 是正确写法。
- CurrentDirectory 必须在首次 Run 前设置:它影响后续所有相对路径解析,且对同一 WshShell 实例全局生效。
- 避免硬编码绝对路径:如原 nodongle() 中的 file:///C:/Users/... 不仅不可移植,还可能因空格、编码(如 %20)引发错误;统一用相对路径 + CurrentDirectory 更可靠。
- 文档模式声明至关重要: 确保HTA使用较新渲染引擎(支持 document.URL 稳定返回),否则可能降级至 IE7 模式导致路径解析异常。
- 进阶建议:若需 IE11 级功能(如现代JS语法),可采用双文件HTA架构——主HTA仅作壳,通过 iframe 加载含 <script type="module"> 的子页面,同时保留 hta:application 特性。</script>
通过以上方案,无论HTA部署在 D:Work 还是 \ServerShare,所有子目录调用均能稳定运行,真正实现“一次编写,多机部署”。









