見出し画像

WSHがお好きでしょ?(4)

こんにちは、なるーらぼです。リモートワークは慣れたでしょうか?フリーランスは自宅で仕事をすることも多いのですが、日々通勤していた方には心理的にオンオフの切り替えが大変かもしれませんね。
今回はWSFという、これまたおかしなものをご紹介したいと思います。便利といえば便利なものですので、知らなくてもいいことですが知っておくと使うことができる日が来るかもしれませんよ。

WSFとは

WindowsScriptFileの略がWSFです。VBSやJSと何が違うんだよ?と思いますよね。わたしも最初は意味があるのだろうかと思っていました。もちろん意味があります。ただ、VBSやJSとは明確に用途が違うのです。
WSFファイルは拡張子が「.wsf」です。実はこのファイル、形式はXMLなのです。はぁ?XMLって何だよと思った方はプログラマ以外の方だと思います。XMLはHTMLみたいなものなんですが、ウェブページなどを表現するための文書を記述するHTMLを「とりあえずなんにでも使えるようにしようぜ」と拡張したものです。拡張している(eXtended)なのでXML、という…

「そこ」とVBSやJSとなんの関係があるんだ?となりますが、先程も説明しましたとおり、「とりあえずなんにでも使える」わけですから、スクリプトをまとめて管理できるようなスクリプトファイル、とでもいえばよいでしょうか。そういうしろものです。
とりまとめることができるので、恐ろしいことにVBSとJSを共存させることができます。また、VBSやJSではできないのですが他のスクリプトファイルに書いた関数を読み込むこともできます。ですから、VBSにしかない便利関数を使ったものをJSで利用したり、JSにしかない便利なものをVBSに取り込むといったことができます。
また、解放漏れをよくやりやすいCreateObjectをしなくてもWSFにあらかじめオブジェクトを登録しておくことでCOMを利用することができるという信じられないような機能もあります。さらには同じスクリプト内でジョブを定義することができます。WSF実行時にジョブを指定すれば、同じWSFを指定しているのに別の処理を行うこともできるというスグレモノです。

WSFサンプル

正直いって、WSFは何度も書き直すようなものではありません。管理をするようなファイルですので、ひな形を1つつくっておいてそれをコピーして使い回すことができます。ジョブの内容が変わればジョブのIDを書き換える、まとめるスクリプトファイルが変わればスクリプトファイル名を書き換える。使用するオブジェクト、COMが変わればオブジェクトの登録を増やしたり減らしたりする、という感じです。
それに、何度もイチから書くのは非常に面倒です。というのも、やろうと思えばXMLファイルですから、XMLの形式の中にVBSCriptとJScriptを混在させて記述することもできます。もう何が何やらわけがわからなくなります。
ですから、XMLはXMLだけにしておいて、読み込むVBSやJSに動作すべきコードを書いておくことをおすすめします。以下へサンプルを書いておきます。注意点として、Shift-JISだとうまく動作しません。UTF-8で保存してください。

<?XML version="version" ?>
<package>
  <job id="job4VBS">
     <description>Usage: wscript thisapp.wsf /something:aaaaa</description>
     <runtime>
       <named
         name="something"
         helpstring="対象となる**を指定します。"
         type="string"
         required="true"
       />
     </runtime>
     <?job debug="true"?>
     <obect id="fso" progid="Scripting.FileSystemObject" />
     <script language="VBScript" src="app.vbs"></script>
  </job>

  <job id="job4JS">
     <?job debug="true"?>
     <runtime>
       <named
         name="something"
         helpstring="対象となる**を指定します。"
         type="string"
         required="true"
       />
     </runtime>
     <script language="JScript" src="app.js"></script>
  </job>
</package>

一応の解説(スキップして大丈夫です)

package要素にはjob要素を複数もたせることができます。job要素は上述したように、ジョブを指定することができます。さらにjob要素内のruntime要素では起動時のパラメータの定義とその説明を記述することもできます。面白いことに、Wscript.Arguments.ShowUsage()を使用することでこのruntime要素に記述したhelpstring属性値を使ったヘルプを表示することができます。また、そのパラメータの必須かどうかも指定することができます。description要素には先程のShowUsageメソッドで説明文を表示することができます。最後にscript要素はHTMLなどと同じで言語とファイルを指定することができます。もちろんscript要素内に直接VBSやJSを記述することもできます。
説明していない内容として、object要素がありますね。これは上述したCOMを記載しておくことができるものです。また、<?job?>というのもありますが、これはデバッグのときだけ必要なものです。不要になったらHTMLのコメント<!-- -->でコメントアウトすればよいでしょう。

最後に

今回はコードを掲載してしまったので長くなってしまいました。WSFも意外といろいろありまして、コンポーネントであるWSCファイル、WSFの挙動を設定することができるWSHファイルが他にもありますが、そこまでこだわる方は公式リファレンスをご覧いただくとよいでしょう。

https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc364455(v=msdn.10)

この記事が気に入ったらサポートをしてみませんか?