PowerShellでなんちゃってクリップボード同期

はじめに😶

大人の事情でPCを業務に応じて使い分けないといけないときってあると思います(あるんです!)。そしてPCを複数台併用しているとクリップボードの同期がしたくなってきます(とくにメール書いてるときとか)。

ちまたにはクリップボードの同期をする方法はたくさんあります(たとえばWindows 10ではMSアカウント作成すればクリップボードの同期が可能)。

ただ、大人の事情でツールのインストールや設定変更が制限されてることってあると思います(あるんです!)。だけどもだけども、どうにかしてクリップボードを同期させたいなと思い少し考えたというのがこの記事です。

私の環境はよくよく考えると運の良いことに共有フォルダーをPC間で使える状態だったのでこれを利用することにしました。

前提🔎

  • Winodws(PowerShell使う)
  • 共有フォルダー等が利用できること

なんとか同期する🚀

共有フォルダーが使えるのであれば、早い話が「クリップボードの内容を共有フォルダーに書き込む」and「共有フォルダーを読み込んでクリップボードにセットする」ができればとりあえずはよさそうです。

clipboard-sync

今回はこれらをインストール不要で実行できる必要があるためPowerShellさんのお世話になりたいと思います。

PowerShellでクリップボード操作

走り書きですが書いてみました。

書き込み

$XML = [XML](Get-Content .\config.xml)
New-Item -ItemType Directory -Force -Path $XML.Path
if(!(test-path $XML.Path)){
  throw "Invalid path."
}

$text = Get-Clipboard -Format Text
if ($text) {
  Remove-Item (Join-Path $XML.Path *) -Recurse
  $text > (Join-Path $XML.Path clipboard.txt)
  exit
}

$image = Get-Clipboard -Format Image
if ($image) {
  Remove-Item (Join-Path $XML.Path *) -Recurse
  $image.Save((Join-Path $XML.Path clipboard.png), [System.Drawing.Imaging.ImageFormat]::Png)
  exit
}

$files = Get-Clipboard -Format FileDropList
if ($files) {
  Remove-Item (Join-Path $XML.Path *) -Recurse
  $data = Join-Path $XML.Path clipboard
  New-Item -ItemType Directory -Force -Path $data
  $files | ForEach-Object{Copy-Item $_.FullName $data -Recurse}
  exit
}

Write-Error "The clipboard is empty or an unsupported file format."

Get-Clipboardを利用して指定のパス(上記では$XML.Path)配下にクリップボードの中身を書き込んでいます。ここではクリップボードの中身がテキスト、画像、ファイルパスの場合に対応できるようそれぞれ処理を書いています。その他の形式は対応していません。

読み込み

$XML = [XML](Get-Content .\config.xml)

$cliptext = Join-Path $XML.Path clipboard.txt
if (test-path $cliptext) {
  Get-Content $cliptext | Set-Clipboard
  exit
}

$clipimage = Join-Path $XML.Path clipboard.png
if (test-path $clipimage) {
  Add-Type -Assembly System.Windows.Forms
  Add-Type -Assembly System.Drawing
  $image = [Drawing.Image]::FromFile($clipimage)
  [Windows.Forms.Clipboard]::SetImage($image)
  exit
}

$clipdir = Join-Path $XML.Path clipboard
if (test-path $clipdir) {
  Set-Clipboard -Path (Join-Path $clipdir *)
  exit
}

Write-Error "The file or directory is not found."

書き込み時に作成したファイル(またはフォルダー)が存在していれば、Set-Clipboardを用いてその中身をクリップボードに設定しています。画像に関してはSet-Clipboardではどうも設定できなさそうだったので、Windows.Forms.Clipboardを呼び出しています。

これで一応共有フォルダー介してクリップボード(テキスト、画像、ファイルのみ)の同期ができるようになりました。やったね。

PowerShellの参考情報

PowerShellを実行しようとするともしかしたら管理者権限を求められるかもしれませんが回避する方法はたくさんあります(管理者権限なしでPowerShellスクリプトを実行する方法)。

また、各スクリプトを実行するショートカットを作成したりさらにショートカットキーを割り当てればより便利かも。

おわりに🦕

似たような境遇の方の参考になればとここに供養しておきます。


(あとPowerShell書きにくい…)

参考🙇

たまおさ
釣りとか登山とか好きです。(@tamaki_osamu)