我可以使用FileSystemObject使用其索引从文件夹中获取单个文件吗?

时间:2016-01-01 22:23:54

标签: vbscript filesystemobject fso

如果文件夹中只有一个文件,我可以选择而不知道其名称或浏览文件夹中的文件吗?

(代码是VBS,但它可以是任何东西,FSO在这里是有趣的部分。)

这对我没用:

dim fso
set fso = CreateObject("Scripting.FileSystemObject")
dim myFolder
Set myFolder = fso.getFolder("E:\test")
Dim myfiles
Set myfiles = myFolder.Files

WScript.Echo myfiles.Item(0).Path

WScript.Echo myfiles(0).Path都没有效果。 (测试指数0,1都失败了。)

使用for each来获取一个文件似乎有点过分。另外,我不应该以简单的For循环而不是For Each进行迭代?所以必须有索引......我似乎无法找到它们。

3 个答案:

答案 0 :(得分:7)

不,您不能在不知道其名称的情况下选择文件或迭代文件夹中的文件,至少不能使用FileSystemObject实例。由于documented Item集合的Files属性需要项目的名称,而不是其索引:

  

项目属性(文件)

     

获取Files对象中的指定项

     

<强>语法

object.Item(key)[ = newitem]
     

<强>参数

     

物体
  需要。 File对象的名称。

     

规范
  需要。该项目的名称。

并非每个集合都允许通过索引进行访问。

如果你正在寻找一个神奇的技巧,你可以这样做:

dir = "C:\your\folder"

Set sh = CreateObject("WScript.Shell")
Set ex = sh.Exec("cmd /c dir /b """ & dir & """")
While ex.Status = 0 : WScript.Sleep 100 : Wend

filename = Split(ex.StdOut.ReadAll, vbNewLine)(0)

Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFile(fso.JoinPath(dir, filename))

然而,这种方法既不是非常优雅也不是非常强大,我没有看到它比

这样的优势
dir = "C:\your\folder"
Set fso = CreateObject("Scripting.FileSystemObject")
For Each item In fso.GetFolder(dir).Files
  Set f = item
Next

答案 1 :(得分:3)

可以使用Shell对象,就像你想的那样。

dim shellApp
set shellApp = CreateObject("Shell.Application")
dim myFolder
Set myFolder = shellApp.NameSpace("E:\test")
Dim myfiles
Set myfiles = myFolder.Items 'also contains subfolders

WScript.Echo myfiles.Item(0).Path

'and for loop
Dim i
For i = 0 To myfiles.Count - 1
    WScript.Echo myfiles.Item(i).Path
Next

答案 2 :(得分:0)

如果您完全确定文件夹中只有一个文件,则只需一行代码即可:

Set MyFile = FSO.GetFile("E:\test\" & Dir("E:\test\"))

...至少它在Excel VBA中适用于我。