VBScript で書かれたスクリプトを JScript で書き直すついでに、WSH について

前回記事で VBScript で書いたスクリプトを、JScript で書き直してみる。

VBScript も JScript も、Windows Scripting Host (WSH) と呼ばれる、Windows 上でのスクリプトの実行環境で実行できる言語だ。VBScript は Visual Basic 上がりのスクリプト言語で、VBA とか書いてた人は使いやすいと思う。JScript は JavaScript の方言チックな感じで、基本文法は JavaScript そのものといえる。現在から見ると、使い勝手や機能のイメージはコマンドプロンプト以上、PowerShell 未満、といった感じだろうか。Windows 環境では、VBScript は .vbs、JScript は .js で保存しておくと、いずれもダブルクリックで実行してよしなにしてくれる。

自分は VBA より JavaScript や Java の方が慣れているので、JScript で書こうとすることが多い。通常使っている範囲では、VBScript との機能的な差はほとんどなく、その時に書きたい方で書けばいい気がしている。

さて、前回の記事で書いた、ファイル読み書きのスクリプトを JScript で書き直すとこんな感じ。

var fso = new ActiveXObject("Scripting.FileSystemObject");

// 読み込みファイルの指定
var inputFile = fso.OpenTextFile("inputText.txt", 1, false, 0);

// 書き出しファイルの指定
var outputFile = fso.OpenTextFile("outputText.txt", 2, true);

// 読み込みファイルから1行ずつ読み込み、書き出しファイルに書き出すのを最終行まで繰り返す
while(!inputFile.AtEndOfStream) {
  var lineStr = inputFile.ReadLine();
  outputFile.WriteLine(lineStr);
}

// バッファを Flush してファイルを閉じる
inputFile.Close();
outputFile.Close();

主な違いは以下のとおり。

処理 VBScript JScript
変数の宣言と初期値設定 Dim fso: Set fso = ... var fso = ...
FileSystemObject の生成 WScript.CreateObject() new ActiveXObject()
行の終わり (セミコロンなし) セミコロンで閉じる
while 文 Do Until inputFile.AtEndOfStream など while(!inputFile.AtEndofStream)
引数なしのメソッド inputFile.ReadLine inputFile.ReadLine()
引数が1つのメソッド outputFile.WriteLine lineStr outputFile.WriteLine(lineStr)

オブジェクト生成が CreateObjectActiveXObject とで異なる。VBScript のコードをコピペして JScript に移植しようとしてよく間違えるところ。

Do Until と比べて、while 文は条件を反転させる点に注意 (個人的に while 文が苦手でいつも間違えてる。VB 系はループの書き方多くて大変や…)。

メソッドの引数がない場合はカッコが不要、という VB 系の特徴も、Java 系の JScript だと必ずカッコが必要。

変数の宣言と初期値指定が1行で自然にできるというところは JScript の方が気持ち良い。

参考