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)

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

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

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

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

参考