【Windows 10対応】コマンドラインからクリップボードへデータを受け渡しする

コマンドプロンプト上での実行結果をクリップボートにコピーしたり、逆にクリップボードからデータを受け取ってコマンドで処理できると便利だ。このために利用できるコマンドを紹介する。これらのコマンドをバッチファイルなどにしておくと、GUIのアプリでも、クリップボードにデータをコピーするだけで簡単にテキスト処理などが行える。

コマンドラインでもクリップボードとデータをやりとりしたい

コマンドプロンプトを開いてCUIで作業している場合でも、クリップボードを利用したいことがある。例えば、コマンドの実行結果をアプリに渡したい場合は、クリップボードにコピーしておけば、アプリ側では単に[Ctrl]+[V]キーを押すだけで、結果をすぐに貼り付けることができる。いちいちファイルに保存してから、それをアプリ側で開いて挿入するといった操作は不要だ。

これとは逆に、アプリ側でテキストデータなどを選択してクリップボードにコピーしておき、それをコマンドプロンプト側で読み込んで、ソートや選択、抽出、テキスト処理、データ処理などを行いたいこともある。

CUIでは、テキストデータなどをファイルからリダイレクト(「mycmd < file.txt」など)で読み込んで処理したり、パイプで次のコマンドに渡したりすることが多いが、これもクリップボードが利用できれば、いちいちファイルを経由する必要がなくなる。例えば、Excelの列をクリップボードにコピーしてソートしたいといった場合、いちいち列をテキストファイルに保存しなくても、クリップボードにコピーすれば、直接ソートが行える。

本TIPSでは、コマンドラインからクリップボードにコピーしたり、逆にクリップボードからデータを取得したりする方法をまとめておく。

コマンドの実行結果をクリップボードにコピーする

コマンドプロンプト上で、コマンドの実行結果(出力)をクリップボードにコピーするには、「clip」というコマンドが利用できる。このコマンドでは、標準入力から渡されたデータをクリップボードにコピーする。例えば「clip < file.txt」や「type file.txt | clip」とすれば、指定したファイルの内容がクリップボードにコピーされる(「<」はファイルからデータを読み出すリダイレクト処理、「|」は次のコマンドにデータを渡すパイプ処理を表す)。

ファイル名の一覧が欲しい場合は、「dir | clip」とすれば、dirコマンドの結果をクリップボードにコピーできる。

ただし、dirコマンドの結果には、ファイル名の一覧以外の要素(ボリューム名やファイルサイズ、空きディスクサイズなど)も含まれていて、そのままではファイル名のリストとしては使いづらいので、ファイル名だけを表示させるために、「/b」オプションを付けて、「dir /b | clip」のようにするとよいだろう。dirコマンドのオプションについてはTIPS「dirコマンドでファイル名の一覧を取得する」を参照していただきたい。

PowerShellの場合は「Set-Clipboard」というコマンドレットを利用すると、結果をクリップボードにコピーできる。が、これはパイプで渡されたデータの型など応じていろいろな処理が行われるので、少し面倒なことになる。単にテキストとしてコピーするだけでよければ、clip.exeを呼び出すのが簡単だ。

クリップボードからコマンドにデータを貼り付ける

コピーとは逆に、クリップボードにあるデータ(テキストデータ)を取得して、それをコマンドで処理したいこともあるだろう。つまり、clipコマンドの逆を行いたいのだが、残念ながら、コマンドプロンプトで利用できる、OS標準のコマンドは用意されていない。だがPowerShellならば、「Get-Clipboard」というコマンドレットが利用できる。

PowerShellしか使えないのなら少し面倒だな、と思うかもしれないが、そんなことはない。コマンドプロンプトからPowerShellのコマンドレットを使いたければ、前に「powershell ~」と付けるだけで簡単に呼び出せるからだ(正しくは「powershell -command ~」のようにするのだが、引数が何もない、単一のコマンドレットの実行ならこれでも構わないようだ)。つまり、コマンドプロンプトでクリップボードからデータを取得したいなら、単にコマンドプロンプトで以下のように入力すればよい。

クリップボードの内容を処理するバッチコマンド

クリップボードとのやりとりができれば、それを使った「フィルター処理用プログラム」も簡単に作れるだろう。フィルターとは、標準入力からデータを読み込んで何らかの処理を行い、それを結果として出力するプログラムのことである。パイプで接続して連続実行させることにより、少しずつ加工を行いながら、最終的な結果を得るのはCUIではよくある処理だが、GUIの場合は連続するメニュー操作などが必要で、少々面倒である。

だが、例えば「クリップボードからデータを読み込んで、ソートして、(Linuxのuniqコマンドのように)重複を削除して、結果をクリップボードに返す」というコマンドがあれば、アプリにソート機能がなくても、そのような機能を簡単に実現できる。アプリ上でテキストを選択して[Ctrl]+[C]キーでコピーし、コマンドを実行して、その結果を[Ctrl]+[V]で貼り付けるだけだ。

コマンドを例えばバッチファイルやPowerShellのスクリプトにしてデスクトップやタスクバーなどにショートカットを置いておけば、マウスでワンクリックするだけですぐに実行できる。あるいは、1プッシュでさまざまなコマンドを実行できる特殊なキーボードのようなデバイスを使ってもよい。

具体的には、次のようなコマンドを作っておく。

途中にある「wsl uniq」は、いわゆるユニーク処理を行うためのコマンドである。Windows OSの標準コマンドとしては用意されていないので、代わりにWSLのuniqを呼び出している。WSLが利用できない環境(64bit版のWindows 10以外)の場合は、TIPS「Windowsコマンドプロンプトの入門から使いこなしまでの記事」の最後で紹介している、MSYSやGif for Windowsなどに含まれる互換ツールを使ってもよい。WSLなどのLinux系ツールなら、sedやcut、paste、joinといった、テキスト処理に向いているツールが多数利用できる。

なお「powershell get-clipboard」の結果は、日本語Window OSの標準であるShift_JISコードになっている。そのため、クリップボード内のテキストに日本語文字が含まれていると、WSLのコマンド(これらはUTF-8を想定している)の実行結果が文字化けを起こすことがある。

これを回避するには、途中で文字コードを変換したり、コマンドにロケール指定を付けて実行したりするなどの対策が必要になる。このあたりの事情については少し込み入っているので、今後別TIPSで紹介する。それまでは、必要なら自分で文字コードの変換処理などを組み込んでいただきたい。パイプで文字コード変換コマンドを呼び出しながらWSL呼び出しなどを組み合わせると意図しない文字化けなどが起こりやすいので、最初に「powershell get-clipboard >%tmp%\tmpfile.txt」のようにしていったんファイルに保存し、それから順に処理して、最後に「clip <%tmp%\tmpfile.txt」でクリップボードへ戻すとよいだろう。

PowerShellが使えるなら、次のようにPowerShellのスクリプトにしてもよい(こちらは日本語も通る)。「powershell .\sortuniq.ps1」のようにして実行するか、ショートカットを作成しておいて起動するとよい。