WSH/JavaScript:如何访问文件夹Files集合中的项
问题:WSH中JavaScript无法访问Files集合的项
我正在编写通过cscript.exe在Windows脚本宿主(WSH)命令行执行的JavaScript代码,因需要JSON解析功能选择了JavaScript而非VBScript。
目前尝试访问某文件夹下的所有文件,创建Folder对象并获取Files集合的操作看似成功,但无法访问集合中的项。
我的代码如下:
var folder = fso.GetFolder("mypath"); WScript.Echo( "folder=" + folder.Path + " " + folder.Size ); var files = folder.Files; WScript.Echo( "(files==null)=" + (files==null)); // 返回false WScript.Echo( "typeof files= " + typeof files ); // 返回object WScript.Echo( "files.Count=" + files.Count ); // 返回正确的文件数量 WScript.echo( typeof files[0] ); // 返回undefined WScript.echo( typeof files.Item(0) ); // 无效的过程调用或参数 WScript.echo( typeof files(0) ); // 无效的过程调用或参数 for( var file in files ) { } // 循环未执行
根据文档说明,folder.Files应返回一个集合,这部分似乎正常,至少能调用files.Count得到正确的文件数量。但尝试访问集合项的所有操作均失败:files[index]返回undefined,文档描述的files.Item(index)或files(index)方法会导致运行时错误,for in循环也无法执行。
请问有人能提供访问Files集合项的方法吗?
解决方案
WSH中的Files是COM风格集合,不能用JavaScript常规的数组索引、for in循环或数字索引调用Item方法访问——它的Item方法仅接受文件名称字符串,不支持数字索引。要遍历该集合,必须使用WSH提供的Enumerator对象:
var fso = new ActiveXObject("Scripting.FileSystemObject"); var folder = fso.GetFolder("mypath"); var filesEnum = new Enumerator(folder.Files); // 遍历所有文件 for (; !filesEnum.atEnd(); filesEnum.moveNext()) { var file = filesEnum.item(); WScript.Echo(`文件名:${file.Name},路径:${file.Path}`); }
如果需要通过数字索引访问特定文件,可先将集合转换为JavaScript数组:
var fso = new ActiveXObject("Scripting.FileSystemObject"); var folder = fso.GetFolder("mypath"); var filesEnum = new Enumerator(folder.Files); var fileArray = []; // 将集合转成数组 for (; !filesEnum.atEnd(); filesEnum.moveNext()) { fileArray.push(filesEnum.item()); } // 现在可以用索引直接访问 if (fileArray.length > 0) { WScript.Echo(`第一个文件:${fileArray[0].Name}`); }
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

