メインルーチンを理解する

まずは、簡単なメインルーチン(スクリプトの幹の部分)からです。filelist.vbsで、メインルーチンと呼んでいるのは、以下の部分です。Excelファイルの作成から保存までを行っている部分です。

    ' Excel.Applicationオブジェクトを生成
Set xls = WScript.CreateObject("Excel.Application")
    ' 新規のワークブックを追加(1)
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ファイルを指定したパスに保存(2)
book.SaveAs(XLS_FILE)
    ' Excelを終了
xls.Quit()

Excelファイルの操作については、Excel連携編でも紹介していますので、ここでは前回紹介できなかった点を中心に解説します。

(1)新規のワークブックを生成する

新規のワークブックを作成するには、Workbooks.Addメソッドを呼び出します((1))。これで新規のワークブックが追加されました。しかし、この状態ではワークブックには名前もついていない状態ですので、最後にワークブックを「名前をつけて保存」する必要があります。

Excel連携編のサンプルでは、既存のファイルを上書き保存するだけでしたので、単にSaveメソッドを呼び出すだけでしたが、新規のファイルに名前をつけて保存するには、SaveAsメソッドを使います。SaveAsメソッドの引数には、新規ファイルの保存先を絶対パスで指定します((2))。

(2)スクリプトへのパラメータを取得するのはArgumentsプロパティ

スクリプトにパラメータを渡すもっとも典型的な方法は、コマンドラインから以下のようにスクリプトを起動することです。

> filelist.vbs C:\Data

ただ、スクリプトの使い勝手を考えれば、いちいちフォルダのパスを手入力するのは避けたいところでしょう。そこでWSHでは、スクリプトにフォルダ/ファイルをドラッグ&ドロップすることで、対応するフォルダ/ファイルのパスをスクリプトに引き渡せるようになっています。

対象のフォルダをスクリプトにドラッグ&ドロップ

スクリプトの側では、パスがドラッグで渡されたのか、それともコマンドラインからのパラメータとして渡されたのかを意識する必要はありません。いずれのパス(パラメータ)もArgumentsプロパティで取得できます。具体的に、渡されたフォルダのパスを取得しているのは、以下のコードです。

FileList WScript.Arguments.Item(0), START_ROW

Argumentsプロパティは、スクリプトに渡されたパラメータを管理するWshArgumentsオブジェクトを返します。WshArgumentsオブジェクトは、パラメータを格納した配列のようなものだと考えれば良いでしょう。

ここでは、パラメータがひとつだけ渡されることを想定していますので、WshArgumentsオブジェクトのItemプロパティで0番目のパラメータにアクセスします。配列と同じように、WshArgumentsオブジェクトの中のパラメータは0、1、2...のように0スタートで数えます。

WshArgumentsオブジェクト

ちなみに、複数のパラメータ(この場合は複数のフォルダ/ファイル)を取得したいという場合には、次のように書きます。

For i = 0 To WScript.Arguments.Count - 1
  WScript.Echo(WScript.Arguments.Item(i))
Next

CountプロパティはWshArgumentsオブジェクトに含まれるパラメータの数を表します。このコードでは、パラメータの数だけForループを回して、それぞれのパラメータをEchoメソッドで順に出力しているわけですね。