Hey, Scripting Guy! How can I use a script to show me all the files in a folder? And then how can I modify that script so it shows me all the files in any subfolders of that folder?
— CS
Hey, CS. Yesterday we showed everyone a script that changed all the files in a folder from read-only to read-write. We also promised that, in today’s column, we’d explain how we managed to get a list of all the files in a folder in the first place. Your questions are the perfect lead-in to that explanation.
Let’s start with the easy one: a script that simply lists all the files in a folder. This script reports back the file name of all the files found in the folder C:\Scripts:
Set objFSO = CreateObject(“Scripting.FileSystemObject”) objStartFolder = “C:\Scripts”Set objFolder = objFSO.GetFolder(objStartFolder)
Set colFiles = objFolder.Files For Each objFile in colFiles Wscript.Echo objFile.Name Next
As you can see, there really isn’t much to this. We create an instance of the FileSystemObject, and then we use the GetFolder method to bind to folder C:\Scripts. Pretty straightforward. If we wanted to bind to, say, the Windows folder, all we’d have to do is change the path accordingly, something we do by assigning a different value to objStartFolder:
objStartFolder = “C:\Windows”
After we’ve connected to the folder, we then create a reference to the Files property using this command:
Set colFiles = objFolder.Files
That gives us back a collection consisting of all the files found in the folder. (But- and this has important implications for your second question – this collection does not include files found in any subfolders of C:\Scripts.) At this point the rest is child’s play: we can now use a For Each loop to loop through the collection of files and – if we choose – do something to each and every one. Because you asked how to get a list of all the files in a folder, all we do is echo the name of the file. But we could do a lot more than that; for example, we could report back the DateCreated property or the Size property. For a more complete rundown of the FileSystemObject and how to use it, you might want to check out the Script Runtime Primer in the Microsoft Windows 2000 Scripting Guide.
In other words, getting back a list of all the files in a folder is trivial. Getting back a list of all the files in a folder plus all the files in any subfolders of that folder can be a bit trickier. To do that you need to use a recursive script. We’re not going to explain recursion here; for more details, check out this portion of the Microsoft Windows 2000 Scripting Guide. (Yes, we do seem to be promoting the book quite a bit today, don’t we?) Basically a recursive function is a function that can automatically call itself as many times as needed. That might not make much sense, but think of it this way. The script we showed you above lists all the files in a folder and then stops. It doesn’t matter if there are subfolders in the folder; the script doesn’t really care.
A recursive function, by contrast, does care: it will keep working until it has done everything you asked of it, and more. A recursive function will list all the files in a folder, and then check to see if that folder has any subfolders. Suppose it finds subfolders A and B. In that case, the function will call itself, and list any files found in Subfolder A. And what if Subfolder A has a sub-subfolder C? No problem: the function will call itself again, and list all the files in sub-Subfolder C. This will continue until no more subfolders can be found. At that point, the function will loop back, and start working its way through Subfolder B. Furthermore, it will dutifully keep working until it has gone through each and every subfolder and sub-subfolder and sub-sub-subfolder and – well, until every last file has been listed.
It all sounds terribly complicated, and it is. Fortunately, though, VBScript hides most of this complexity from you. Hey, would we kid you about something like that? Look, here’s a script that uses a recursive function – ShowSubFolders – to list all the files in the folder C:\Scripts and all the files found in any subfolders of C:\Scripts:
Set objFSO = CreateObject(“Scripting.FileSystemObject”) objStartFolder = “C:\Scripts”Set objFolder = objFSO.GetFolder(objStartFolder) Wscript.Echo objFolder.Path Set colFiles = objFolder.Files For Each objFile in colFiles Wscript.Echo objFile.Name Next Wscript.Echo
ShowSubfolders objFSO.GetFolder(objStartFolder)
Sub ShowSubFolders(Folder) For Each Subfolder in Folder.SubFolders Wscript.Echo Subfolder.Path Set objFolder = objFSO.GetFolder(Subfolder.Path) Set colFiles = objFolder.Files For Each objFile in colFiles Wscript.Echo objFile.Name Next Wscript.Echo ShowSubFolders Subfolder Next End Sub
As you can see the first part of the script is exactly the same as the one we saw before (with one exception: this one echoes the folder path so we know which folder we’re looking at). After showing all the files in C:\Scripts, it then calls the recursive function ShowSubFolders. This function then starts sifting through all the subfolders and reports back any files found. All this “recursion” happens automatically; all you have to do is just sit back and watch.
If you don’t fully understand what’s happening here, don’t worry about it; it takes awhile to fully grasp how recursive functions work. In the meantime, just copy the preceding script and use it any time you need to do something to all the files in a folder and its subfolders.
0 comments