ふんわりした生活

本を読んだり仕事でやってみたことなどの日常から、ふんわりと気づきなどを書いていきます

古来より伝わるUWSCなる自動化ツールに驚いて構文ハイライト用のVSCode拡張もつくった

ずっとWindowsで作業の自動化なんかをやるとしたら、Officeスイートに付属しているVBAWSH、あるいはPowerShellくらいのものだと思い込んでいた。そこまで来たら、VB.netでもさらっと書いてvbcでコンパイルしたほうがいいやと思っていたところだった。

以前からクラウドワークスなんかの募集で見かけていた「UWSC」というのが気になって調べてみたところ、これがかなりのものだった。 勢いでご紹介したい。

UWSC

どうやらわたしが知らなかっただけで、かなり昔から存在している自動化ツールのようだ。 おもしろいのは、マクロのように操作を記録して(むかしVectorとか窓の杜にあったような気がしなくはないが)スクリプトにすることができるという点だ。有償バージョンだと実行形式にもすることができるらしい。

UWSC

無償版のほうはダウンロードしてきたら解凍して実行形式をダブルクリックするだけでつかうことができる。インストールが不要でWindows10でも動作するというのは素晴らしい。さらに、サンプルが公開されていて自動クリックなどの無人操作はもちろんFireFoxChromeといったブラウザの操作もすることができる。恐ろしいことに、COMやDLLについても利用できるということなので、そりゃこれでいろんなこと考える方もいるよね・・・と思った次第。

サンプル

見た感じはVBAに似ている。変数宣言は無理にする必要はなく、代入したら使うことができる。動画用に棒読みするスクリプトを書いてみたのだが、割と面白かった。

const speakerfile = "C:\Users\hoge\Desktop\speak.txt"
try
    fid = fopen(speakerfile)
    try
      for line = 1 to fget(fid, -1)
        comment = fget(fid, line)
        if length(trim(comment)) = 0 then
          sleep(2)
        else
          speak(comment)
        endif
      next
    except
      print try_errmsg
    endtry
finally
  fclose(fid)
endtry

なんとなくイメージがつきそうなものだ。一行目はデスクトップにある読み上げ用のテキストファイルパスを定数として宣言している。次からはファイル操作でエラーが発生したときのために必ずファイルを閉じるようにする「try - finally」ブロックだ。ここはVBAに比べてもかなりいい。VB.netになるまでtry - catch -finallyは使えなかったので。

ファイルの操作もCっぽいというかrubyっぽいというか。上記のスクリプトでは空行があったら一呼吸ついてもらうために2秒のスリープを入れている。棒読みしてもらうのはSPEAK関数に文字列を渡すだけ。ものすごく便利。

これだと例外処理が面倒かつできることが限定されているVBSを使ったり、新たに文法を覚えなおす必要のあるPowerShellを利用することなく自動化を図ることができるということだ。素晴らしすぎる。ただ、どう考えても日本でしか使われていない。サクラエディタなど、日本でつかわれている有名どころのテキストエディタだと、構文ハイライトできるものを公開している方がいらっしゃるようだ。

覚えることも非常に少なそうなので、データベースをつかったり大量にデータをさばく必要がある、という用途でなければExcelを起動するよりこれを使ったほうがいいかもしれない。

VS Code Extensionをつくってみた

感動のあまり、いろいろ書いてみようと思ったのだけどVisual Studio Codeにはハイライトできるものがなさそうだった。それにどんな関数があるのかも調べたかったので、ヘルプを見ながらVS Code用の拡張をつくってみた。公式のヘルプだと関数などはすべて大文字で記述されているが、どうも大文字小文字の区別はないようなので小文字オンリーと手抜きになっている。

marketplace.visualstudio.com

以前にもマークダウン用に文字数をカウントする拡張を自作したことがあったが、構文ハイライトだけならJSONファイルを編集するだけという簡単さから自作のモチベーションは機能的なものよりずっと高まりやすいということもわかった。

また、Yeomanによるジェネレータのおかげで編集すべきファイルはたったの2ファイルしかなかったことも驚いた。簡単。公開も死ぬほど簡単だったので、もっときちんと作ればよかったと後悔している。

f:id:m0t0k1m0t0k1:20170328163006j:plain

かなり柔軟かつ高機能なUWSC

個人的にうれしい誤算だったのは、UWSC標準でPowerShell連携をサポートしているというところだ。TextBlockで複数行テキストを作成して、この中にPowerShellスクリプトを記述することができる。すると…恐ろしいことにPowerShellスクリプトを実行することができる。

実行ポリシーとかなにそれ?というところではある。ただ、どういう実行の仕方をしているのかわからないがプロファイルは読み込まれている。プロファイルが邪魔になるケースでは回避の方法がなさそうだ。以下はGet-ChildItemコマンドレットで現在のフォルダ内にあるアイテムの数を出力するサンプル。ps1というテキストブロック変数の文字列をPowerShell関数で実行しているものだ。

print powershell(ps1)

textblock ps1
$a = ls
$a.Count
endtextblock

なお、別のUWSCスクリプト(*.uws)を読み込んでつかうこともできるようなので機能で分割することもできる。プロシージャ、関数、クラス定義などにも対応している(クラスは実体化することはできないので、なでしこっぽい?)。

Pro版では実行形式ファイルにすることができたり、フォームの生成やExcelを関数から操作することができたりするようだ。当面は無償版でいろいろいじってみたい。