この連載では、Windows Script Host(以降、WSH)のさまざまな機能を解説しつつ、日常の業務や生活に役立つスクリプトを紹介しています。具体的なスクリプトを読みながら、オブジェクトの構文や用法を理解していただきたいのはもちろんですが、実際にコードを実行することで、スクリプトを動かすことの楽しみを味わって頂ければと思います。

ゼロからはじめるWindows Script Host - 基本編
ゼロからはじめるWindows Script Host - テキスト読み書き編
ゼロからはじめるWindows Script Host - Excel連携編

さて、本連載も4回目となる今回は、ファイルシステム編。指定されたフォルダの配下に含まれるファイルの一覧をExcel表に整形するサンプルを紹介します。サンプルコードを通じて、ファイルシステム上のフォルダやファイル情報にアクセスする方法について理解してみましょう。

フォルダをスクリプトにドラッグ&ドロップすると

スクリプトから自動生成されたファイル一覧のExcelが生成される

スクリプト全体を概観する

それではさっそく、具体的なコードを見ていくことにします。なかなか複雑なコードですが、順を追って説明していきますので、まずはリストの中のコメントを手がかりに、どんな作業を行っているのか、全体像を把握してみてください。

[リスト01]filelist.vbs

    ' 生成したExcelファイルの保存先を定義
Const XLS_FILE = "C:\tmp\result.xls"
    ' Excel表への出力開始行を定義
Const START_ROW = 2

    ' ファイル一覧を実際に出力するためのFileListプロシージャ(1)
Sub FileList(path, i)
  Set fs = CreateObject("Scripting.FileSystemObject")
    ' 指定されたフォルダを表すFolderオブジェクトを生成
  Set fld = fs.GetFolder(path)
    ' フォルダ直下のファイル群を取得し、順に処理
  For Each fl In fld.Files
    ' Excel表のi行目に、ファイル名やフォルダパス、サイズなどを書き込み
    xls.Cells(i, 2) = fl.Name
    xls.Cells(i, 3) = fl.ParentFolder.Path
    xls.Cells(i, 4) = Int(fl.Size / 1024)
    xls.Cells(i, 5) = fl.Type
    xls.Cells(i, 6) = fl.DateCreated
    xls.Cells(i, 7) = fl.DateLastAccessed
    xls.Cells(i, 8) = fl.DateLastModified
    ' 書き込み先の行数を表す変数iをカウントアップ
    i = i + 1
  Next
  For Each subfld In fld.SubFolders
    FileList subfld.Path, i
  Next
End Sub

    ' スクリプトのメイン処理を表す部分(2)
Set xls = WScript.CreateObject("Excel.Application")
    ' 新規のワークブックを追加
Set book = xls.Workbooks.Add()
    ' 先頭行にタイトル行を出力
xls.Cells(START_ROW - 1, 2) = "名前"
xls.Cells(START_ROW - 1, 3) = "親フォルダ名"
xls.Cells(START_ROW - 1, 4) = "サイズ(KB)"
xls.Cells(START_ROW - 1, 5) = "種類"
xls.Cells(START_ROW - 1, 6) = "作成年月日"
xls.Cells(START_ROW - 1, 7) = "最終アクセス年月日"
xls.Cells(START_ROW - 1, 8) = "更新年月日"
    ' FileListプロシージャを呼び出し、ファイル一覧を生成
FileList WScript.Arguments.Item(0), START_ROW
    ' 作成したExcelファイルを指定したパスに保存
book.SaveAs(XLS_FILE)
    ' Excelを終了
xls.Quit()

これまでに登場したサンプルコードに比べるとやや複雑ですので、まずはコードのつくりについて見てみましょう。サンプルコードは、大きく、ファイル一覧を生成するためのSubプロシージャFileList(前半部の(1))と、Subプロシージャを呼び出すためのメインルーチン(後半部の(2))とに分けられます。