👋

Windows WSL環境での Gemini CLI への画像貼り付けを爆速化する方法(alias & カスタムコマンド)

に公開


Windows Terminal から Claude Code や Gemini CLI を使うときの画像貼り付け問題を解決する

https://qiita.com/advent-calendar/2025/ca-advance-ai

🔥 問題の本質

macOS の iTerm では、スクショを撮影してショートカットキー(Ctrl+V)でペーストすれば、Claude Code や Gemini CLI といったCLI AIエージェントツールが画像を即座に理解してくれます。

一方、Windows + WSL + Windows Terminal の組み合わせでは、画像の直接貼り付けができません。

この問題は、様々なツールにおいて、ユーザーが直面する問題として報告されており、例えば、 Codex の issue で以下のようなものがあります。

https://github.com/openai/codex/issues/3939

この問題に対する従来のワークアラウンドは以下の手順でした:

  1. スクショを撮影
  2. 画像をファイルとして保存
  3. @/mnt/c/Users/username/Pictures/Screenshots/image.jpg とパスを手打ち入力

この方法には致命的な問題があります:

  • タイピングエラーが発生しやすい
  • ファイル名の補完が効かない(lsなどのシェルコマンドと異なり、gemini cliのインターフェース上では補完できない)
  • 毎回長いパスを入力する必要がある

また、Powershell を使って、効率的にワークアラウンドをする方法も時々見かけますが、そちらも個人的には以下の点で難しいなと感じています。

  • Powershell 自体の理解がまだまだ足りない
  • 結局 Powershell のコマンドを実行後、WSL 内で linux コマンドも実行するというような手間になっていることが多い。
  • Linux 環境から、Powershell の機能を呼び出そうとするような複雑さが含まれる手法もある。

💡 解決策の全貌

以下のワンライナーコマンドで、最新のスクショを現在のディレクトリにコピーできます:

cp "$(find /mnt/c/Users/$USERNAME/Pictures/Screenshots/ -type f -printf "%T@ %p\n" | sort -n | tail -1 | cut -d' ' -f2-)" .

$USERNAMEWindows のユーザーネームです。WSL の Linux 上のユーザーとは異なる点に注意。

🔍 コマンドの詳細解析

このコマンドが何をしているのか、パイプ処理の各段階を分解して説明します。

find: スクショディレクトリのファイル一覧を取得

find /mnt/c/Users/$USERNAME/Pictures/Screenshots/ -type f -printf "%T@ %p\n"
  • findコマンドで指定ディレクトリ内のすべてのファイル(-type f)を検索
  • -printf "%T@ %p\n"で、タイムスタンプ(エポック秒)とファイルパスを出力
  • 出力例:
1731629453.1234567890 /mnt/c/Users/$USERNAME/Pictures/Screenshots/old_image.png
1731633892.9876543210 /mnt/c/Users/$USERNAME/Pictures/Screenshots/latest_image.png

スクリーンショットがなぜ上記の /mnt/c で始まるディレクトリに保存されるか以下で説明します。

そもそもの前提知識として、 Windows でスクリーンショットを撮影すると、以下の場所に自動で保存されます。
(※ただし、Print Screen のキーで撮影する場合はクリップボードのみに保存され、画像ファイルは保存されません)

デフォルトの画像保存先は設定にもよりますが、通常は C:\Users[ユーザー名]\ピクチャ\スクリーンショット に自動的に保存されます。
OneDriveを有効にしている場合は C:\Users[ユーザー名]\OneDrive\画像\スクリーンショット に保存されることもあります。

引用元: Windowsのスクリーンショット保存先を変更する方法(Shift+Win+S対応) | インフラエンジニアの備忘録

つまり、C:\Users\[UserName]\Pictures\Screenshots のフォルダに保存されるのがデフォルトです。

WSL では、Windowsのファイルシステムのパスにアクセスするには、/mnt/c に Windows の C ドライブがマウントされ、直接Linuxのファイルシステムからアクセスすることが可能です。
(※D ドライブなら、/mnt/d などそのアルファベット?)

実際に WSL (Ubuntu 20.04) で ls コマンドを実行すると以下のように確認ができます。

$ ls -l /mnt/c/Users/$USERNAME/Pictures/Screenshots/
total 232
-rwxrwxrwx 1 $USERNAME $USERNAME 142446 Nov 15 13:20 'Screenshot 2025-11-15 132016.png'
-rwxrwxrwx 1 $USERNAME $USERNAME  43281 Nov 15 13:23 'Screenshot 2025-11-15 132313.png'
-rwxrwxrwx 1 $USERNAME $USERNAME  22768 Nov 15 14:41 'Screenshot 2025-11-15 144123.png'
-rwxrwxrwx 1 $USERNAME $USERNAME  20606 Nov 15 17:38 'Screenshot 2025-11-15 173824.png'
-rwxrwxrwx 1 $USERNAME $USERNAME    190 Feb 13  2023  desktop.ini

sort: タイムスタンプで並べ替え

sort -n
  • 数値として並べ替え(-n)
  • タイムスタンプが古い順に並ぶ

tail: 最新のファイルを抽出

tail -1
  • 最後の1行(=最新のタイムスタンプのファイル)だけを取得

cut: ファイルパスだけを抽出

cut -d' ' -f2-
  • スペース区切り(-d' ')で分割
  • 2フィールド目以降(-f2-)を取得
  • これでタイムスタンプが除去され、ファイルパスだけが残る

