• Banquets of the Clipboard on Windows

クリップボードは、Windowsがアプリケーションに提供するアプリ間データ共有機能の1つ。さまざまな形式のデータをクリップボードにより、複数のアプリケーション間で共有できる。アプリケーションは、基本的には「コピー」と「ペースト」という2つの基本操作をサポートするだけで、クリップボードを利用できる。もっとも、高度な活用には、保存されているクリップボード形式などを調べる機能なども用意されている。

基本的には、Win32APIのクリップボード関数を使う。その他、.NET/.NET Framework用のClipboardクラスが用意されている。また、Windows PowerShell、PowerShellにクリップボード関連コマンドがあり、cmd.exe用にclip.exe(ただしコピー動作のみ)がある。

ところが、.NETのクリップボードクラスは2つあり、Windows PowerShellとPowerShellでは、クリップボードコマンドの仕様(コマンドオプション)が異なっている。今回は、このあたりを整理する。

Get/Set-Clipboard

Windows PowerShell Ver.5.1(以下WPSと表記)と、PowerShell Ver.7.5には、共にGet-Clipboard、Set-Clipboardの2つのコマンドがある。ただし、両者のコマンドラインオプションは異なっている。簡単にいうと、Windows PowerShellのクリップボードコマンドは、テキスト以外のデータ形式も扱える。これに対して、PowerShell(7.x)のクリップボードコマンドは、テキストしか扱うことができない。ただし、Windows PowerShellでもSet-Clipboardコマンドで、クリップボードに登録(コピー)できるのはテキストのみだ。ただ、テキストを扱えるだけでもかなり応用できる。以下のパターンで、クリップボードにあるテキストをすべて大文字にして角カッコで囲むことができる。中央のダブルクオート部分を書き換えるだけだ。なお、“$PSItem”は、Foreach-Objectコマンドのスクリプトブロック(波括弧で囲まれた部分)で、パイプラインで来るオブジェクト(この場合はテキスト)が格納される自動変数だ。


Get-Clipboard | Foreach-Object { "[$($PSItem.toUpper())]" } | Set-Clipboard

また、以下のように引数にスクリプトブロックを受け付ける関数を作っておくと、クリップボードの処理が簡単に行えるようになる。


function Convert-Clipboard($x) { Get-Clipboard | Foreach-Object{ &$x} }

使うには、以下のようにする。


Convert-Clipboard { "[$($PSItem.toUpper())]" }

Convert-Clipboard関数には、Set-Clipboardを入れてないため、このまま実行すると、クリップボードを処理した結果がコンソールに表示される。パイプラインの後段にSet-Clipboardを入れることで、処理結果をクリップボードに書き戻すことができる。

.NETのクリップボードクラスを使う

Windowsクリップボードが本来持っている、さまざまな形式のデータをクリップボードで扱わせたい場合、.NETのクリップボードクラスをPowerShellから利用することができる。ただし、いくつかの問題がある。

1つは、.NETには、2つのクリップボードクラスがある。1つは、System.Windows.Forms.Clipboardクラス。もう1つは、System.Windows.Clipboardである。2つあるのは、ソフトウェア開発で、従来のWindowsのGUIに準拠したWindows.Formsを使うか、WPFを使うかという大きな選択肢があるからだ。このため、通常の開発では、どちらか一方を使うことになる。しかし、PowerShellでは、どちらも利用可能である。さらにいうとClipboardクラスは、.NETにも.NET Frameworkにもある。Windows PowerShell Ver.5.1は.NET Frameworkを使い、PowerShell 7.xは、.NET 7を使っている。

.NET Framework、.NETで、2つのClipboardクラスのメソッドを並べたのが表01だ。System.Windows.Forms.Clipboardは、.NETでもすべて同じメソッドを持つ。また、.NET Frameworkでは、System.Windows.Forms.Clipboard、System.Windows.Clipboardともに同じメソッドを持つ。つまり、異なるメソッドを持つのは、.NET 7(.NET 9でも同じ)のSystem.Windows.Clipboardだけだ。

  • ■表01

Windows PowerShell Ver.5.1もしくは、PowerShell 7.x以降からSystem.Windows.Forms.Clipboardクラスを使うには以下のようにAdd-typeと組み合わせる。


Add-Type -AssemblyName PresentationCore;

同様にSystem.Windows.Clipboardを使うなら、


add-Type -AssemblyName system.windows.forms;

とする。どれを使ってもいいが、System.Windows.Forms.Clipboardならどの環境でも同じなので、混乱が少ないだろう。

今回のタイトルネタは、アイザック・アシモフ(Isaac Asimov)のミステリ小説「Banquets of the Black Widowers」(邦題 黒後家蜘蛛の会4。創元推理文庫)である。個人主催の例会で、ゲストが持ち込む「難題」を参加者が解決しようとするが、いつも、給仕のヘンリーが最後に正解を出す。「安楽椅子探偵モノ」と呼ばれることもあるが、使用人や執事が主人に解決方法をもたらすといったパターンを確立させた作品でもある。ちなみにこの4冊目には、パスワードを推測する話「六千四百京の組み合わせ」(Sixty Million Trillion Combinations)が収録されている。