クリップボードアクセス完結編 - PowerShell Scripting Weblog

2011/09/08

PowerShellでクリップボードを読み書きする方法については5年ほど前にクリップボードアクセス(未完)II という記事を書きました。タイトル通り未完でして、このたび完結編を書こうと思いました。

System.Windows.Forms.Clipboardクラスを使う場合は先の記事にあるようにPowerShellをSTAで動作させる必要があります。ver.1の当時はその方法がありませんでしたが、ver.2ではpowershell.exeに-staパラメータが追加され、STAでの実行が可能となっています。

-staパラメータを使用しない場合は相変わらずこの方法は使えません。powershell.exe –staのプロセスを逐次起こして、クリップボードアクセス部分だけSTAの子プロセスでやらせることも不可能ではないですが、冗長ですしパフォーマンスの点で難があります。

ver.2ではAdd-Typeコマンドレットが追加され、任意のC#コードを動的に読み込むことができるようになりました。これを利用してクリップボードアクセスクラスを書くという手もあると思います。その中ではSTAのスレッドを起こしてクリップボードアクセスをすることになります。実際PowerShell Community Extensionsに含まれるOut-Clipboard/Get-Clipboardコマンドレットはそのような実装がされているようです。ですが動的にコードを読み込みコンパイルはやはりパフォーマンス上不利ですし、PSCXをインストールできない場合などもあるでしょう。

ところでSystem.Windows.Formsに含まれるTextBoxクラスはその名の通りテキストボックスコントロールなのですが、このコントロールにはCopy()メソッドとPaste()メソッドがあり、これらを使うとクリップボードに書き込み、クリップボードから読み込みが可能です。TextBoxクラスの良いところは、STAである必要がないところです。この方法を最初に提唱したのはこちらの方かな?

この方法を用いた関数もすでに公開されているのですが、PowerShellの作法に則った使い方ができるように少し改良を加えました。具体的には

Set-ClipBoard:  配列の指定、パイプラインからの入力を可能にした。

Get-ClipBoard: クリップボードの中身が複数行のテキストの場合、文字列配列を返すようにした。(Get-Contentと同様)

という変更を加えています。

function Set-ClipBoard
{
    param([parameter(Mandatory=$true,
            ValueFromPipeline=$true)][object[]]$InputObject)
    begin
    {
        Add-Type -AssemblyName System.Windows.Forms
        $tb = New-Object System.Windows.Forms.TextBox
        $tb.Multiline = $true
        $out=@()
    }
    process
    {
        $out+=$InputObject
    }
    end
    {
        $tb.Text = $out -join "`r`n"
        $tb.SelectAll()
        $tb.Copy()
    }
}

function Get-ClipBoard
{
    Add-Type -AssemblyName System.Windows.Forms
    $tb = New-Object System.Windows.Forms.TextBox
    $tb.Multiline = $true
    $tb.Paste()
    $tb.Text -replace "`r`n","`n" -replace "`r","`n"  -split "`n"
}

使い方例

# ファイルのフルパスをクリップボードに格納
Get-ChildItem|select -expand fullname|Set-ClipBoard

# CSV文字列がクリップボードに入っている場合以下のコマンドを実行すると、
# クリップボードの中身が対応するHTML tableタグに置換される
Get-ClipBoard|ConvertFrom-Csv|ConvertTo-Html -Fragment|Set-ClipBoard

やっぱりパイプで繋ぐのがPowerShellの醍醐味ですよね!

元記事:http://blogs.wankuma.com/mutaguchi/archive/2011/09/08/202547.aspx

トラックバック

トラックバックはまだありません

トラックバックPing:


コメント

1 :No Name:2017/04/02 0:00:13
PowerShellは一昨日触り始めたレベルの初心者です。(.NET Frameworkなんてもってのほかです...)
htmlのソースからリンクを抽出するスクリプトをbatあたりでサクッと作る予定だったのですが、正規表現等妙に拘りたくなり、
ついでに「コピー > ps1実行 > ペースト」で実行できる形にしたく、Google検索からこちらを見つけた次第です。
公開いただいた情報は大変参考になり、期待通りのものを作成することができました。
お礼を申し上げたく、6年前の記事ながらコメントさせていただきました。

なお、TextBoxは最大文字数32,767とのことでしたので、誠に勝手ながら MaxLength = 0 にて使用させていただいております。


2 :牟田口大介:2017/04/04 18:26:56
ご覧になっていただきありがとうございます。
TextBoxでMaxLengthを0にすると、文字数制限がなくなるんですね。
情報ありがとうございます。

ちなみに、PowerShell5.0で、ついにGet-Clipboard/Set-Clipboardコマンドが
標準搭載されました。
こちらは文字列以外にも、ファイルリストや画像データなども扱えるので、
環境が許すならば、標準コマンドの方もお使いいただければと思います。

3 :No Name:2017/05/18 9:28:42
こんにちは、私も1.の方同様にpowershell始めたばかりです。

本家(powershell 5.1)のSet-Clipboardですが、
ls | Set-Clipboard
Get-Clipboard
だと何も表示されず、Windows側でテキストエディタにpasteしても入ってないようです(もしくは改行入ってるのかな)。
echo AAA | Set-Clipboardだと AAA が入るので、何か指定がいるんだろうけどhelp見てもよく解らない(^^;

それはさておき、こっちが本題。
$PSVersionTable | Set-Clipboard
Get-Clipboard
とすると
System.Collections.Hashtable
と表示されます。
Hashtable内容を$PSVersionTableの画面出力のような感じで受け取りたい場合は、どう改造すればよろしいでしょうか?
お時間ありましたらよろしくお願いしますm(__)m


4 :牟田口大介:2017/05/20 14:04:11
本家Set-Clipboardでは、ls(Get-ChildItem)の結果(DirectoryInfoオブジェクトやFileInfoオブジェクト)を
パイプラインで渡すと、ファイルパスを表す文字列ではなく、ファイルの実体がクリップボードにコピーされます。
これは、エクスプローラーでファイルをコピーするのと同じ効果です。

クリップボードに保存されたファイルリストをGet-Clipboardで取得するには、
Get-Clipboard -Format FileDropList
を実行します。この場合、lsを実行したときと同じく、FileInfoオブジェクトの配列として取得できます。

Get-Clipboard -Format FileDropList | foreach {$_.FullName}
などとすれば、フルパスを文字列として取得することも可能です。

クリップボードにファイルリストではなく、ファイルパスを文字列として格納したい場合には、
ls | foreach {$_.FullName} | Set-Clipboard
等とすれば良いでしょう。

5 :牟田口大介:2017/05/20 14:12:40
本題の方についてですが、
$PSVersionTable | Out-String | Set-Clipboard
のように、画面出力結果をOut-Stringコマンドに通して文字列型に変換してから、
Set-Clipboardに渡すと良いと思います。

6 :No Name:2017/05/21 10:25:37
3.です

なるほど実態ですか。ありがとうございました。

本題の方も文字型に変換ですね。色々試してみます
ありがとうございました。
なかなか奥が深いですね。



コメントをどうぞ

名前 (省略可) :
E-mail or URL (省略可) :


前の記事へ | 次の記事へ

Copyright © 2005-2016 Daisuke Mutaguchi All rights reserved

mailto: mutaguchi at roy.hi-ho.ne.jp

Awards

Books

Twitter