こんにちは!現場でバリバリ自動化を進めていると、「散らばったMarkdownのドキュメント、後から見返すのが大変だな……」「目次やリンクを手動でメンテするなんて、エンジニアの仕事じゃないよな」と感じる瞬間はありませんか?
今回は、VBScriptの真骨頂であるFileSystemObject(FSO)を駆使し、指定フォルダ内にある複数のMarkdownファイルを自動走査して、「自動目次(TOC)」と相互リンクをぶち込むドキュメント統合ツールの作り方を徹底解説します。
「VBScriptって古いんでしょ?」なんて侮るなかれ。Windows環境さえあれば、追加のインストールも環境構築も一切不要で、クリック一発で爆速に動作する最強のローカル自動化スクリプトが作れるんです。
ここをクリアすれば、ファイルシステムを自在に操るVBScriptの基本はバッチリですよ。一緒に手を動かしていきましょう!
—
1. なぜFSOとVBScriptなのか?
業務自動化の世界ではPythonやPowerShellが人気ですが、「配布のしやすさ」「軽量さ」「環境非依存(Windows標準)」という点において、VBScriptの右に出るものはありません。特に `Scripting.FileSystemObject` は、ファイルやフォルダの作成・読み書き・走査において、驚くほど洗練されたオブジェクトモデルを提供しています。
今回のツールの全体像はこうです:
1. 指定したフォルダの中にある `.md` ファイルをすべて探し出す。
2. 各ファイルの中身を読み込み、見出し(`#` や `
` など)を正規表現で抽出する。
3. ファイル同士を繋ぐ相互リンク(「前のページ」「次のページ」「目次へ戻る」)を自動で埋め込む。
4. すべての目次を集約した `index.md`(総合目次)を自動生成する。
これを手作業でやったら発狂ものですが、VBScriptなら一瞬です。
—
2. 開発の全体像とファイル構造
まずは、作業用のフォルダを一つ用意してください(例:`C:\MyDocs`)。
その中に今回のスクリプトファイル(例:`generate_toc.vbs`)を配置し、同じ階層にあるMarkdownファイルを処理させます。
—
3. 実装コード:一括目次・リンク生成ツール
以下のコードをメモ帳などに貼り付け、拡張子を `.vbs` にして保存してください。これが今回のメインエンジンです。
‘ ==============================================================================
‘ Script Name : Markdown TOC & Link Generator
‘ Description : 指定フォルダ内のMDファイルを走査し、見出し抽出と相互リンクを自動構築
‘ Author : チーフアーキテクト
‘ ==============================================================================
Option Explicit
‘ 定数の定義
Const TargetFolder = “.” ‘ 処理対象フォルダ(”.” はスクリプトと同階層)
Const IndexFileName = “index.md” ‘ 生成する総合目次ファイル名
‘ メイン処理の実行
Call Main()
Sub Main()
Dim fso, folder, file, files
Dim targetPath
‘ FileSystemObjectの生成(VBScriptにおけるファイル操作の必須アイテム)
Set fso = CreateObject(“Scripting.FileSystemObject”)
targetPath = fso.GetAbsolutePathName(TargetFolder)
WScript.Echo “=== Markdownドキュメントの統合処理を開始します ===”
WScript.Echo “対象パス: ” & targetPath
Set folder = fso.GetFolder(targetPath)
Set files = folder.Files
‘ 1. 対象フォルダ内のMDファイル一覧を取得・配列化する準備(簡易的にコレクションを走査)
Dim mdFiles()
Dim fileCount
fileCount = 0
For Each file in files
‘ 拡張子が .md かつ index.md 以外を対象とする
If LCase(fso.GetExtensionName(file.Name)) = “md” And LCase(file.Name) <> LCase(IndexFileName) Then
ReDim Preserve mdFiles(fileCount)
Set mdFiles(fileCount) = file
fileCount = fileCount + 1
End If
Next
If fileCount = 0 Then
WScript.Echo “処理対象のMarkdownファイルが見つかりませんでした。”
Exit Sub
End If
‘ 2. 総合目次(index.md)の中身を組み立てる
Dim indexContent
indexContent = “# 総合目次 (Auto-Generated)” & vbCrLf & vbCrLf
indexContent = indexContent & “このドキュメント群はVBScriptによって自動生成されています。” & vbCrLf & vbCrLf
Dim i, currentFile, content, line, lines, headings
Dim prevLink, nextLink
For i = 0 to fileCount – 1
Set currentFile = mdFiles(i)
WScript.Echo “処理中: ” & currentFile.Name
‘ ファイル読み込み
content = ReadTextFile(currentFile.Path)
‘ 簡易的な見出し抽出と目次への追加
indexContent = indexContent & “
[” & currentFile.Name & “](” & currentFile.Name & “)” & vbCrLf
‘ 各ファイルに相互リンク(ヘッダーとフッター)を挿入する処理
Dim navHeader, navFooter
navHeader = “”
navFooter = vbCrLf & vbCrLf & “—” & vbCrLf & “[目次に戻る](index.md)”
If i > 0 Then
navHeader = navHeader & “[<< 前のページ (" & mdFiles(i-1).Name & ")](" & mdFiles(i-1).Name & ") "
End If
If i < fileCount - 1 Then
If i > 0 Then navHeader = navHeader & ” | ”
navHeader = navHeader & “[次のページ >> (” & mdFiles(i+1).Name & “)](” & mdFiles(i+1).Name & “)”
End If
If navHeader <> “” Then
navHeader = navHeader & vbCrLf & vbCrLf & “—” & vbCrLf & vbCrLf
End If
‘ ファイルの内容を書き換え(ナビゲーションリンクを付与して上書き保存)
‘ ※実際の実装では既存のナビゲーションを置換するロジックを入れるとより安全です
Dim updatedContent
updatedContent = navHeader & content & navFooter
Call WriteTextFile(currentFile.Path, updatedContent)
‘ 総合目次に見出し要素を反映させる
indexContent = indexContent & ExtractHeadings(content, currentFile.Name) & vbCrLf
Next
‘ 3. 総合目次ファイルの書き出し
Call WriteTextFile(fso.BuildPath(targetPath, IndexFileName), indexContent)
WScript.Echo “=== すべての処理が正常に完了しました! ===”
End Sub
‘ — 文字コードを指定してテキストファイルを読み込む関数 (UTF-8対応) —
Function ReadTextFile(filePath)
Dim stream
Set stream = CreateObject(“ADODB.Stream”)
stream.Type = 2 ‘ adTypeText
stream.Charset = “UTF-8”
stream.Open
stream.LoadFromFile filePath
ReadTextFile = stream.ReadText
stream.Close
Set stream = Nothing
End Function
‘ — 文字コードを指定してテキストファイルを書き込む関数 (UTF-8対応) —
Sub WriteTextFile(filePath, textData)
Dim stream
Set stream = CreateObject(“ADODB.Stream”)
stream.Type = 2
stream.Charset = “UTF-8”
stream.Open
stream.WriteText textData
stream.SaveToFile filePath, 2 ‘ adSaveCreateOverWrite (上書き保存)
stream.Close
Set stream = Nothing
End Sub
‘ — Markdownから見出し(#)を抽出してインデント付きリストを作る関数 —
Function ExtractHeadings(fileContent, fileName)
Dim regEx, matches, match
Set regEx = New RegExp
‘ 行頭の # から始まる行を検出する正規表現
regEx.Pattern = “^(#{1,3})\s+(.+)$”
regEx.IgnoreCase = True
regEx.Global = True
Dim result
result = “”
If regEx.Test(fileContent) Then
Set matches = regEx.Execute(fileContent)
For Each match in matches
Dim sharpCount, headingText
sharpCount = Len(match.SubMatches(0))
headingText = match.SubMatches(1)
‘ 見出しの深さに応じてインデントをつける
Dim indent
indent = Space((sharpCount – 1) 4)
result = result & indent & “- [” & headingText & “](” & fileName & “#” & Replace(LCase(headingText), ” “, “-“) & “)” & vbCrLf
Next
End If
ExtractHeadings = result
End Function
—
4. コードの重要ポイントと「エンジニアの知見」
このスクリプトには、VBScriptを実務で使う上で絶対に外せない2つの大きなテクニックが詰まっています。ここを理解しておけば、他のファイル自動化スクリプトを書く時にも必ず役に立ちます。
① `ADODB.Stream` を使った文字コード(UTF-8)の制御
VBScriptの標準機能である `CreateObject(“Scripting.FileSystemObject”).OpenTextFile` は、実はデフォルトで文字コードが Shift-JIS (ANSI) になります。現代の標準である UTF-8 のMarkdownファイルをそのまま読み書きすると、日本語が盛大に文字化けします。
これを回避するため、上記のコードでは `ADODB.Stream` オブジェクトを呼び出し、明示的に `Charset = “UTF-8″` を指定して読み書きを行っています。
> 💡 チーフアーキテクトからのアドバイス:
> データベース接続用と思われがちな `ADODB.Stream` ですが、テキストファイルの文字コード変換・高速入出力においてはVBScript最強の相棒です。必ずセットで覚えておきましょう。
② 正規表現(RegExp)によるテキスト解析
Markdownの「見出し(`#`, `
`)」を正確に拾うために、VBScript内蔵の `VBScript.RegExp` オブジェクトを活用しています。
`^(#{1,3})\s+(.+)$` というパターンにより、何段階目の見出しなのか(H1〜H3)を判定し、総合目次側で綺麗にインデント(階層構造)を再現しています。
—
5. 陥りやすいエラーとトラブルシューティング
現場でこのスクリプトを動かす際、初心者がよくハマるポイントを先回りして解説しておきます。
- エラー:「オブジェクトが見つかりません: ‘ADODB.Stream’」
- 原因: 極めて稀ですが、極端に制限された古いサーバー環境などでMDACコンポーネントが破損している場合に発生します。通常のWindows 10 / 11 端末であれば標準で入っています。
- 日本語が文字化けする
- 原因: 元のMarkdownファイルがUTF-8(BOMなし)ではなく、Shift-JISなどで保存されている可能性があります。VSCodeなどでファイルのエンコーディングを「UTF-8」に統一してください。
- 権限エラー(Permission Denied)
- 原因: 処理対象のMarkdownファイルが他のアプリケーション(テキストエディタなど)で開いたままになっていると、上書き保存時にエラーになります。スクリプト実行時はファイルを閉じ、必要に応じて `On Error Resume Next` などのエラーハンドリングを追加してください。
—
6. おわりに
いかがでしょうか?
たったこれだけのコードを書くだけで、散らばったドキュメントの整理整頓が完全に自動化され、メンテナンスコストがゼロになります。
「VBScriptなんて古い」と言われることもありますが、「環境を選ばず、ファイルを直接いじり倒せる手軽さ」においては、今なお現役バリバリの強力な武器です。
ここをクリアしたあなたなら、ファイルシステムオブジェクト(FSO)を使ったバックアップスクリプトや、ログファイルの自動解析ツールなども、もう自力で組めるはずです。
日々の面倒な手作業はすべてスクリプトに丸投げして、もっとクリエイティブなエンジニアリングに時間を使いましょう!それでは、快適な自動化ライフを!
