求助:使用ActiveXObject(Scripting.FileSystemObject)与JS获取子文件夹名称失败
问题分析与解决办法
你的两段代码都存在两个核心问题,咱们一步步拆解清楚:
1. 路径的转义错误
在JavaScript字符串里,反斜杠\是转义字符,你写的D:\path\to\myfolder\会被解析成无效路径——比如\p会被当成特殊转义序列,实际传递给FileSystemObject的路径根本不是你预期的目标文件夹路径。
解决办法二选一:
- 把路径里的反斜杠改成双反斜杠:
D:\\path\\to\\myfolder - 直接用正斜杠替代反斜杠:
D:/path/to/myfolder(Windows系统完全支持正斜杠作为路径分隔符,还不用考虑转义问题)
2. SubFolders集合的遍历方式错误
SubFolders是FileSystemObject返回的Folder集合对象,不是普通的JavaScript数组,所以:
- 第一段代码里的
subfolders.length根本不存在(集合用Count属性获取元素数量),而且不能用下标subfolders[i]直接访问元素; - 第二段代码里的
for...in会遍历集合对象的自身属性(比如Count、Item这些方法),而不是每个子文件夹,所以subfolder是字符串类型的属性名,不是Folder对象,自然没有.Name属性。
正确的遍历方式
使用Enumerator对象来遍历这个ActiveX集合(这是处理此类集合的标准方法):
var fso = new ActiveXObject('Scripting.FileSystemObject'); var targetFolder = fso.GetFolder('D:\\path\\to\\myfolder'); // 注意转义后的路径 var subFolders = targetFolder.SubFolders; var enumFolders = new Enumerator(subFolders); for (; !enumFolders.atEnd(); enumFolders.moveNext()) { var currentFolder = enumFolders.item(); alert(currentFolder.Name); }
或者用Count属性结合Item方法遍历(注意FSO集合的下标是从1开始的,不是0):
var fso = new ActiveXObject('Scripting.FileSystemObject'); var targetFolder = fso.GetFolder('D:/path/to/myfolder'); // 用正斜杠更省心 var subFolders = targetFolder.SubFolders; for (var i = 1; i <= subFolders.Count; i++) { var currentFolder = subFolders.Item(i); alert(currentFolder.Name); }
额外提醒:HTA运行时要确保本地系统允许ActiveX控件运行(本地HTA默认是允许的,但如果是网络加载的可能会有安全限制),同时要保证目标路径确实存在,否则GetFolder会直接抛出错误。
内容的提问来源于stack exchange,提问作者stckvrw
相关产品推荐
相关产品推荐

