2013-06-03 3 views
3

В VBScript я хочу получить список файлов в папке, упорядоченной по дате создания. Я видел, что для этого мне нужно будет либо использовать набор записей (кажется для меня излишним), либо сортировать коллекцию (я думаю, что я могу избежать этого, и я хочу, чтобы мой код был короче).Заказ коллекции файлов в FileSystemObject

Поскольку я создаю файлы, я создаю их с именами, начинающимися с даты (yyyy_mm_dd), поэтому, хотя я могу получить файлы, по крайней мере упорядоченные по имени, тогда я все настроен. К сожалению, MSDN documentation of the Files collection from FileSystemObject ничего не говорит о порядке коллекции. Кто-нибудь знает какую-либо другую секретную документацию или что-то подобное, что может быть более конкретным?

ответ

7

Если вы хотите получить файлы в папке в определенном порядке, вам придется сделать это самостоятельно. Если вам не нравится набор записей ADO или с помощью сортируемой коллекции .NET, вы можете вырезать (.Run, .Exec) и обрабатывать вывод dir /A:-D /B /O:D /T:C (без папок, голый формат (без заголовка/сводки), порядок: дата , timefield: создание).

Update:

Хотя я, конечно, могу показать примеры, где коллекция .files поставляется его элементы упорядочены по имени, г-н Гейтс явно says:

INFO: Ограничения FileSystemObject .. Невозможно отсортировать имена файлов из коллекции файлов - вы можете перебирать объекты File в коллекции Files для получения списка файлов в папке. Однако объекты File не сортируются. Для сортировки объектов File в коллекции Files вам необходимо использовать процедуру сортировки .

Минималистичный демо-код, который показывает: Вам нужна оболочка (% COMSPEC%), если вы хотите использовать функции оболочки - как intrinsic commands:

Option Explicit 

Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject") 
Dim goWS : Set goWS = CreateObject("WScript.Shell") 
Dim csDir : csDir = "c:\temp" 

WScript.Quit demoSF() 

Function demoSF() 
    demoSF = 0 
    Dim aDSOrd : aDSOrd = getDSOrd(csDir, "%comspec% /c dir /A:-D /B /O:D /T:C """ & csDir & """") 
    Dim oFile 
    For Each oFile In aDSOrd 
     WScript.Echo oFile.DateCreated, oFile.Name 
    Next 
End Function ' demoSF 

Function getDSOrd(sDir, sCmd) 
    Dim dicTmp : Set dicTmp = CreateObject("Scripting.Dictionary") 
    Dim oExec : Set oExec = goWS.Exec(sCmd) 
    Do Until oExec.Stdout.AtEndOfStream 
    dicTmp(goFS.GetFile(goFS.BuildPath(sDir, oExec.Stdout.ReadLine()))) = Empty 
    Loop 
    If Not oExec.Stderr.AtEndOfStream Then 
    WScript.Echo "Error:", oExec.Stderr.ReadAll() 
    End If 
    getDSOrd = dicTmp.Keys() 
End Function 

Выход:

cscript 16895525.vbs 
07.10.1998 15:31:34 TlbInf32.chm 
.. 
09.10.2008 22:40:29 sqlce.sql 
09.10.2008 22:40:29 gltsqlcopytest.sdf 
05.11.2008 20:11:39 Vorfuehrung.class 
.. 
28.03.2011 20:23:36 Program.cs 
. 
01.10.2012 10:10:10 KyXHDe.chm 
+0

Благодарим за редактирование @Ansgar. –

+2

В качестве предложения: я бы добавил '/ b' в список аргументов, чтобы избежать ненужных деталей в выходе. –

+0

Я тоже видел эту опцию и думал об этом, но не должен ли я выводить результаты команды 'dir' в файл, а затем обрабатывать этот файл? Я попытался использовать «Exec», но выглядел так, как будто он может выполнять только исполняемый файл и такой (например, «ping.exe»), и он не работал с 'dir' (я не смог найти файл' dir.com' на Windows 7, может быть, на Windows XP?). Я волнуюсь, что если я буду использовать создание и использование внешних файлов, я могу столкнуться с некоторыми проблемами синхронизации и заблокированными файлами, которые нельзя удалить, не выполнив мой сценарий. Как сделать опцию «dir» без создания файла («>>»)? – shwartz

7

Является ли это действительно слишком много кода для сортировки?

set fso = CreateObject("Scripting.FileSystemObject") 

Set outputLines = CreateObject("System.Collections.ArrayList") 
for each f in fso.GetFolder(".").files 
    outputLines.Add f.Name 
next 
outputLines.Sort() ' 5 lines... 

For Each outputLine in outputLines 
    set file = fso.GetFolder(".").files.item (outputLine&"") 
    Wscript.Echo file.name ' TODO: your thing here 
Next 
+0

Спасибо. Он короткий, но поскольку он использует объект .net, сценарий может иметь проблемы в будущем, когда есть обновления .net (хотя это вряд ли с таким базовым классом, как ArrayList). Я хочу, чтобы этот сценарий запускался один раз в день, и, вероятно, никто не будет там, чтобы справляться с проблемами, поэтому я хочу свести к минимуму риск. – shwartz

Смежные вопросы