ふんわりした生活

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

UWSCが意外とおもしろい

予想外に書きやすいシンプルなつくりで、おもしろいなーと使ってみているUWSCですが、ほんとうにシンプルです。過去によくWindowsパソコン上で無人操作をやっていることがあったのですが(サーバーの情報を定期的にダウンロード、加工してメール納品するとか)、こういった内容ならWSHよりもずっと書きやすいかもしれないです。

PHPのように多数そろえられたビルトイン関数、ウィンドウ操作をかなり柔軟に利用できるうえに、コマンドプロンプトPowerShellとも連携できます。さらにCOMやDLLまで利用できるので、はっきり言ってVBAを使う必然性ってほとんどなくなります。もしあるとしたら、VBEを使いたい、というときくらいです。今回はしょうもないサンプルを提示しますが、WSHだけでこれを数分で書くのは相当難しいはずです。というか、無理かも。

dim voices[] = ""
recostate(true)
voice = dictate()
repeat
    resize(voices, length(voices))
    voices[length(voices) -1] = voice
    voice = dictate()
until voice = "終わり"
dim f = fopen("voice.txt", f_write)
fput(f, trim(join(voices,"<#cr>")))
fclose(f)
print "the end."

このサンプルは何かというと、音声認識で入力したテキストを「終わり」というまで蓄積してテキストファイルに保存するというものです。ちょっとしたメモをするときに実行しておけば声だけでメモが取れますよね。

個人的にもっとも気に入っているところはファイルの入出力だったりするかもしれません。込み入ったものでなければFOPEN関数などでサクッと開いて、FPUT関数で書き込みです。読み込みたいときはFGET関数です。WSHだとファイル入出力をするにはFileSystemObjectというオブジェクト経由でしか読み書きできません。設計が美しすぎて、かえって面倒というものです。もちろん、FileSystemObjectをつかうと結構いろんなことができるのですが、上記のようなしょうもないツールだとわざわざ使うのが面倒すぎるわけです。

特徴

特徴的なものとして、制御構文の条件分岐でしょうか。IFとIFBという2種類があります。VS Code用の拡張でキーワード登録していくときに「なんだこれ?」と思ったのですが、どうやら数値が条件に入るときはIFBで、そうでなければIFでよいようです。いまいち使い分けがわからないですが、サンプルを見ているとそういう使い分けのようです。

余談ですが、VS Code Extensionを0.0.2にしてスニペット追加と大文字小文字を無視してハイライトできるようにしてます。。 相変わらず全然機能が不足しているので、もっと便利にしたいところですが。

marketplace.visualstudio.com

ほかに、THREADというキーワードがあって、これで関数名を渡すとその関数を別スレッド実行してくれるというものです。自動化のためのツールということもあってか、便利に使えるようになっているようです。それから、連想配列をつくるにはHASHTBLキーワードをつけるだけというラクチンさ。Scripting.Dictionaryだったっけ、をつかってオブジェクトを利用する必要がありません。

例外処理がついているのも面白いのですが、TRY - ENDTRYです。ただ、これは例外が発生した時と何があっても最終的に実行されるブロックがあるものと別々の構文になっているようです。JavaC#VB.netのように混ぜて記述することができないようです。そのせいか、サンプルでも例外をキャッチするブロックをさらにFINALLYがあるTRYブロックで囲むという不思議な書き方にしてあります。さらに、このFINALLYはその前のTRYブロック内でEXITしたとしても必ず実行されるようです。本当に必ず実行してほしい(ファイルを閉じるとか)ものはここへ書いたほうがいいですね。

また、MODULEというモジュール化の機構も備わっていますが、なぜかCLASSの別名でもあってオブジェクト指向的なクラスとは異なります。モジュールとしてまとめるので、どちらかというと名前空間という雰囲気です。そういうこともあってインスタンス化はできません。また継承やインターフェースもありません。モジュールは一階層のみ対応のようで、ネストした次のようなものはNGのようです。

MODULE aaa
    MODULE bbb
        FUNCTION ccc()
        FEND
    ENDMODULE
ENDMODULE

モジュール内に定義した変数は外側からはアクセスできないようになっているので、それっぽいことはできます。もちろんインスタンス化できないのでコンストラクタ、デストラクタもありません。またVBAであるようなプロパティもつくることはできません。

Windows特化型の強み

このUWSCというツールはWindowsでの動作のみサポートしています。WindowsAPIをふんだんに利用して開発されているのでしょう。おかげで現在のバージョンではSENSOR関数を利用してセンサーの情報を利用したスクリプトをつくることもできるようになっています。

http://www.uwsc.info/sample.html#N66

もちろん既存のWMIを利用したスクリプトや、PowerShellを経由した.Net Frameworkの利用、ネイティブDLLの利用も思いのままです。こんなにできて大丈夫なんだろうか?と思ってしまうところです。ある程度はWindowsUACが防いでくれるので、OFFにしていなければ大丈夫だと思いますが。WSHPowerShellのように標準インストールされていたら悪意のあるソフトウェアを量産し放題ですね。恐ろしい。

なお、有償のPro版になるとフォームを利用できるようになったりExcelLibreOfficeも含む)を操作する関数が利用できるようになるようですが、フォームだけなら.NetをPowerShellから使えば利用できます。ちょっと面倒ではありますが。それに、XAMLも用意すればフォームではないウィンドウアプリをつくることもできるので、可能性は結構あります。

UWSCに関する書籍は紙のものが1種類だけ存在しているようです。非常にマニアックだったということですね。興味のある方は使ってみてはいかがでしょうか。

Windows マクロテクニック

Windows マクロテクニック