📋

クリップボード画像をリモートVMにワンクリック転送するPowerShellスクリプト

に公開

背景と動機

自分の開発環境では、Claude Code をリモートのLinux VM上で動かしています。Claude Codeには画像ファイルのパスを渡すことで画像を参照させる機能があります。

ローカルのWindows PCで作業していると、スクリーンショットやブラウザのキャプチャをClaude Codeに見せたい場面があります。これらはクリップボードに画像として保存されますが、リモートVMに直接貼り付けることはできません。画像ファイルをVMに転送し、そのパスをClaude Codeに伝える必要があります。

この「クリップボードの画像をVMに送ってパスを取得する」という操作を手軽にするため、PowerShellスクリプトを作成しました。最終的に、デスクトップのショートカットをダブルクリックするだけで転送からパスの取得まで完結する仕組みになっています。

前提・環境

  • ローカルPC: Windows(PowerShell 5.1以上)
  • リモートVM: Linux(SSH接続可能)
  • SSH設定: .ssh/config にVMへの接続情報を設定済み。パスワードレスでログイン可能
  • SCP: OpenSSH クライアントがインストール済み(Windows 10以降は標準搭載)

ゴール

  • Windowsのクリップボードにある画像をダブルクリック1回でリモートVMに転送できる
  • 転送先のファイルパスが自動的にクリップボードに入れて、そのままClaude Codeのプロンプトに貼り付けられる

スクリプト

スクリプトの処理フロー

スクリプトは以下の流れで動作します。

  1. Get-Clipboard -Format Image でクリップボードから画像を取得する
  2. タイムスタンプ付きのファイル名で一時ファイルとしてPNG保存する
  3. scp でリモートVMに転送する
  4. 転送先のファイルパスをクリップボードにセットする
  5. 一時ファイルを削除する

スクリプト本体

C:\Users\<ユーザー名>\Scripts\Upload-ClipboardImage.ps1 として保存します。<ユーザー名> は自分のWindowsユーザー名に置き換えてください。配置先は任意ですが、デスクトップではなく専用のフォルダにまとめておくと整理しやすいです。

param(
    [Parameter(Mandatory=$false)]
    [string]$SSH_HOST = "your_ssh_config_host",

    [Parameter(Mandatory=$false)]
    [string]$VM_DIR = "/home/your_username/images"
)

# 非終了エラーもcatchブロックで捕捉するための設定
$ErrorActionPreference = "Stop"

try {
    Write-Host "Getting image from clipboard..." -ForegroundColor Cyan
    Write-Host "Target: $SSH_HOST -> $VM_DIR" -ForegroundColor Gray

    $image = Get-Clipboard -Format Image

    if ($null -eq $image) {
        throw "No image found in clipboard"
    }

    $timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
    $tempFile = "$env:TEMP\clipboard_image_$timestamp.png"

    Write-Host "Saving temp file: $tempFile" -ForegroundColor Cyan
    $image.Save($tempFile, [System.Drawing.Imaging.ImageFormat]::Png)

    $remoteFileName = "clipboard_image_$timestamp.png"
    $remotePath = "$VM_DIR/$remoteFileName"

    Write-Host "Uploading to VM..." -ForegroundColor Cyan

    scp $tempFile "${SSH_HOST}:$remotePath"

    if ($LASTEXITCODE -ne 0) {
        throw "SCP transfer failed"
    }

    Set-Clipboard -Value $remotePath

    Write-Host "`nSuccess!" -ForegroundColor Green
    Write-Host "File path copied to clipboard:" -ForegroundColor Green
    Write-Host $remotePath -ForegroundColor Yellow

    Remove-Item $tempFile -Force

} catch {
    Write-Host "`nError: $_" -ForegroundColor Red
    Read-Host "`nPress Enter to exit"
    exit 1
}

Read-Host "`nPress Enter to exit"

