解答編
以下のコマンドをwsl上のbashで実行すれば、Windows上でコピーした画像がWSL上のカレントディレクトリにファイルとして保存される。
$ powershell.exe '(Get-Clipboard -Format Image).Save("image.png")'
解説編
まず、WSLはWindowsとは別にUbuntuが動いているので、クリップボードは共有されない。したがって、Widows上でのクリップボードにアクセスする仕組みが必要。
RubyにWin32などのライブラリもあるが、それはRubyをWindows上で動かしたときに機能するものであって、WSL上のRubyでwin32のgemを使っても、Lunux上でkernel32.soを探しに行こうとする(当然ない)。
幸い、WSLからはWindowsのexeファイルは実行可能で、PowerShellも実行可能。PowerShellにGet-Clipboardというコマンドがあるので、そいつを使う。
シンプルに
$ powershell.exe Get-Clipboard
と実行すれば、テキストファイルの場合には、テキストが出力される。Macで言えば、pbpasteを実行したのと同じ結果になる。
クリップボードに画像が入ってる時には、-Format Image の引数を付与する。
$ powershell.exe Get-Clipboard -Format Image
Tag :
PhysicalDimension : {Width=909, Height=527}
Size : {Width=909, Height=527}
Width : 909
Height : 527
HorizontalResolution : 96
VerticalResolution : 96
Flags : 335888
RawFormat : [ImageFormat: b96b3caa-0728-11d3-9d7b-0000f81ef32e]
PixelFormat : Format32bppRgb
Palette : System.Drawing.Imaging.ColorPalette
FrameDimensionsList : {7462dc86-6180-4c7e-8e3f-ee7333a7a483}
PropertyIdList : {}
PropertyItems : {}
このように、メタ情報のみが出力される。返すのはImageオブジェクトなので、画像形式で保存するには、Saveメソッドをつける必要がある。インスタンス変数にセットすることなく、いきなりメソッドをつけたいときには、カッコでくくることで、メソッドが実行できる。
$ powershell.exe '(Get-Clipboard -Format Image).Save("image.png")'
なぜ必要になったか
MarkDownで文書を書いてる時にはスクショもどんどん入れていきたい。MarkDownはVSCodeで書いてる。VSCodeは基本的にはWSLで動かしている(ほとんどがLinux上で動かしたいものばかりなので)。そこでWSL上で実行するだけで、画像のパスを生成し、そのパスにクリップボードの画像を保存し、さらにクリップボードに画像のパス(文字列)を入れるということを一気にやりたいと思った。
と、ここまで書いて思ったけど、MarkDownで文書を書く時だけ、Windows上でVSCodeを開けば、「CTL+ALT+Vでクリップボードの画像を保存してなおかつMarkDonw形式で挿入してくれるツール」がそのまま使えるなと思った。こういうツール。
https://marketplace.visualstudio.com/items?itemName=mushan.vscode-paste-image