cp: 現在のディレクトリにコピー

cp "$(コマンド置換)" .
  • $()でコマンド置換を実行
  • cpコマンドで最新のスクショファイルを現在のディレクトリ(.)にコピー

🚀 エイリアスで更に効率化

毎回長いコマンドを打つのは非効率です。.bashrcまたは.zshrcにエイリアスを追加しましょう。

設定方法

# .bashrc または .zshrc に追記
alias cpss='cp "$(find /mnt/c/Users/$USERNAME/Pictures/Screenshots/ -type f -printf "%T@ %p\n" | sort -n | tail -1 | cut -d'"'"' '"'"' -f2-)" .'

※$USERNAME は自分の Windows のユーザー名に変更する必要があります。

設定を反映:

source ~/.bashrc  # または source ~/.zshrc

alias 単体使用例

# カレントディレクトリにもっとも直近で撮影されたスクリーンショットを保存
$ cpss

# ls コマンドを実行すると、実際に保存されていることが確認できる
$ ls -larth
total 24
-rwxr-xr-x 1 $USERNAME $USERNAME 20606 Nov 15 18:21 'Screenshot 2025-11-15 173824.png'

この方法なら:

  • コマンド入力が4文字(cpss)で完了
  • タブ補完でファイル名入力も簡単
  • タイピングエラーのリスクがゼロ

💫 更に Gemini CLI のカスタムコマンドを定義して便利に

Gemini CLI の機能で、何度も実行するプロンプトを事前に定義しておき、それを /custom_command というような形式のコマンドで呼び出すことができる機能があります。
Claude Code だと、(カスタム)スラッシュコマンド などと呼ばれているやつですね。

カスタムコマンドの実装方法など、詳細は以下をご確認ください。

https://geminicli.com/docs/cli/custom-commands/

# gemini を使用したいプロジェクトのルートの場所で以下を実行する

# カスタムコマンド用のフォルダを作成する
mkdir -p .gemini/commands

# カスタムコマンドのファイルを作成する
touch .gemini/commands/cpss.toml

# カスタムコマンドの実装内容を書き込む
cat > ~/.gemini/commands/cpss.toml << 'EOF'
description = "Copy the latest screenshot to current directory"
prompt = """
Please execute the following shell command to copy the latest screenshot:

!cp "$(find /mnt/c/Users/$USERNAME/Pictures/Screenshots/ -type f -printf "%T@ %p\n" | sort -n | tail -1 | cut -d' ' -f2-)" .

After copying, confirm the operation and show the filename of the copied screenshot.
"""
EOF

cpss.toml コマンドの説明:

  • description: このカスタムコマンドの概要。カスタムコマンドのヘルプの表示でも確認できる
  • prompt: このコマンドで Gemini CLI に指示するプロンプト。

上記ファイルを作成の上、gemini を起動すると以下のように、インクリメンタルなサジェスチョンにも表示されるようになります。

さらに実行すると、このように、コマンドを実行し、その実行の内容も正しく説明したうえで、実行結果の正常終了まで行ってくれます。

実際にそのスクリーンショットを Gemini CLI に確認させたい場合は、@ でファイル名の先頭数文字を入れると、インクリメンタルにファイル名を絞り込むので、ファイル名の打ち間違いや対象を間違えるという心配も最小限で済みます。

当然指定された画像の内容は Gemini CLI も理解ができています!

🥊 alias VS カスタムコマンド

Gemini CLI の カスタムコマンドを実行できることがわかりましたが、実際に使ってみると、一瞬で実行が終わる alias に対して、カスタムコマンドの実行は数十秒時間がかかってしまうので、あまり効率的ではありません。

カスタムコマンドは、もっと複雑で作り込まれたプロンプトを再利用するときに使うべきなんだと思います。

📝 まとめ

Windows + WSL環境でCLI AIエージェントを使う際の画像貼り付け問題を、シェルスクリプトの組み合わせで解決しました。

この方法により:

  • スクショからAIエージェントへの受け渡しが数秒で完了(Windows のファイルシステムから Linux のディレクトリへ cp するコマンドを alias で実行)
  • Gemini CLI に実行させることも可能(カスタムコマンドの定義)
  • タイピングエラーがゼロに
  • 作業効率が大幅に向上
  • Linuxエコシステムだけで完結

macOS環境と同等、あるいはそれ以上に快適な開発環境を構築できます。

AIエージェントツールをCLIで使う機会が増えている今、このワークフローは確実に時間を節約してくれるはずです!
とはいえ、いろんなツール・エコシステムの進化が早すぎるので、もはや数カ月後にはこんなことしなくても良くなるんでしょうね・・・・AIブラウザとかが発達すると。

🔗 参考


🌺 沖縄から「21世紀を代表する会社」を創る仲間を募集

シーエー・アドバンスは、「沖縄のインターネット産業の未来を創る」をビジョンに掲げ、サイバーエージェントグループの一員として、ABEMAやAmebaを支える社内システムを開発しています。 勤務地は沖縄・那覇市 おもろまち。 Next.jsReactRuby on RailsAWS などモダンな技術で、東京・ベトナムのエンジニアと協業。若手が裁量権を持って挑戦できる環境です。

失敗を恐れず挑戦できる文化。一緒にアドバンス(進歩)しませんか?

https://hrmos.co/pages/ca-adv-group/jobs?category=1580771415836098560

Discussion