PowerShellを使ってクリップボード操作(データの読み書き)を行う方法
本エントリーの目次
PowerShellを使ってクリップボードの操作を行いたい!
作業効率を上げる、作業ミス・もれを防ぐなどの目的で、従来手作業で行っていたPC作業をPowerShellを使って自動化することがあります。
このとき、あらかじめコピーしておいたデータをPowerShellの処理で使用する。
または、PowerShellで加工したデータをコピーしてクリップボードに格納するなど、PowerShellを使ってクリップボードの操作(コピーやペースト機能のように、クリップボードへのデータの読み書き)を行いたいケースもあるでしょう。
そこで今回は、PowerShellを使ってクリップボードの操作を行う方法をご紹介します!
はじめに
本エントリーでご紹介している内容は、Windows 10 1909(PowerShellのバージョン:5.1.18362.752) Professionalの環境にて、正常に動作することを確認しています。
ですがご紹介している方法で使用している一部のコマンドレットについて、以前のバージョンのPowerShellでは動作しない場合がありますこと、あらかじめご了承ください。
PowerShellを使ってクリップボードの操作を行う方法
PowerShellを使ってクリップボードの操作を行う方法は、いくつか考えられます。
今回はその中から、最も使いやすいであろう『Set-Clipboard』コマンドレットと『Get-Clipboard』コマンドレットを使う方法などをご紹介しましょう!
尚、これらのコマンドレットでは、扱うデータによって使用方法が若干異なリます。
そのため、テキストデータ、ファイルやフォルダーに関する(ファイルドロップリスト)データ、イメージ(画像)データについて、それぞれ個別に操作方法を紹介しています。
テキストデータについて、クリップボード操作を行う方法
まずは『あいうえお』、『test文字列です。』といったような文字列(テキスト)データについて、クリップボード操作を行う方法から紹介しましょう。
文字列データをクリップボードに格納する際は、『Set-Clipboard -Value “<格納する文字列>”』というような構文でコマンドを実行してください。
たとえば『test文字列です。』という文字列データをクリップボードに格納したい場合には、以下のようなコマンドを実行します。
1 | Set-Clipboard -Value "test文字列です。" |
またこのケースでは、『-Value』を省略して以下のように表記することも可能です。
1 | Set-Clipboard "test文字列です。" |
『Set-Clipboard』というコマンドレットの名称から想像できた!
という方もいらっしゃるかもしれませんが、クリップボードに格納されているデータを取得するときは、『Get-Clipboard』というコマンドレットを使用します。
『Get-Clipboard』コマンドレットを実行する際は、『-Format』パラメーターにデータの種類を指定する必要があり、文字列データを取得する際は以下のように『Text』を指定してください。
1 2 3 | PS C:\> Get-Clipboard -Format Text test文字列です。 PS C:\> |
クリップボード内の文字列データに対して、データを追加する方法
クリップボードに格納した文字列データを上書きせず、格納済みのデータに新しい文字列データを追加して格納することも可能です。
たとえば、すでに『test文字列です。』という文字列がクリップボードに格納されていたとしましょう。
そしてこの文字列に、『追加文字列です。』という文字列を追加したいときには、『Set-Clipboard』コマンドレットを使用する際、併せて『-Append』パラメーターを指定してください。
1 2 | Set-Clipboard -Value "test文字列です。" Set-Clipboard -Value "追加文字列です。" -Append |
上記コマンドを実行した後に、『Get-Clipboard』コマンドレットを使って格納されているデータを確認すると、以下のような結果となります。
1 2 3 4 | PS C:\> Get-Clipboard -Format Text test文字列です。 追加文字列です。 PS C:\> |
『-Append』パラメーターを指定してデータの追記を行った場合、既存のデータに対して改行文字 + 追加文字列が追加されるようです。
改行文字が不要な場合には、以下のような方法で追加を行うと良いでしょう。
1 2 | Set-Clipboard -Value "test文字列です。" Set-Clipboard -Value ((Get-Clipboard) + "追加文字列です。") |
この方法を使うことで、クリップボードには改行文字が含まれていない以下のようなデータが格納されます。
1 2 3 | PS C:\> Get-Clipboard -Format Text test文字列です。追加文字列です。 PS C:\> |
パイプ処理を使ってクリップボードに文字列データを格納する方法
PowerShellでは『|』記号を使うことで、ある処理を別の処理に渡すパイプ機能を使用できます。
このパイプ処理を使って、クリップボードに文字列データを格納することも可能です。
この場合には、『”<格納する文字列>” | Set-Clipboard』という構文のコマンドを実行してください。
『test文字列です。』という文字列データをクリップボードに格納するケースでは、以下のようなコマンドを実行します。
1 | "test文字列です。" | Set-Clipboard |
またクリップボードに改行文字が含まれるような文字列を格納したい場合には、たとえば以下のような方法で格納すると良いでしょう。
1 2 3 4 5 6 | PS C:\> "1行目です。`r`n2行目です。`r`n`r`n4行目です。" | Set-Clipboard PS C:\> (Get-Clipboard -Format Text)[0] 1行目です。 PS C:\> (Get-Clipboard -Format Text)[3] 4行目です。 PS C:\> |
※配列の要素[0]に1行目のデータが格納されています。
ファイルやフォルダーに関する(ファイルドロップリスト)データについて、クリップボード操作を行う方法
PowerShellを使うことで、ファイルやフォルダーに関する(ファイルドロップリスト)データについて、クリップボード操作を行うことも可能です。
ここでは仮に、以下2つのテキストファイルが含まれている『C:\sample』というパスのフォルダーがあったとしましょう。
- test1.txt
- test2.txt
そしてエクスプローラーを使って、『C:\sample』フォルダーをコピーしたとします。
このエクスプローラーを使った手動操作と同等の操作をPowerShellで行う場合、以下のようなコマンドを実行します。
1 | Set-Clipboard -Path "C:\sample" |
上記コマンドの実行によりクリップボードに格納したデータを取得するときは、『-Format』パラメーターに『FileDropList』を指定した『Get-Clipboard -Format FileDropList』というコマンドを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 | PS C:\> Get-Clipboard -Format FileDropList ディレクトリ: C:\ Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2020/04/20 10:15 sample PS C:\> |
またクリップボードに格納されているフォルダー配下にあるファイルを列挙して取得する場合には、以下のような『Get-ChildItem』コマンドレットを併用してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 | PS C:\> Get-ChildItem (Get-Clipboard -Format FileDropList) ディレクトリ: C:\sample Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2020/04/20 10:15 0 test1.txt -a---- 2020/04/20 10:15 0 test2.txt PS C:\> |
列挙された結果の1番目のデータについて、ファイルのパスを取得したいときは、以下のようなコマンドを実行すると良いでしょう。
1 | (Get-ChildItem (Get-Clipboard -Format FileDropList))[0].FullName |
複数のフォルダーをコピーしている場合には、『Get-Clipboard -Format FileDropList』コマンドの結果は配列形式で取得されます。
そのためエクスプローラーを使って、『C:\sample』フォルダーと『C:\Windows』フォルダーをコピーしていたケースなどでは、以下のように結果を取得すると良いでしょう。
1 2 3 4 | PS C:\> (Get-Clipboard -Format FileDropList) | ForEach-Object{Write-Host $_.FullName} C:\Windows C:\sample PS C:\> |
イメージ(画像)データについて、クリップボード操作を行う方法
PowerShellを使って、イメージ(画像)データに関するクリップボード操作も可能です。
今回は、以下のような画像(幅151px、高さ151px)が『C:\sample\sample-image.png』というパスに保存されている前提で説明しています。
『C:\sample\sample-image.png』というパスに保存されている画像データをクリップボードに読み込んで格納する場合には、以下のようなコマンドを実行してください。
1 2 3 4 5 6 | Add-Type -AssemblyName System.Drawing Add-Type -AssemblyName System.Windows.Forms $image = New-Object System.Drawing.Bitmap("C:\sample\sample-image.png") [Windows.Forms.Clipboard]::SetImage($image) $image.Dispose() |
$image.Dispose()を実行しないとリソースが開放されず、PowerShellを終了するまでは、当該ファイルの削除などができなくなります。
そのため、$imageが不要となった時点で$image.Dispose()を実行し、ただちにリソースを開放しておくと良いでしょう。
上記コマンドを実行した後に、Windowsのペイントソフトウェア(mspaint)を起動。
そして『Ctrl』+『V』ショートカットキーを使用(『Ctrl』キーを押しながら、『V』キーを押下)すると、ペイントソフトウェアにコピーした画像データが貼り付けられることで、データが正常にクリップボードに格納されていたことを確認できます。
次に、クリップボードに格納されている画像データの取得ですが、この方法を説明するために、まずは以下手順で画像データをコピーしてください。
- Windowsのペイントソフトウェアで、『C:\sample\sample-image.png』というパスに保存されている画像ファイルを開く。
- 『Ctrl』+『A』(『Ctrl』キーを押しながら、『A』キーを押下)ショートカットキーを実行し、画像データの全選択を実行する。
- 『Ctrl』+『C』(『Ctrl』キーを押しながら、『C』キーを押下)ショートカットキーを実行し、画像データ(の全領域)をコピーする。
- 画像ファイルを閉じる。
以上の手順によりクリップボードに格納されている画像データは、『Get-Clipboard -Format Image』コマンドを使うことで、以下のように取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | PS C:\> Get-Clipboard -Format Image Tag : PhysicalDimension : {Width=151, Height=151} Size : {Width=151, Height=151} 中略 PropertyItems : {} PS C:\> |
またクリップボードに保存されている画像データを、ファイルに保存することも可能です。
たとえば『C:\save\sample-image.jpg』というパスにJPG形式で、クリップボードに保存されている画像データの内容を保存する場合には、以下のようなコマンドを実行します。
1 | (Get-Clipboard -Format Image).Save("C:\save\sample-image.jpg", [System.Drawing.Imaging.ImageFormat]::Jpeg) |
尚、上記コマンドの実行時に『C:\save』フォルダーが存在しない場合には実行時エラーが発生します。
そのためフォルダーがない場合には、事前に作成しておく必要があります。
コピーしたExcelの表のデータを、PowerShellを使って取得する方法
Excelで作成した表のデータを、PowerShellで使用したい!
といったケースも想定されます。
この場合には、『ConvertFrom-Csv』コマンドレットを併用してデータを取得する方法がおすすめです。
たとえばExcelで以下のような表を作成し、コピーしたとしましょう。
クリップボードに格納されているこの表のデータは、以下のようなコマンドにより$data変数に取得できます。
1 | $data = Get-Clipboard | ConvertFrom-Csv -Delimiter `t |
この方法でデータを取得した場合には、1行目のデータの取得や、2行目の列2のデータの取得操作が、以下のように分かりやすい表記方法で取得できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | #1行目のデータを取得する PS C:\> $data[0] 列1 列2 列3 --- --- ---- 1 2 3 PS C:\> #2行目の列2のデータを取得する PS C:\> $data[1].列2 5 PS C:\> |
以上、参考になさってくださーい!