3

如果文件夹中只有一个文件,我可以在知道其名称或遍历文件夹中的文件的情况下提取它吗?

(代码是 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? 所以必须有索引......我似乎无法找到它们。

4

3 回答 3

7

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

项目属性(文件)

获取 Files 对象中的指定项

句法

object.Item(key)[ = newitem]

论据

对象
必需。文件对象的名称。

规格
必需。项目的名称。

并非每个集合都允许按索引访问。

如果您正在寻找一个魔术技巧,您可以执行以下操作:

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
于 2016-01-01T23:08:18.680 回答
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
于 2016-01-02T18:35:17.660 回答
0

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

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

...至少它在 Excel VBA 中对我有用。

于 2016-02-16T20:27:42.620 回答