【Windows 10対応】コマンドラインからクリップボードへデータを受け渡しする:Tech TIPS
コマンドプロンプト上での実行結果をクリップボートにコピーしたり、逆にクリップボードからデータを受け取ってコマンドで処理したりできると便利だ。このために利用できるコマンドを紹介する。これらのコマンドをバッチファイルなどにしておくと、GUIのアプリでも、クリップボードにデータをコピーするだけで簡単にテキスト処理などが行える。
対象OS:Windows 7/Windows 8.1/Windows 10/Windows Server 2008 R2/Windows Server 2012/Windows Server 2012 R2/Windows Server 2016
コマンドラインでもクリップボードとデータをやりとりしたい
コマンドプロンプトを開いてCUIで作業している場合でも、クリップボードを利用したいことがある。例えば、コマンドの実行結果をアプリに渡したい場合は、クリップボードにコピーしておけば、アプリ側では単に[Ctrl]+[V]キーを押すだけで、結果をすぐに貼り付けることができる。いちいちファイルに保存してから、それをアプリ側で開いて挿入するといった操作は不要だ。
コマンドラインとクリップボードの連携
いちいちデータ受け渡し用の中間ファイルなどを経由することなく、コマンドラインの結果を直接クリップボードにコピーしたり、逆にクリップボードから取得したデータをコマンドラインで処理したりできると便利だ。
これとは逆に、アプリ側でテキストデータなどを選択してクリップボードにコピーしておき、それをコマンドプロンプト側で読み込んで、ソートや選択、抽出、テキスト処理、データ処理などを行いたいこともある。
CUIでは、テキストデータなどをファイルからリダイレクト(「mycmd < file.txt」など)で読み込んで処理したり、パイプで次のコマンドに渡したりすることが多いが、これもクリップボードを利用できれば、いちいちファイルを経由する必要がなくなる。例えば、Excelの列やエディタで編集中のデータ列をソートしたいといった場合、いちいち列をテキストファイルに保存しなくても、クリップボードにコピーしてCUIのコマンドを実行すれば、直接ソートが行える。
本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 〜」のようにするのだが、引数が何もない、単一のコマンドレットの実行ならこれでも構わないようだ)。つまり、コマンドプロンプトでクリップボードからデータを取得したいなら、単にコマンドプロンプトで以下のように入力すればよい。
powershell get-clipboard
クリップボードからデータを取得して処理する例
クリップボードに入っているデータをpowershell get-clipboardで取り出して処理し、その結果をまたクリップボードに返せば、GUIのプログラムとも簡単に連携できる。
まとめておくと、次のようになる。
操作 | コマンド |
---|---|
クリップボードへコピーする | clip |
クリップボードからテキストデータを読み出す | powershell get-clipboard |
コマンドプロンプトからクリップボードへアクセスする方法 |
クリップボードの内容を処理するバッチコマンド
クリップボードとのやりとりができれば、それを使った「フィルター処理用プログラム」も簡単に作れるだろう。フィルターとは、標準入力からデータを読み込んで何らかの処理を行い、それを結果として出力するプログラムのことである。パイプで接続して連続実行させることにより、少しずつ加工を行いながら、最終的な結果を得るのはCUIではよくある処理だが、GUIの場合は連続するメニュー操作などが必要で、少々面倒である。
だが、例えば「クリップボードからデータを読み込んで、ソートして、(Linuxのuniqコマンドのように)重複を削除して、結果をクリップボードに返す」というコマンドがあれば、アプリにソート機能がなくても、そのような機能を簡単に実現できる。アプリ上でテキストを選択して[Ctrl]+[C]キーでコピーし、コマンドを実行して、その結果を[Ctrl]+[V]で貼り付けるだけだ。結果が正しくなければ、(たいていのGUIアプリは)[Ctrl]+[Z]キーですぐに元に戻せるだろう。
コマンドを例えばバッチファイルやPowerShellのスクリプトにしてデスクトップやタスクバーなどにショートカットとして置いておけば、マウスでワンクリックするだけですぐに実行できる。あるいは、1プッシュでさまざまなコマンドを実行できる特殊なキーボードのようなデバイスを使ってもよいだろう(TIPS「Windows 10のMicrosoft Storeアプリをコマンドラインやバッチから起動する」参照)。
具体的には、次のようなコマンドを作っておく。
※ソートして重複を削除するバッチの例(日本語は要注意)。次のようなコマンドを、例えばsortuniq.cmdに保存しておく
powershell get-clipboard | sort | wsl uniq | clip
途中にある「wsl uniq」は、いわゆるユニーク処理を行うためのコマンドである(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」のようにして実行するか、ショートカットを作成しておいて起動するとよい(TIPS「PowerShellスクリプトへのショートカットを作成する」参照)。
※PowerShellスクリプトの例。これを「sortuniq.ps1」などとして保存する
$OutputEncoding = [Console]::OutputEncoding
get-clipboard | sort | get-unique | clip
■更新履歴
【2019/03/14】最新状況に合わせて、内容を更新しました。
【2005/09/03】初版公開(対象OSはWindows 2000/Windows Server 2003)。
Copyright© Digital Advantage Corp. All Rights Reserved.