クリップボードアクセス完結編 - 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.です

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

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


7 :Shana Marley:2018/09/21 5:19:53
I discovered your クリップボードアクセス完結編 - PowerShell Scripting Weblog page and noticed you could have a lot more traffic. I have found that the key to running a website is making sure the visitors you are getting are interested in your subject matter. We can send you targeted traffic and we let you try it for free. Get over 1,000 targeted visitors per day to your website. Start your free trial: https://flust.de/tpuwx Unsubscribe here: http://stpicks.com/2ruse
Shana Marley http://duckshop.co/1f1p

8 :スーパーコピー カバン ブランド:2018/09/24 3:21:04
スーパーコピー - スーパーコピー
※お写真ではわかりにくい点が御座いまし
たらお気軽にお問い合わせくださいませ。
■実物写真、付属品を完備しております。
■迅速、確実にお客様の手元にお届け致します。
■低価格を提供すると共に、品質を絶対保証しております。
■商品の交換と返品ができます。


コメントをどうぞ

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


古い記事へ | 新しい記事へ


Copyright © 2005-2018 Daisuke Mutaguchi All rights reserved
mailto: mutaguchi at roy.hi-ho.ne.jp
プライバシーポリシー

Books

Twitter