[VBScript] wsfファイルのメリットとその活用方法
2021年 01月 02日
複数人で共通のvbsファイルを利用するならば、wsfファイル形式での運用がオススメ
- wsfファイルならばエンコードしたファイルも扱えることが分かり、このメリットを生かした活用方法を考えてみた。
wsfファイルのメリット
一つのwsfファイル内に、複数の独立した機能(Job)を組み込める
wsfファイルにおける各Jobは完全に独立した関係となっている。
これにより、一つのwsfファイル内に、独立した機能を複数実装することができない。
vbsファイルの場合は、完全に独立させた関数実装とするか、個別ファイルとして開発する必要がある。HTTPプロトコル上のスクリプトファイルを利用できる
<script language="VBScript" src="http://*****/vbCommon.vbs"/>
対して、インクルード実行ではHTTPプロトコル上のファイルは使えない。同じフォルダ上のスクリプトはファイル名のみでアクセスできる
<script language="VBScript" src="vbCommon.vbs"/>
対して、インクルード実行ではドロップ実行時にファイルフルパス指定が必要。
エンコードしたスクリプトを利用できる(ただし、注意点アリ。詳細は以下)
<script language="VBScript.Encode" src="vbCommon.vbe"/>
対して、インクルード実行にはエンコードしたスクリプトは使えない。
wsfファイルの注意点
元スクリプトがすべて動くとは限らない。エンコード対象は最小にとどめよう!
vbCommon.vbe(エンコード済みスクリプト)では、TListクラスやTIniFileクラスを利用すると、下図のように「クラスが定義されていません」となる。
全コメントを削除してエンコードしても解決せず(近い症状)。
この点は、サポート終了のVBS制約として受け入れ、
エンコード単位をパスワード記載スクリプトのみといった運用で工夫しよう。
サンプルプログラムのダウンロードと使い方
- wsfファイルのメリットを生かしたサンプルを作ってみた。
- ダウンロード
- 使い方は
wsfファイルに適当なフォルダ・ファイルをドロップする、だけ。- 親Job(冒頭のJob)は、ドロップされたパスを子job(Job:1)で処理させる。
- 親Jobは、「Job:1」の結果をもとに「Job:2」を実行する。
このように、親子Jobを使い分ければ、一つのwsfファイル内での動作機能の切り分け開発が可能。
各Jobのスクリプトをhttp参照させれば、ユーザ配布したスクリプトの管理も不要となる(Webサーバのみで管理可能)。
この記事での気付き
- ハイブリット開発で開発言語・技術ごとのメリットを活かす。
- 処理系の親子関係を定義し、処理系を分離することで、子の処理の再利用性を高めておく。
- スクリプト管理先をWEBサーバとすることで、ユーザ配布作業を0化する(HTTPアクセスさせる)。
今回開発したプログラムソース
<package>
<!-- jobをコントロールする親 ------------------------------------- -->
<job id=0>
<script language="VBScript" src="vbCommon.vbs"/>
<script language="VBScript">
If WScript.Arguments.Count = 0 Then WScript.Quit
' job:1
Dim cmd,arg
arg = WScript.Arguments(0)
For i = 1 To WScript.Arguments.Count -1
arg = arg & " " & WScript.Arguments(i)
Next
cmd = "cscript " & WScript.ScriptFullName & " //job:1 " & arg
objWS.Run cmd,1,True
' job:2
arg = objFS.GetParentFolderName(WScript.ScriptFullName)
cmd = "cscript " & WScript.ScriptFullName & " //job:2 " & arg
objWS.Run cmd,1,True
</script>
</job>
<!-- jobをコントロールされる子 その1 ----------------------------- -->
<job id=1>
<script language="VBScript" src="vbCommon.vbs"/>
<script language="VBScript">
For i = 0 To WScript.Arguments.Count -1
dprintf "WScript.Arguments(" & i &")=" & WScript.Arguments(i)
Next
</Script>
</job>
<!-- jobをコントロールされる子 その2 ----------------------------- -->
<job id=2>
<script language="VBScript" src="vbCommon.vbs"/>
<script language="VBScript">
For i = 0 To WScript.Arguments.Count -1
dprintf "WScript.Arguments(" & i &")=" & WScript.Arguments(i)
Next
</Script>
</job>
<!-- ------------------------------------------------------------- -->
</package>