こんにちは!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のスクリプトを実行した場合は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ファイルを作成したいと思います。これにはInstrRevとMidという2つの関数を使いました。
それぞれ次のような関数です。
InstrRev
第一引数で指定した文字列の中から第二引数で指定した文字列を後方から検索して、見つかった位置を返します。
Mid
第一引数で指定した文字列の左端から第二引数で指定された位置から文字数分の文字列を返します
例えば、D:\blog\images というDドライブに保存したimagesとうフォルダがあるとします。最終的に欲しいのはフォルダの名前imagesですね。
そこでまずInstrRevにD:\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などでも開けますよ。
如何でしたでしょうか?
僕はファイルサイズの合計を計算したり、一覧表にまとめてコピーしたりして使用しています。
宜しかったら活用してみて下さいね。
では、また!
コメント