ファイルの一覧を取得する方法

こんにちは!Rhinoです。

未だにファイルの管理にExcelを使用していらっしゃいませんか?
僕が属している業界はまだまだ多い気がします。
フォルダ内のテクスチャやシーンファイルの一覧をExcelにコピーして管理用のシートを作成するなんてことがあったりします。
結構面倒なんですよね…
そこで、今回はそれを解決できないかなあと考えてみました。
選んだのはWindows上で手軽に動作させることのできるVBScriptです。
フォルダをVBScriptにドラッグアンドドロップするとフォルダ内のファイルの一覧をCSVとして出力するようなものを作ってみました。

Dim oArgs, oFSO

Set oArgs = WScript.Arguments
Set oFSO = WScript.CreateObject( "Scripting.FileSystemObject" )

If oArgs.Count = 0 Then
	WScript.Echo "DRAG-AND-DROP any folder."
	WScript.Quit
End If

For Each args in oArgs
	If oFSO.FolderExists( args ) Then
		Dim oFolder, oFolderName, oOutputFilePath, oCSVFile
		
		Set oFolder = oFSO.GetFolder( args )
		If oFolder.Files.Count = 0 Then
			WScript.Echo "File does not exit in this folder."
			WScript.Quit
		End If
		
		oFolderName = Mid( args, InstrRev(args, "\") + 1 )
		oOutputFilePath = oFolder & "\" & oFolderName & ".csv"

		Set oCSVFile = oFSO.OpenTextFile( oOutputFilePath, 2, True )
		
		oCSVFile.WriteLine( "File Name" & "," & "File Size" )
		
		For Each file in oFolder.Files
			If file.Name <> oFolderName & ".csv" Then
				oCSVFile.WriteLine( file.Name & "," & FormatNumber(file.Size,0,,,0) )
			End If
		Next
		
		oCSVFile.Close

		Set oCSVFile = Nothing
		Set oOutputFilePath = Nothing
		Set oFolderName = Nothing
		Set oFolder = Nothing
	End If
Next

Set oFSO = Nothing
Set oArgs = Nothing

解説

VBScriptって何?

VBScriptというのは一言で言ってしまうとWindows上で動く簡易なプログラミング言語になります。
Windowsを使っている人であれば誰でも特別なソフトを用意することもなく書いて動かすことができるので、Windowsで業務を行っている人の作業の効率化に便利なツールだと思います。
ご紹介しているVBScriptはNotepad++というテキストエディタだけで書いたもので、とても手軽に作成することができます。

スクリプトの使い方を考えてみよう

このスクリプトを使うのは次の2つの場合があるのではないかと考えました。

  1. スクリプトをダブルクリックして実行した場合
  2. フォルダをドラッグアンドドロップした場合

1のスクリプトを実行した場合はWScriptのプロパティArgumentsから実行時のパラメータを取得できますので、このパラメータの数を数えることで対応します。
2のドラッグアンドドロップの場合はファイル操作を行うためのFileSystemObjectを作成して対応します。

Dim oArgs, oFSO

Set oArgs = WScript.Arguments
Set oFSO = WScript.CreateObject( "Scripting.FileSystemObject" )

スクリプトをダブルクリックして実行した場合は、今回は処理はしませんので、警告文だけ表示してスクリプトを終了することにしました。
ダブルクリックしたかどうかはWScriptのプロパティArgumentsにアクセスするとスクリプトに渡された値、具体的にはスクリプトにドラッグアンドドロップしたフォルダやファイルのパスを取得できるのですが、パスがなければドラッグアンドドロップせずにダブルクリックして実行したこととなりますので、プロパティArgumentsの数を数えて0(ゼロ)の場合に分かります。

If oArgs.Count = 0 Then
	WScript.Echo "DRAG-AND-DROP any folder."
	WScript.Quit
End If

ドラッグアンドドロップされるフォルダは1つとは限らない

ドラッグアンドドロップされるフォルダは1つとは限りませんよね?
人によっては複数個をまとめてドラッグアンドドロップするでしょうし、そもそもフォルダではなくファイルかもしれません。
なので、取得したパラメータは複数の可能性がありますのでループで1つ1つ取り出して、それがフォルダだった場合のみ処理することにしました。

For Each args in oArgs
	If oFSO.FolderExists( args ) Then

フォルダの中にファイルがあるかどうか調べよう

もしドラッグアンドドロップしたフォルダの中にファイルが入っていなければ、そのままプログラムを進めていった場合エラーになることがあります。
予めそういう状態は回避しておいた方が無難ですね。
どうやってファイルがあるかどうかを調べるかどうかと言いますと、やり方は簡単でフォルダの中のファイルの数をCountで数えるだけです。
返ってきた数は0(ゼロ)であれば何もないというわけです。

    Set oFolder = oFSO.GetFolder( args )
    If oFolder.Files.Count = 0 Then
        WScript.Echo "File does not exit in this folder."
        WScript.Quit
    End If

CSVファイルを用意しよう

先ほどフォルダを変数oFolderに入れました。
この中にはフォルダがパス込みで入っています。
これを使ってフォルダの中にフォルダの名前を付けたCSVファイルを作成したいと思います。これにはInstrRevMidという2つの関数を使いました。
それぞれ次のような関数です。

InstrRev

第一引数で指定した文字列の中から第二引数で指定した文字列を後方から検索して、見つかった位置を返します。

Mid

第一引数で指定した文字列の左端から第二引数で指定された位置から文字数分の文字列を返します

例えば、D:\blog\images というDドライブに保存したimagesとうフォルダがあるとします。最終的に欲しいのはフォルダの名前imagesですね。
そこでまずInstrRevD:\blog\imagesというパスを渡して、”\”で広報から検索します。すると8番目という位置が返ってきます。
この8に1を足した9番目からimagesというフォルダ名が始まっていますのでそれをMidに渡すことでフォルダ名を抜き出すことができます。
文字数は省略可能です。

    oFolderName = Mid( args, InstrRev(args, "\") + 1 )

フォルダ内にCSVファイルを作りたいので、フォルダのパスにフォルダ名と拡張子.csvを&でつないで出力ファイルのパスを作成します。

  oOutputFilePath = oFolder & "\" & oFolderName & ".csv"

CSVファイルにファイル名とファイルサイズを記述しよう

最初に用意したCSVファイルをOpenTextFile関数を使って開きます。
書き込みを示す2と指定したファイルが存在しない場合に新しく作成するということを示すTrueの2つの引数を与えて開きます。
次にCSVファイルの先頭行にFile NameとFile Sizeという文字を書き込みました。

Set oCSVFile = oFSO.OpenTextFile( oOutputFilePath, 2, True )
		
oCSVFile.WriteLine( "File Name" & "," & "File Size" )

最後にフォルダ内のファイル名とファイルサイズを書き込んであげれば完了ですね。但し、フォルダ内に既にCSVファイルが存在しているかもしれません。その場合はCSVファイルに自分自身のファイル名とファイルサイズを書き込んでしまいますので、これは除外しておきましょう。
ファイル名はファイルオブジェクトのプロパティNameから、ファイルサイズは.Sizeからそれぞれ取得可能です。

For Each file in oFolder.Files
 If file.Name <> oFolderName & ".csv" Then
  oCSVFile.WriteLine( file.Name & "," & FormatNumber(file.Size,0,,,0) )
 End If
Next

使い方

コードを適当な名前で.vbsという拡張子で保存した後、調べたいフォルダをスクリプト上にドラッグアンドドロップして下さい。

するとフォルダ内にフォルダ名のついたCSVが出来たかと思います。

CSVの中はこのようにファイル名とファイルサイズが記載されています。

メモ帳ではちょっと見づらいのでグーグルスプレッドシートで開いてみました。

もちろんExcelなどでも開けますよ。
如何でしたでしょうか?
僕はファイルサイズの合計を計算したり、一覧表にまとめてコピーしたりして使用しています。
宜しかったら活用してみて下さいね。
では、また!

コメント

タイトルとURLをコピーしました