$SSH_HOST と $VM_DIR はパラメータとして定義しています。デフォルト値を自分の環境に合わせて変更するか、後述のショートカットから引数として渡します。

$SSH_HOST には .ssh/config で定義したホスト名を指定します。.ssh/config に認証情報(鍵ファイル、ユーザー名など)をまとめておくことで、スクリプト側には接続先のホスト名だけを書けばよくなります。

転送先ディレクトリの準備

VM側に画像の保存先ディレクトリを作成しておきます。

mkdir -p ~/images

ショートカットの作成と配置

.ps1 ファイルはダブルクリックするとデフォルトではメモ帳で開かれてしまいます。PowerShellスクリプトとして実行するには、ショートカットを作成します。

  1. デスクトップを右クリック → 「新規作成」→「ショートカット」を選択する
  2. 「項目の場所」に以下を入力する
powershell.exe -ExecutionPolicy Bypass -File "C:\Users\<ユーザー名>\Scripts\Upload-ClipboardImage.ps1" -SSH_HOST "myvm" -VM_DIR "/home/user/images"
  1. ショートカット名を「Upload Clipboard Image」などにして完了する

-ExecutionPolicy Bypass を指定することで、実行ポリシーの制限を回避しています。-SSH_HOST と -VM_DIR はスクリプトの param() ブロックで定義したパラメータに対応しており、ショートカットの「項目の場所」から直接値を注入できます。

複数のVMに転送したい場合は、接続先ごとにショートカットを作成し、それぞれ異なる -SSH_HOST と -VM_DIR を指定すれば対応できます。

使い方(動作確認)

  1. 転送したい画像をクリップボードにコピーする(PrintScreen、Snipping Tool、ブラウザで右クリック→コピーなど)
  2. デスクトップのショートカットをダブルクリックする
  3. PowerShellウィンドウが開き、転送が実行される
  4. 「Success!」と表示されたら、クリップボードにVM上のファイルパスが入っている
  5. Claude Codeのプロンプトにそのパスを貼り付けて画像を参照させる
Getting image from clipboard...
Target: myvm -> /home/user/images
Saving temp file: C:\Users\...\Temp\clipboard_image_20260208_143022.png
Uploading to VM...

Success!
File path copied to clipboard:
/home/user/images/clipboard_image_20260208_143022.png

Press Enter to exit

つまずきポイント

実行ポリシーエラー

PowerShellのデフォルト設定では、スクリプトの実行が制限されています。ショートカットに -ExecutionPolicy Bypass を付けていれば回避できますが、ショートカットを使わずに直接実行する場合は、以下のコマンドで実行ポリシーを変更する必要があります。

Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

文字化け(エンコーディング問題)

スクリプトに日本語のコメントを含めている場合、ファイルのエンコーディングが UTF-8(BOMなし)だとパースエラーになることがあります。UTF-8 BOM付きで保存するか、コメントを英語で記述することで回避できます。

今回のスクリプトではコメントや出力メッセージをすべて英語にしているため、この問題は発生しません。

PowerShell 7 では動作しない

Get-Clipboard -Format Image は Windows PowerShell 5.1 で利用できるコマンドレットです。PowerShell 7(Core)では -Format Image がサポートされていないため、このスクリプトは Windows PowerShell 5.1 で実行する必要があります。ショートカットの「項目の場所」で powershell.exe を指定していれば Windows PowerShell 5.1 が使われるので問題ありません。

まとめ

リモートVMで動くClaude Codeに画像を渡すため、クリップボードの画像をSCPで転送するPowerShellスクリプトを作成しました。

  • .ssh/config のホスト名を利用することで、スクリプトの設定を最小限に抑えた
  • param() によるパラメータ化で、1つのスクリプトを複数の接続先に使い回せる
  • ショートカットのダブルクリックだけで転送からパスの取得まで完結する

Claude Codeに限らず、リモートの環境にクリップボードの画像をサッと送りたい場面は意外とあるので、汎用的に使える仕組みになっています。

Discussion