PowerShell
clipboard

PowershellでClipBoardから画像、テキスト、HTMLを保存する各スクリプト2

画像の場合

Powershell script to save clipboard image to file - social.technet.microsoft.com

PS_GetClpImg.Ps1
Add-Type -Assembly PresentationCore
$img = [Windows.Clipboard]::GetImage()
if ($img -eq $null) {
Write-Host "Kein Bild in der ZA gefunden."
Exit
}
Write-Host ("Bild gefunden. {0}x{1} Pixel." -f $img.PixelWidth,$img.PixelHeight)
$fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)
$folder = Get-Item -Path "E:\"
$stream = [IO.File]::Open(("{0}\Clipboard-{1}.png" -f $folder,((Get-Date -f s) -replace '[-T:]','')), "OpenOrCreate")
#$stream = [IO.File]::Open(("{0}\Clipboard-{1}.png" -f [System.Environment]::GetFolderPath('MyPictures'),((Get-Date -f s) -replace '[-T:]','')), "OpenOrCreate")
$encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder
$encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb))
$encoder.Save($stream)

$stream.Dispose()

元のスクリプトはPictureフォルダに保存しようとするので上記はE:\にして汎用性を高めています。
そして

  • Powershell ISEでこのスクリプトを呼び出し
  • Set-ExecutionPolicy RemoteSigned -s Process -f をしておく

 - 画面全体を撮るときはPrtScr
 - 画面の一つのWindowだけ撮影 Alt + PrtScr(PrtScrを押してからALTを押すと余計な文字が出ない)
 - 画面の任意の四角 SnippingToolを起動してオプションをクリップボードに保存、終了時に確認しない、赤枠で囲むにいして囲んだ後、保存せずに終了か新規作成(N)をクリックし、SnippingToolを終了

  • Poweshell ISE を呼び出し、[F5]キーを押す。
  • E:\ドライブに保存

テキスト(UTF8)の場合

GetClpTxt.ps1
Add-Type -Assembly PresentationCore
$strHTML= [windows.clipboard]::GetText()
if([Windows.Clipboard]::ContainsText()){
if ($strHTML -eq $null) {
Write-Host "Kein Bild in der ZA gefunden."
Exit
}
$folder = Get-Item -Path "E:\"
$sFullPath ="{0}\Clipboard-{1}.txt" -f $folder,((Get-Date -f s) -replace '[-T:]','')
$strHTML | Out-File $sFullPath -Force -Encoding "utf8"
}#End If ([Windows.Clipboard]::ContainsText()

HTMLの場合

GetClpHtm.ps1
Add-Type -Assembly PresentationCore
$strHTML= [windows.clipboard]::GetText()
if([Windows.Clipboard]::ContainsText()){
if ($strHTML -eq $null) {
Write-Host "Kein Bild in der ZA gefunden."
Exit
}
$folder = Get-Item -Path "E:\"
$sFullPath ="{0}\Clipboard-{1}.html" -f $folder,((Get-Date -f s) -replace '[-T:]','')
$strHTML | Out-File $sFullPath -Force -Encoding "utf8"
}#End If ([Windows.Clipboard]::ContainsText()
  • HTMLはWebページなどをクリップするときに使えます。
  • しかし単純にブラウザ上のテキストをコピーしてもテキストになります。
  • HTMLでクリップしたい場合はソースを表示させ、それをコピーしてクリップボードに入れてからパワーシェルのスクリプトを実行します。

本当は失敗している

  • Get-Clipboard命令があるのに誰も使っていない。(確かに使ってもうまくいかない)
  • [windows.clipboard]::の場合[windows.clipboard]::GetDataがあるが、Powershellでは誰も使っていない。Clipboard.GetData メソッド (String)
  • 本当はこれが使えればClipboardのデータの型をみてGetData(dataformats.clipboard)のようにして取得して保存すると3つのスクリプトをつかいわける必要がないのですが。これを使った例がなく、やっても動きませんでした。
  • Powershell ISEは複数のスクリプトを同時に呼び出してタブを切り替えてつかえますので、クリップしたタイプごとに使い分けてください。間違えてもNodataで終了するかテキストとHTMLが混同される程度ですし、HTMLはブラウザのファイルからHTML保存でページ全体を保存できるので、基本的に使わないと思います。

