v2.0で全面リニューアルしました。
グループ管理方式を廃止し、フォルダ指定 + .gitignore ベースのフィルタリングに変更しています。
ツール作成背景
Claude CodeのようなAIコーディングエージェントの性能も上がってきてますが、チャットスレッドでのコードのやりとりはまだまだ必要です。画像のアップロードでAIと検証したり、結合前のモジュール開発をしたり、トークンの節約をしたり。
その際、プロジェクトのソースコードをチャットに貼り付ける作業があります。ファイルを1つずつ開いてコピーして...というのは面倒ですし、バイナリファイルやロックファイルを除外して必要なものだけ選ぶのも手間です。
File Clipboard Manager はその作業を自動化するツールです。プロジェクトフォルダを指定するだけで、.gitignore のルールに基づいてファイルを自動選別し、クリップボードに一括登録します。
v2.0での主な変更点
v1.xではファイルを手動で4つのグループに登録する方式でしたが、実際に使ってみると以下の問題がありました。
- ファイルを1つずつ手動で登録するのが面倒
- プロジェクト内のファイル構成が変わるたびに登録し直す必要がある
-
.gitignoreで管理しているのに、同じ除外ルールをツール側でも意識しなければならない
v2.0ではこれらを根本的に解決するため、フォルダ指定型に設計を変更しました。
| 変更点 | v1.x | v2.0 |
|---|---|---|
| ファイル管理 | 手動でグループに登録 | フォルダ指定で自動取得 |
| フィルタリング | なし |
.gitignore + 除外リスト |
| 設定ファイル | config.json(グループ定義) | settings.json(除外ルール定義) |
| 依存関係 | PowerShellのみ | PowerShell + Python(pathspec) |
主な機能
フォルダベースのファイル管理
プロジェクトフォルダを指定すると、配下のファイルを再帰的に取得し、以下の3段階でフィルタリングします。
-
.gitignoreのルールを適用(pathspecライブラリ使用) - 除外拡張子に該当するファイルを除外(画像・メディア・バイナリ・アーカイブ等)
- 除外ファイル名に該当するファイルを除外(ロックファイル等)
先頭が . のディレクトリ(.git, .github, .vscode 等)は .gitignore の設定に関わらず常に除外されます。
クリップボード登録
3つの登録方式があります。
ファイルパス方式 -- エクスプローラー互換のファイルドロップリストとして登録。エクスプローラーへの貼り付けが可能。
フェンス付きテキスト方式 -- 各ファイルの内容をファイルパスとMarkdownコードフェンス(```)で囲んだテキストとして登録。Claude AIのProject Knowledgeやチャットへのコード送信に最適。
クリップボードへのフェンス追加 -- 既にコピー済みのテキストやファイルにコードフェンスを追加して再登録。ちょっとしたコードスニペットの整形に便利。
その他
- ファイル詳細ウィンドウ: フィルタリング結果の一覧表示、選択ファイルのみのクリップボード登録
- BOM付きUTF-8変換: 文字化け対策用(ファイル直接上書き)
- コード更新ボタン: ファイル変更後のフィルタリング再実行
- フォルダ履歴: 最大10件保持、ComboBoxで切替
- タスクトレイ常駐
ソースコード
GitHub:
https://github.com/ya-ma-n-1972/powershell_tool_report/tree/main/File-Clipboard-Manager
動作環境
- Windows 10/11
- PowerShell 5.1 以降
- Python 3.x
- pathspec ライブラリ(
pip install pathspec)
ファイル構成
File-Clipboard-Manager/
├── File-Clipboard-Manager.ps1 # メインスクリプト(PowerShell UI)
├── filter.py # .gitignoreパーサー(Python)
├── settings.json # 設定ファイル(初回起動時に自動生成)
└── README.md
使用方法
起動
.\File-Clipboard-Manager.ps1
起動時にPythonとpathspecの存在を自動チェックします。不足している場合はエラーメッセージが表示されます。settings.json が存在しない場合はデフォルト値で自動生成されます。
基本操作
1. プロジェクトフォルダの選択
「フォルダ選択」ボタンでプロジェクトフォルダを選択すると、.gitignore と除外ルールに基づいてファイルが自動フィルタリングされます。対象ファイル数がメッセージエリアに表示されます。
一度選択したフォルダは履歴に保存され、ComboBoxから切替可能です。
2. クリップボードへの登録
「クリップボードへ」 -- ファイルパス方式。エクスプローラーに貼り付け可能。
「フェンス付きクリップボード」 -- 全対象ファイルをフェンス付きテキストにして登録。出力形式は以下のようになります。
ファイルパス: D:\project\src\main.py
(ここにコードフェンスが入る)
def main():
print("hello")
(ここにコードフェンスが閉じる)
読み込めなかったファイルがある場合は「○件、○件スキップ」とメッセージに表示されます。
「クリップボードにフェンス追加」 -- 既にコピー済みのテキストやファイルにフェンスを追加。
3. ファイル詳細の確認
「ファイル詳細」ボタンで、フィルタリング結果のファイル一覧を確認できます。ここから選択したファイルだけをクリップボード登録したり、BOM変換を実行したりできます。
4. .gitignore フィルタリングの切替
「.gitignore を有効にする」チェックボックスでON/OFFを切替可能です。OFFにすると拡張子・ファイル名の除外ルールのみが適用されます。
.gitignore が存在しないプロジェクトではOFFにしてください。
設定ファイル(settings.json)
初回起動時にデフォルト値で自動生成されます。手動編集も可能です。
{
"gitignore_enabled": true,
"folder_history": [],
"exclude_extensions": [
".png", ".jpg", ".jpeg", ".gif", ".bmp", ".svg", ".ico", ".webp",
".tiff", ".tif", ".psd", ".ai", ".eps", ".raw", ".heic", ".avif", ".icns",
".mp4", ".mp3", ".wav", ".flac", ".aac", ".ogg", ".avi", ".mov",
".mkv", ".wmv", ".m4a", ".m4v", ".webm", ".wma", ".m4p", ".3gp",
".exe", ".dll", ".so", ".dylib", ".bin", ".obj", ".class",
".apk", ".aab", ".ipa", ".jar", ".war", ".ear", ".jmod",
".zip", ".tar", ".gz", ".7z", ".rar", ".bz2", ".xz",
".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx",
".db", ".sqlite", ".sqlite3",
".o", ".a", ".lib", ".pyc", ".pyo"
],
"exclude_filenames": [
"Cargo.lock", "package-lock.json", "yarn.lock", "pnpm-lock.yaml",
"poetry.lock", "Pipfile.lock", "Gemfile.lock", "composer.lock",
"go.sum", "packages.lock.json", "Package.resolved", "pubspec.lock"
]
}
- exclude_extensions: 除外する拡張子(画像・メディア・バイナリ・アーカイブ等)
- exclude_filenames: 除外するファイル名(ロックファイル等)
- folder_history: フォルダ履歴(自動管理)
除外リストは用途に応じて手動で追加・削除できます。
技術的なポイント
PowerShell + Python の構成
PowerShellはGUIとクリップボード操作に強いですが、.gitignore のパース処理はルールが複雑です(ネガティブパターン、ディレクトリ指定、ワイルドカード等)。自前で実装するより、Pythonの pathspec ライブラリに任せた方が確実なので、フィルタリング部分だけPythonに委譲しています。
PowerShellからはサブプロセスとしてPythonスクリプトを呼び出します。
$filterArgs = @($script:filterScriptPath, $script:currentFolder)
if (-not $script:gitignoreEnabled) {
$filterArgs += "--no-gitignore"
}
$output = & python @filterArgs 2>&1
Python側はフィルタリング結果のファイルパスを1行1パスで標準出力に書き出し、PowerShell側でそれを配列として受け取ります。
ネガティブリスト方式の除外
v1.xでは対応する拡張子をホワイトリストで管理していましたが、Kotlinの .kt など新しい拡張子を追加し忘れると対象から漏れるという問題がありました。
v2.0では逆に、除外すべき拡張子(画像・バイナリ等)をリストアップするネガティブリスト方式に変更しました。未知の拡張子はデフォルトで対象に含まれるため、追加漏れのリスクが大幅に減ります。
バイナリファイル混入の罠
開発中に .icns(macOSのアイコンファイル)が除外リストに無い状態でフェンス付きクリップボードを実行したところ、クリップボードの内容が途中で途切れるという現象が発生しました。
原因は、バイナリファイルに含まれるnullバイト(0x00)です。[System.Windows.Forms.Clipboard]::SetText() にnullバイトが混入すると、そこで文字列が終端されてしまい、以降のファイル内容がすべて失われます。エラーメッセージも出ません。
この経験から、バイナリファイルの除外は確実に行う必要があると痛感し、除外リストの網羅性を重視した設計にしています。
フェンス付きテキストの出力形式
Claude AIのProject Knowledgeとの相性を考慮して、ファイルパスを明示する形式にしています。
$allText += "ファイルパス: $f`n"
$allText += $fence + "`n"
$allText += $content + "`n"
$allText += $fence + "`n`n"
ファイルパスが明示されていることで、AIがどのファイルのコードなのかを正確に認識できます。「このファイルの○行目を修正してください」のような具体的な指示をAIから受け取れるようになります。
settings.json の自動生成
v2.0では settings.json が存在しない場合、初回起動時にデフォルト値で自動生成します。これにより、GitHubからクローンした直後でもすぐに使い始められます。
function Load-Settings {
if (-not (Test-Path $script:settingsPath)) {
$defaultSettings = @{
gitignore_enabled = $true
folder_history = @()
exclude_extensions = @( ... )
exclude_filenames = @( ... )
}
$defaultSettings | ConvertTo-Json -Depth 10 | Set-Content $script:settingsPath -Encoding UTF8
}
# 以降、通常の読み込み処理
}
Save-Settings 側にも同じデフォルト値を持たせているので、何らかの理由で settings.json が消えても次回保存時に復旧します。
トラブルシューティング
| 症状 | 原因 | 対処法 |
|---|---|---|
| スクリプトが起動しない | 実行ポリシー制限 |
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser で許可 |
| 「Pythonが見つかりません」 | PATHが通っていない |
python --version が実行できるか確認 |
| 「pathspecが見つかりません」 | 未インストール |
pip install pathspec を実行 |
| 「.gitignoreが見つかりません」 | ファイル未作成 |
.gitignore を作成するかチェックをOFFに |
| フェンス付きで一部欠落 | UTF-8読み込み失敗 | メッセージに「○件スキップ」と表示される |
| クリップボードに登録されない | 他のアプリが使用中 | 他のアプリを閉じるか、Windowsを再起動 |
まとめ
v1.xを使っているうちに「ファイルを手動で登録するのが結局面倒」という本末転倒な状態になったので、v2.0ではフォルダ指定 + .gitignore 連動で自動化しました。
Claude Codeのようなエージェントが進化しても、チャットでコードを見せたい場面はまだまだあります。そのときに「フォルダ選択してボタン押すだけ」で済むのは、地味ですが確実に手間を減らせます。
需要があるかはわかりませんが、もし活用して頂けるなら幸いです。
(初版:2025/10/31、v2.0更新:2026/03/25)
ライセンス
MIT License