PowerShell 獲取剪貼簿歷史紀錄
參考自這篇文章並做了一些改良
Enumerating Windows clipboard history in PowerShell - The Old New Thing (microsoft.com)
由於載入的物件僅有 PowerShell 能使用,這導致在 Pwsh 中無法使用,一個簡單的解法就是直接呼叫 PowerShell 來做事就好了
這邊附上完整的函式
function Get-ClipboardHistory {
# 定義在 Windows PowerShell 中執行的腳本
$scriptBlock = {
# 導入 Windows Runtime 支持
Add-Type -AssemblyName System.Runtime.WindowsRuntime
# 尋找 AsTask 泛型方法,用於處理異步操作
$asTaskGeneric = ([System.WindowsRuntimeSystemExtensions].GetMethods() | Where-Object {
$_.Name -eq 'AsTask' -and
$_.GetParameters().Count -eq 1 -and
$_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1'
})[0]
# 定義 Await 函數,用於等待 Windows Runtime 的異步操作結果
function Await($WinRtTask, $ResultType) {
$asTask = $asTaskGeneric.MakeGenericMethod($ResultType)
$netTask = $asTask.Invoke($null, @($WinRtTask))
$netTask.Wait(-1) | Out-Null
$netTask.Result
}
# 加載剪貼板相關的 Windows Runtime 類型
[Windows.ApplicationModel.DataTransfer.Clipboard, Windows.ApplicationModel.DataTransfer, ContentType=WindowsRuntime] | Out-Null
# 獲取剪貼板歷史項目的異步操作
$op = [Windows.ApplicationModel.DataTransfer.Clipboard]::GetHistoryItemsAsync()
$result = Await ($op) ([Windows.ApplicationModel.DataTransfer.ClipboardHistoryItemsResult])
# 獲取每個歷史項目的文本內容
$textops = $result.Items.Content.GetTextAsync()
# 迭代處理每個歷史項目的文本
$textObjects = @()
foreach ($textop in $textops) {
$textObjects += Await($textop) ([String])
}
# 將對向轉換為 JSON 字符串
$textObjects | ConvertTo-Json
}
# 使用 Base64 編碼 PowerShell 腳本,並通過 PowerShell.exe 執行
$encodedBlock = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($scriptBlock.ToString()))
,@((powershell.exe -EncodedCommand $encodedBlock | ConvertFrom-Json))
} # (Get-ClipboardHistory)[0]
對於特殊符號有些顯示不出來變成問號,改成 UTF8 可以正常顯示
[console]::OutputEncoding = [Text.Encoding]::UTF8
這其實不是編碼不匹配的問題單純只是中文 BIG5 的符號沒有 UTF8 齊全而已,根據需求自己實作進去吧。
沒有留言:
張貼留言