試作品ができた

PS_GetClpSpcial.Ps1
#Set-ExecutionPolicy RemoteSigned -s Process -f
Try{
add-type -an system.windows.forms #an AssemblyName
$folder = Get-Item -Path "D:\"
$obj= [System.Windows.Forms.Clipboard]::GetDataObject()
if(!($obj -eq $null)){$clpdatatype = $obj.GetType()}
if($obj.ContainsText()){
[boolean]$blHtm = $false
$objhtm = $obj.GetData([Windows.Forms.DataFormats]::Html)
if(!($objhtm -eq $null)){Write-Host "objhtm has data"
$sFullPath ="{0}\Clipboard-{1}.html" -f $folder,((Get-Date -f s) -replace '[-T:]','')
$strHTML | Out-File $sFullPath -Force -Encoding "utf8"
[boolean]$blHtm = $true
}
if($blHtm-eq $false){
$objtxt = $obj.GetData([Windows.Forms.DataFormats]::text)
if(!($objtxt -eq $null)){Write-Host "objtxt has data"
$sFullPath ="{0}\Clipboardtxt-{1}.txt" -f $folder,((Get-Date -f s) -replace '[-T:]','')
}
$objUxt = $obj.GetData([Windows.Forms.DataFormats]::UnicodeText)
if(!($objUxt -eq $null)){Write-Host "objUxt has data"
$sFullPath ="{0}\ClipboardUxt-{1}.txt" -f $folder,((Get-Date -f s) -replace '[-T:]','')
$objUxt | Out-File $sFullPath -Force -Encoding "unicode"
}
$objCxt = $obj.GetData([Windows.Forms.DataFormats]::CommaSeparatedValue)
if(!($objCxt -eq $null)){Write-Host "objCxt has data"
$sFullPath ="{0}\Clipboardcsvt-{1}.csv" -f $folder,((Get-Date -f s) -replace '[-T:]','')
$objCxt | Export-Csv $sFullPath -Force -NoTypeInformation -Encoding "utf8"
}
$objrtf = $obj.GetData([Windows.Forms.DataFormats]::Rtf)
if(!($objrtf -eq $null)){Write-Host "objrtf has data"
$sFullPath ="{0}\Clipboardrtf-{1}.rtf" -f $folder,((Get-Date -f s) -replace '[-T:]','')
$objrtf | Out-File $sFullPath -Force 
}
} #End IF $blHtm-eq $false

}

if($obj.ContainsImage()){
$objimg = $obj.GetData([Windows.Forms.DataFormats]::Bitmap)
Write-Host "image"
$img = [Windows.Clipboard]::GetImage()
Write-Host ("Bild gefunden. {0}x{1} Pixel." -f $img.PixelWidth,$img.PixelHeight)
$fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)
$stream = [IO.File]::Open(("{0}\Clipboard-{1}.png" -f $folder,((Get-Date -f s) -replace '[-T:]','')), "OpenOrCreate")
$encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder
$encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb))
$encoder.Save($stream)
$stream.Dispose()
}
if($obj.ContainsAudio()){
Write-Host "Audio"
$objAud = $obj.GetData([Windows.Forms.DataFormats]::WaveAudio)}
}Finally{

}
<#
http://winscript.jp/m/powershell/229
Get-Clipboard https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-clipboard?view=powershell-5.1
Clipboard.GetData メソッド (String) https://msdn.microsoft.com/ja-jp/library/system.windows.forms.clipboard.getdata(v=vs.110).aspx
DataFormats クラス https://msdn.microsoft.com/ja-jp/library/system.windows.forms.dataformats(v=vs.110).aspx
#>

getdataをようやく使うことができた例。
HTMLがとれた場合は、それで保存し、それ以外はテキスト形式で保存。
HTMLの判定はこれでできるようだ。
リッチテキストはタグになってしまう。