do shell script の制限を回避する

_UNI3508

UI elementを丸ごと取得でやりましたが、do shell script の制限を何とかする方法を今回色々考えました。

要素を一度外部ファイルに保存して投げるのは置いておいて、そのほかのやり方を考えます。
考えてみれば色々やり方はありそう。それぞれスクリプトをクリックするとスクリプトエディタで開きます。

1:pbpasteを使う。
これはダメでした。途中の受け渡しで文字コードがなんかなって、化けてしまう場合があります。

tell application “Safari” to set a1 to source of document 1
set the clipboard to a1
do shell script “pbpaste | sed -e ‘s/hoge//g'”

2:osascriptを使う1
osascriptを使い、要素取得部分をdo shell script 内に書いてしまいます。
コマンドが短ければOK。長いと後でいじる時に大変なのであまりよくなさそう。

do shell script “osascript -s s -e ‘tell application \”Safari\” to source of document 1’ | sed -e ‘s/hoge//g'”

3:osascriptを使う2
osascriptでスクリプト自身のハンドラやスクリプトを呼び出します。
これは色々応用ができそう。自分のパスを取得するので、スクリプトを保存してから実行してください。
昔はスクリプトエディタ上でpath to meをやると、スクリプトエディタのパスが返ってきてたとはずですが、
最近はちゃんと狙い通りに返ってくるんですね。

script a1
tell application “Safari” to source of document 1
end script
on a2()
tell application “Safari” to source of document 1
end a2
do shell script “osascript -e ‘run a1 of (load script alias \”” & (path to me) & “\”)’ | sed -e ‘s/hoge//g'”–script a1の呼び出し
do shell script “osascript -e ‘a2() of (load script alias \”” & (path to me) & “\”)’ | sed -e ‘s/hoge//g'”–a2()の呼び出し

osascritp内で要素取得をやると、レコードだろうが何だろうが、
当たり前ですが「テキスト」として取り出せる。これは結構いい感じ。