もうやり方は解決済みかもしれませんが、一番簡単にできる方法を一応載せておきます。
前提としてですが、Powershellで動かす場合は、クリップボードの履歴はwindows の実装に依存しているものを使うため、powershell 5.1系列でしか動作しません。
さらにクリップボードの履歴はwindows 10の後半のバージョンから実装されたもののため、.net frameworkにはdllとしてライブラリは提供されていません。
また、windowsシステムにも共有ライブラリ、csharpのライブラリとしてあらかじめインストールされているわけではなく、ms公式のnugetパッケージからソースコードをビルドしてdllを作成して、それをpowershell 5.1から読み込むという作りになります。
このms公式のnugetパッケージもcsharp7.3まで対応しているnetstandard2.0で提供されています(netstandard2.0しか対応していない)が、IEnumeratorはpowershell5.1で動作しないため、非同期処理はcsharp 7.2までの文法で実装することになります。
もし、これをpowershell core系でも使いたいなら、powershell 5.1で実行したスクリプトの戻り値をpowershell coreで取得するという構成になります。
よって、かなり制限がきつく、アーキテクトの仕様を理解する必要がある割には運用含めて難しくペイしないと考えられるので、よほど特別な理由がない限りpowershellでクリップボードの履歴を扱うことはお勧めしません。
もしどうしてもやってみたいなら下のように環境構築実装することになります。
これはwindows11 23H2で動作確認済みです。
dotnet 6以上のインストール
プロジェクトの作成からリリースまでdotnet コマンドを使ったほうが楽なので、dotnet コマンドを使って、プロジェクト、ソリューションを作ります。
winget install Microsoft.DotNet.SDK
csharpのソリューションとプロジェクトを作成
dotnet new sln -o clipboard_history
cd clipboard_history
dotnet new classlib --framework netstandard2.0 -o clipboard_history
# ソリューションをプロジェクトに追加
dotnet sln add clipboard_history/
clipboardの履歴関係を扱うライブラリの追加
# プロジェクトフォルダに移動して
dotnet add package Microsoft.Windows.SDK.Contracts --version 10.0.22621.2428
clipboardの履歴を取得するライブラリ作成
下記のようなソースコードを書いてください。
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Windows.ApplicationModel.DataTransfer;
namespace clipboard_history
{
public class Class1
{
public async static Task<List<string>> GetClipboardHistoryItem()
{
var result = await Clipboard.GetHistoryItemsAsync();
List<string> resultsItems = new List<string>(result.Items.Count);
foreach (var val in result.Items) {
resultsItems.Add(await val.Content.GetTextAsync());
}
return resultsItems;
}
}
}
ビルド
# プロジェクトフォルダに移動して
dotnet build
使い方
powershell 5.1から下記のようにバイナリのロードを行ってから静的メソッドを呼び出すことにより取得します。
Add-Type -path .\bin\Debug\netstandard2.0\clipboard_history.dll
$val = [clipboard_history.Class1]::GetClipboardHistoryItem()
# 1行ずつ(クリップボードごと)処理
$val.Result | %{$_}
# 履歴の件数
$val.Result.Count
最後に
ここからさらに仕事でやる場合は、仕様としてクリップボードの履歴が有効になっているかをどう処理するか?もロジックとして追加する必要があります。
shellなので、エラーになっても動くため、仕様とするのもよいです。
エラー処理をする場合はgithubにあるPowershellのGetClipboardCommand classのエラー処理を参考に書くのがいいと思います。