クリップボードにコピーしたテキストを 取り敢えずファイルに録り溜めるPowerShellスクリプト

##概要
* 情報をあちらこちらから引用して、後でまとめて使用したい。
* 使い終わったメモだが、後日また参照する用事があるかも知れない。
* コンソール画面の出力を部分ごとにファイルに保存したい。

そんな時のために、
クリップボードにコピーしたテキストをファイルにスクラップするスクリプトを作りました。

##環境
Windows 10, 7

##使用方法
####同一のファイルに連続して保存したい場合
1. 保存対象のテキストを選択し、[Ctrl]+[C]キー等でクリップボードにコピーします。
2. バッチファイル "SClip.bat" を、保存先ファイル名を引数にして起動します。<br/>例) ```"Z:\Path2Script\SClip\SClip.bat" "Z:\Path2Save\Memorandum.txt"```<br/>サンプルのショートカットファイルを同梱しました。
3. 保存先として指定されたファイルへ、クリップボードの内容が追記されます。

※いつ保存したものか判るよう、前後の行にセパレータとして日時および空行が挿入されます。第2引数に "-nosep" を指定すると、このセパレータを挿入しません。

####別個のファイルに保存したい場合
1. 保存対象のテキストを選択し、[Ctrl]+[C]キー等でクリップボードにコピーします。
2. バッチファイル "SClip.bat" を、引数無しで起動します。
3. ファイル名 "SClip_yyyyMMdd-HHmmss.txt" として、クリップボードの内容が保存されます。

※第2引数の有無にかかわらず、セパレータを挿入しません。

##注意
* ショートカットファイルを作成して、クイック起動バー（タスクバー上にショートカットファイルを表示させたもの）へ配置しておくと便利です。
* 保存先ファイルがテキストエディタ等で開かれていて上書きができない場合は、ファイル名 "SClip_yyyyMMdd-HHmmss.txt" として保存されます。


##発展
* 本スクリプトは、ファイルに保存したい時に手動で実行する必要があります。クリップボードを監視、すなわち新たなものがコピーされるごとに自動的に実行したい場合は、こちらの記事を参考にしてください。<br/>[**PowerShell でクリップボードの監視（履歴のロギング）**](https://qiita.com/saggie/items/481461a436a1d6801bbd)
* 本スクリプトで保存できるのはテキストのみです。つまり画像や書式情報、ファイルなどのコピーは無視されます。<br/>画像やHTMLソースを判定して保存する試みもありますので、興味ある方はこちらの記事を参考にしてください。<br/>[**PowershellでClipBoardから画像、テキスト、HTMLを保存する各スクリプト2**](https://qiita.com/Q11Q/items/1dae7d443adf05cd3f3a)

##ソースファイル
「マジック生成」するには、本ページ全体を選択してコピー後に[**B642FHT.bat**](https://qiita.com/X-IA/items/1db1929775e34ac7ef01)を起動して下さい。
その後、生成したZIPファイルを解凍して任意の場所へ配置して下さい。

興味ある方は、以下のコードをご覧ください。

###コード

```:SClip.bat
@ECHO OFF
PowerShell -ExecutionPolicy RemoteSigned -STA -File %~dpn0.ps1 %1 %2% "nul" "nul"
```

```powershell:SClip.ps1
$Host.UI.RawUI.ForeGroundColor = "Green"
Add-Type -Assembly System.Windows.Forms

"############## SClip.ps1 ###############"
"# Scrap clipboard script               #"
"#                                      #"
"#   1st release: 2019-06-30            #"
"#   Last update: 2019-07-13            #"
"#   Author: Y. Kosaka                  #"
"#   See the web for more information   #"
"#   https://qiita.com/x-ia             #"
"########################################"

$filenameScript = (Get-ChildItem $MyInvocation.MyCommand.Path).BaseName
$dirPathScript = Split-Path $MyInvocation.MyCommand.Path -Parent
$extLog = ".log"
$Host.UI.RawUI.WindowTitle = $filenameScript
$timePause = 1500


function SetFile($arg, $dirPathScript, $filenameScript, $extLog) {
  if ($arg -eq "nul") {
    $dateNow = (Get-Date).ToString("yyyyMMdd")
    $timeNow = (Get-Date).ToString("HHmmss")
    $filePathOut = $dirPathScript + "\" + $filenameScript + "_" + $dateNow + "-" + $timeNow + $extLog
  } else {
    $filePathOut = $arg
  }
  return $filePathOut
}

function GetClip {
  $strClip = [Windows.Forms.Clipboard]::GetText()
  return $strClip
}

function ViewClip($strClip) {
  "`r`n`r`n$strClip`r`n"
  $numSizeClip = $strClip.Length
  $numLineClip = 0
  foreach( $strLine in $strClip -split "`r`n" ){
    ++$numLineClip
  }
  Write-Host "`r`nRead $($numSizeClip.ToString("#,#")) chars ($($numLineClip.ToString("#,#")) lines) from the clipboard.`r`n"
}

function SetOut($strClip, $arg, $arg2) {
  if (($arg -ne "nul") -And ($arg2 -notlike "-nos*")) {
    $timeStampNow = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss.fff")
    $strOut = "`r`n>>>>> " + $timeStampNow + " >>>>>`r`n" + $strClip + "`r`n<<<<< " + $timeStampNow + " <<<<<`r`n"
  } else {
    $strOut = $strClip
  }
  return $strOut
}

function PutClip($strOut, $filePathOut) {
  $strOut | Out-file -FilePath $filePathOut -Encoding "utf8" -Append
  return $?
}

function EoF($filenameScript, $err) {
  if ("$err" -eq "True") {
    $strResult = "Success"
  } else {
    $strResult = "Failure"
  }
  $Host.UI.RawUI.WindowTitle = "$filenameScript $strResult"
  Write-Host "$filenameScript process has resulted in $strResult."
  Start-Sleep -milliseconds $timePause
}


$filePathOut = SetFile $Args[0] $dirPathScript $filenameScript $extLog
$strClip = GetClip
ViewClip $strClip
$strOut = SetOut $strClip $Args[0] $Args[1]
$err = PutClip $strOut $filePathOut
if ("$err" -ne "True") {
  $filePathOut = SetFile "nul" $dirPathScript $filenameScript $extLog
  $err = PutClip $strOut $filePathOut
}
EoF $filenameScript $err
```

###バイナリ (Base64 encoding)

```
SClip.zip
---
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
AAAAqwgAAAAA
---
```