Option Explicit
WScript.Echo Join( GetFiles( WScript.Arguments.Unnamed.Item(0) ), vbCrLf )
Function GetFiles( strFilespec )
' Name : GetFiles
' Function : List all files matching the specified filespec, all DOS wildcards allowed
' Returns : An array of fully qualified paths of all matching files, or a single element array with the text "Error"
' Remarks : If no folder is specified, the current directory will be assumed.
' DOS wildcards "*" and "?" are allowed in the FILE name and/or extension, but NOT in the DIRECTORIES.
' E.g. "D:\folder\*file*_*.??" is allowed, but "D:\folder\*\file*.??" is NOT.
' Author : Rob van der Woude, http://www.robvanderwoude.com
' Version : 1.00, 2017-01-31
Dim colFiles, objFile, objFolder, objFSO, objRE, wshShell
Dim strFiles, strFolder, strPattern
GetFiles = Array( "Error" )
' Return "Error" if no filespec is specified
If Trim( strFilespec ) = "" Then Exit Function
' Handle (unlikely) error in specified UNC path
Set objRE = New RegExp
objRE.Pattern = "^\\\\" ' Check if filespec starts with double backslash
If objRE.Test( strFilespec ) Then
' Check if filespec is a valid UNC path: \\server\share\relativepath
objRE.Pattern = "^\\\\[\w-]+\\[\w\$-]+\\[^\\]"
If Not objRE.Test( strFilespec ) Then
Set objRE = Nothing
Exit Function
End If
End If
Set wshShell = CreateObject( "WScript.Shell" )
Set objFSO = CreateObject( "Scripting.FileSystemObject" )
If InStr( strFilespec, "\" ) And Len( strFilespec ) > 1 Then
' If filespec starts with single backslash, prefix it with current directory's drive
If Left( strFilespec, 1 ) = "\" And Not Left( strFilespec, 2 ) = "\\" Then
strFilespec = objFSO.GetDriveName( wshShell.CurrentDirectory ) & strFilespec
End If
' Split filespec into parent directory and actual FILE spec
strFolder = Mid( strFilespec, 1, InStrRev( strFilespec, "\" ) )
strFilespec = Mid( strFilespec, InStrRev( strFilespec, "\" ) + 1 )
End If
' Assume current directory if no parent directory is specified
If strFolder = "" Then strFolder = wshShell.CurrentDirectory
' Quit if folder does not exist
If Not objFSO.FolderExists( strFolder ) Then
Set objRE = Nothing
Set objFSO = Nothing
Set wshShell = Nothing
Exit Function
End If
' Convert DOS wildcards to regex pattern
objRE.Pattern = "([\.\(\)\[\]\{\}\$])"
objRE.Global = True
objRE.IgnoreCase = True
strPattern = objRE.Replace( strFilespec, "\$1" )
strPattern = Replace( strPattern, "?", "[^\\]" )
strPattern = Replace( strPattern, "*", "[^\\]*" )
objRE.Pattern = "(^|\\)" & strPattern & "$"
' Get a collection of files
Set objFolder = objFSO.GetFolder( strFolder )
Set colFiles = objFolder.Files
strFiles = ""
' Iterate through the list of files
For Each objFile In colFiles
' Check if the file name matches filespec
If objRE.Test( objFile.Path ) Then
' Add the file to the list
strFiles = strFiles & ";" & objFile.Path
End If
Next
' Return the list of files as an array
GetFiles = Split( Mid( strFiles, 2 ), ";" )
' Cleanup
Set colFiles = Nothing
Set objFolder = Nothing
Set objRE = Nothing
Set objFSO = Nothing
Set wshShell = Nothing
End Function