生成Ai プログラミング例 フォルダー内のファイル名リスト化.vbs
管理者用
ChatGPTなど生成Aiがプログラムのコーディングも行ってくれる。
私自身、名刺の自動組版、宛名レイアウトなど、多少プログラミングの経験はある。
必要にせまられて、対応して来たが、時々の対応で技術的には低レベル。
生成Aiは、私のようなレベルの方に、有効なツールになるかもしれない。
と言う事で、実験を行っている。
先日、生成Aiを使って、エクセルVBAからインデザインを動かす話を紹介している。
インデザインを起動して、テキストフレームを作り、エクセル表の内容をテキストフレームに書き込むまでを取りあげた。
生成Ai、使えるかもと感じている。
今回は、同じようなスクリプト言語のVBSを取り上げた。
フォルダー内のファイルの名を書きだすスクリプト
フォルダー内のファイルのファイル名を書き出す方法は、古い記事となりましたが、このNAVIで紹介している。
この時も簡単なVBSコードで作っており、生成Aiとの比較も面白いかもしれない。
1回目のコーディング指示
ディスクトップの特定の フォルダーをドロップする。
ドロップしたフォルダーにあるファイル名を取得する、VBSスクリプトを書きたい
フォルダーをドロップして、その中のファイル名を取得するVBScriptは次のようになります。
VBScript
OptionExplicit Dim objArgs, objFolder, objFile, objFSO SetobjArgs = WScript.Arguments SetobjFSO = CreateObject("Scripting.FileSystemObject") If objArgs.Count = 0 Then MsgBox "フォルダーをドロップしてください。" WScript.Quit EndIf SetobjFolder = objFSO.GetFolder(objArgs(0)) If NotobjFolder.IsRootFolder Then ForEachobjFile InobjFolder.Files MsgBox objFile.Name NextElse MsgBox "ルートフォルダーは指定できません。" EndIf
解説
- Option Explicit: 変数の宣言を強制し、タイプミスによるエラーを防ぎます。
- objArgs: ドロップされたフォルダーのパスを取得します。
- objFSO: ファイルシステム操作を行うためのオブジェクトを作成します。
- objFolder: ドロップされたフォルダーの情報を取得します。
- objFolder.IsRootFolder: ドロップされたものがルートフォルダー(C:\など)でないかを確認します。ルートフォルダーは処理できないため、エラーメッセージを表示します。
- For Each objFile In objFolder.Files: フォルダー内のファイルを順番に処理します。
- MsgBox objFile.Name: 各ファイルの名前をメッセージボックスで表示します。
使い方
- このスクリプトをテキストエディタで作成し、拡張子を.vbsとして保存します (例: get_filenames.vbs)。
- 保存したVBScriptファイルに、ファイル名を取得したいフォルダーをドラッグ&ドロップします。
- フォルダー内の各ファイルの名前が、メッセージボックスに順番に表示されます。
注意点
- スクリプトの実行には、Windows Script Hostが必要です。
- 大量のファイルが含まれるフォルダーを処理する場合、メッセージボックスが大量に表示されることがあります。その場合は、メッセージボックスの代わりにテキストファイルに出力するなどの工夫が必要になります。
- サブフォルダー内のファイルを取得したい場合は、再帰処理を追加する必要があります。
改良点
- ファイル名だけでなく、パス、サイズ、更新日時などの情報も取得できるようにする。
- 取得したファイル情報をテキストファイルやCSVファイルに出力する。
- サブフォルダー内のファイルも再帰的に処理する。
- GUI (Graphical User Interface) を作成し、ドラッグ&ドロップではなく、フォルダー選択ダイアログからフォルダーを選択できるようにする。
コーデングは、もちろん解説まで書いてくれる親切さ、勉強にもなり。
しかし、このままでは、ファイル名の表示で終わっている。
リストとして残すよう、追加の指示の次の項へ。
2回目の再コーディング
ドラックしたフォルダーの取得したファイル名をリスト化を指示
ファイル名だけでなく、パス、サイズ、更新日時などの情報も取得できるようにする。
取得したファイル情報をテキストファイルやCSVファイルに出力する。
サブフォルダー内のファイルも再帰的に処理する。
ファイル名、パス、サイズ、更新日時を取得し、サブフォルダーも再帰的に処理してCSVファイルに出力するVBScriptは次のようになります。
VBScript
Option Explicit Dim objArgs, objStartFolder, objFSO, objOutputFile Set objArgs = WScript.Arguments Set objFSO = CreateObject("Scripting.FileSystemObject") If objArgs.Count = 0 Then MsgBox "フォルダーをドロップしてください。" WScript.Quit End If Set objStartFolder = objFSO.GetFolder(objArgs(0)) Set objOutputFile = objFSO.CreateTextFile(objStartFolder.Path & "\file_list.csv", True) objOutputFile.WriteLine "ファイル名,パス,サイズ(バイト),更新日時" Call ListFiles(objStartFolder) objOutputFile.Close MsgBox "ファイルリストをCSVファイルに出力しました。" Sub ListFiles(objFolder) Dim objFile, objSubFolder For Each objFile In objFolder.Files objOutputFile.WriteLine objFile.Name & "," & objFile.Path & "," & objFile.Size & "," & objFile.DateLastModified Next For Each objSubFolder In objFolder.SubFolders Call ListFiles(objSubFolder) Next End Sub
解説
- objOutputFile: 出力用のCSVファイルを作成します。
- objOutputFile.WriteLine: CSVファイルのヘッダー行を出力します。
- ListFiles(objStartFolder): 再帰的にファイル情報を取得するサブルーチンを呼び出します。
- ListFiles(objFolder):
- 引数で渡されたフォルダー内のファイルを処理します。
- 各ファイルの情報をCSVファイルに書き込みます。
- サブフォルダーが存在する場合は、自分自身を再帰的に呼び出して処理します。
使い方
- このスクリプトをテキストエディタで作成し、拡張子を.vbsとして保存します (例: get_file_info.vbs)。
- 保存したVBScriptファイルに、ファイル情報を取得したいフォルダーをドラッグ&ドロップします。
- 処理が完了すると、フォルダー内にfile_list.csvという名前のCSVファイルが作成され、ファイル情報が出力されます。
注意点
- スクリプトの実行には、Windows Script Hostが必要です。
- 大量のファイルや深い階層のフォルダーを処理する場合、時間がかかることがあります。
- CSVファイルの文字コードは、システムのデフォルト設定(通常はShift_JIS)になります。必要に応じて、文字コード変換を行う必要があります。
- ファイル名やパスにカンマが含まれる場合、CSVファイルの形式が崩れる可能性があります。その場合は、カンマを別の文字に置き換えるなどの処理が必要です。
使用方法
実際に使って見ました。
- 書き出してくれた、プログラムをコピーして、メモ帳等のエディター等で、〇〇◯.vbs ファイルを作る。
- このファイルをディスクトップ上に保存する。
- この 〇〇◯.vbs アイコン に、リスト化したいフォルダーをドラックする
- ドラックしたフォルダー内に、.csv フィルが追加される。
- 追加された、CSVファイルには、フォルダー内のファイルリストが出来ている。
簡単なスクリプトですが、どうですか。
指示の文で、コーディングしてくれる。
2回目の 追加指示においても、1回めの それまでの指示が継承されている。
今後の課題
実験レベルで生成Aiを使ったが、単純なものは、問題なさそうだ。
しかし、より複雑なアプリを考えた場合、どのように指示を与え生成してもらうか、難しそうに見える。
Vbsに限らないが、プログラム言語に関係なく、どのようにしたら良いか考えて見た。
・まず仕様書をしっかり作成しておく
・機能や項目を小さく分けて、一つ一つを単純化する
・指示を文書に落とし込む際、単純明快に順番に記述
こんな事ぐらいしか思い浮かばなかいが、ここで思いついた。
Aiに指示の仕方について訪ねた。
記事が長くなるので、次回のNAVIで紹介する。