6

VBScript で、フォルダー内のファイルの一覧を作成日順に取得したいと考えています。そのためには、レコード セットを使用するか (私にはやり過ぎのように思えます)、コレクションを自分で並べ替える必要があることがわかりました (回避できると思い、コードを短くしたいと思います)。

私はファイルを作成しているので、日付 (yyyy_mm_dd) で始まる名前でファイルを作成するので、少なくとも名前順にファイルを取得できれば、準備は完了です。残念ながら、FileSystemObject からの Files コレクションの MSDN ドキュメントには、コレクションの順序については何も記載されていません。他の秘密の文書や、より具体的なそのようなものを知っている人はいますか?

4

2 に答える 2

13

並べ替えるにはコードが多すぎますか?

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
于 2013-06-04T17:18:05.237 に答える
9

特定の順序でフォルダー内のファイルを取得する場合は、自分で行う必要があります。ADO レコードセットや並べ替え可能な .NET コレクションの使用が気に入らない場合は、(.Run、.Exec) をシェル アウトして、dir /A:-D /B /O:D /T:C(フォルダーなし、ベア フォーマット (ヘッダー/サマリーなし)、order:date、タイムフィールド:作成)。

アップデート:

.Files コレクションがその要素を名前順に並べた例を確かに示すことはできますが、ゲイツ氏は次のように明確に述べています

情報: FileSystemObject の制限 ... ファイル コレクションからファイル名を並べ替えることができません - Files コレクション内のファイル オブジェクトを反復処理して、フォルダー内のファイルのリストを取得できます。ただし、File オブジェクトはソートされません。Files コレクション内の File オブジェクトを並べ替えるには、並べ替えルーチンを使用する必要があります。

示す最小限のデモ コード:組み込みコマンドのようなシェル機能を使用する場合は、シェル (%comspec%) が必要です。

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
于 2013-06-03T11:34:48.987 に答える