You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:53:23