本連載ではここ数回にわたり、Windowsからスマホへテキストを渡す方法として、メールを使うやり方を試している。前回はThunderbirdのメール作成コンポーザを使えば、システムクリップボードのテキストをそのまま本文に使うかたちで新規メール作成を行えることを説明した。

前回までに作成したPowerShellスクリプト「clip2mail.ps1」は次の通りだ。

#!/usr/bin/env pwsh

#========================================================================
# システムクリップボードのテキストでメールを作成
#========================================================================

#========================================================================
# Thunderbirdアプリケーションパス
#========================================================================
$mailer='C:\Program Files\Mozilla Thunderbird\thunderbird.exe'

#========================================================================
# 本文の上限文字数
#========================================================================
$bodycharlimit = 32000

#========================================================================
# 宛先とサブジェクト
#========================================================================
$to=$env:DEFAULT_TO_EMAIL
$title="Windowsシステムクリップボード"

#========================================================================
# システムクリップボードのテキストをThunderbirdのコンポーザに貼り付け
# できるフォーマットへ変換
#========================================================================
$body=$(Get-Clipboard | Out-String)

$body=$body -replace " "," "
$body=$body -replace "<","&lt;"
$body=$body -replace ">","&gt;"
$body=$body -replace "  ","<pre style='display:inline'>&#009;</pre>"

#========================================================================
# 引数で指定できる文字列長には上限がある。上限を超えている場合には、条件
# 未満まで文字数を減らして使用する。
#========================================================================
if ($body.Length -gt $bodycharlimit) {
    $body = $body.Substring(0, $bodycharlimit)
}

#========================================================================
# メールを作成
#========================================================================
& $mailer                               `
    -compose                            `
    "to='$to',subject='$title',body='$body'"

前回はこのスクリプトをブラッシュアップし、それなりに使えるようにした。今回はこの取り組みをさらに進める。

ひたすら動作確認を繰り返す

この後の作業は簡単だ。さまざまなテキストデータをクリップボードに貼り付けて、その後、clip2mail.ps1を実行していく。思ったように動作しないテキストデータを見つけたら、改修を行う。これを繰り返すことで、より実用的なPowerShellスクリプトに仕上げていくわけだ。

例えば、clip2mail.ps1そのものをシステムクリップボードにコピーしてからclip2mail.ps1を実行してみる。

  • clip2mai.ps1スクリプトそのものをシステムクリップボードへコピー

    clip2mai.ps1スクリプトそのものをシステムクリップボードへコピー

実行すると次のようになる。

  • 実行結果

    実行結果

一番最後のところを見ると、途中で貼り付けが終わっていることがわかる。その部分の「,」がThunderbirdに対する引数の区切りの「,」として解釈されてしまったためだ。

これは前回までに行ってきた回避策と同じやり方で回避できる。つまり、「,」を特殊文字に置き換えれば良い。次のコードを追加すればOKだ。

$body=$body -replace ",","&#044;"

この改修を行った後でclip2mail.ps1を実行すると、次のようになる。

  • 実行結果

    実行結果

最後まで本文として使われていることがわかる。これでまた一つ、問題なく貼り付けられるテキストデータが増えた。

サイズ超過の場合の処理を改善

今度は次のテキストファイルをコピーしてみる。C言語のソースコードファイルだ。

  • 長めのテキストデータをシステムクリップボードへコピー

    長めのテキストデータをシステムクリップボードへコピー

実行すると次のようになる。

  • 実行結果

    実行結果

ご覧の通り、本文のデータが途中で切れている。

今回はテキストの長さが上限を超えたために途中から削除されただけで、処理としては想定通りに機能している。しかし、これでは途中でデータが切れたのが長さ上限を超えたせいなのか、想定していない挙動のせいなのかの判断ができない。長さ上限を超えた場合には、その旨を表示するようにした方が良さそうだ。

長さ上限を超えた部分の処理は次のようになっている。

if ($body.Length -gt $bodycharlimit) {
    $body = $body.Substring(0, $bodycharlimit)
}

この部分を次のように書き換える。

if ($body.Length -gt $bodycharlimit) {
    $body = $body.Substring(0, $bodycharlimit)
    $body += "<br>"
    $body += "<br>"
    $body += "(サイズオーバーでカットしました)"
}

実行すると次のようになる。

  • 実行結果

    実行結果

これならば、長さ上限を超えたためにテキストが削除されたことがひと目でわかる。

ポイントは、テキストを改行して表示するために「<br>」を含めた点だ。これは、Thunderbirdのメールコンポーザならではの指定ということになる。