VBScriptとJScriptって何が違ってWSHとはどう違うのか

VBScriptとJScriptって何が違ってWSHとはどう違うのか

VBScriptとJScriptって何が違ってWSHとはどう違うのか

先に答えを書いてしまうとVBScriptは『Basic寄り』でJScriptは『C寄り』なのだそうです。
JScript は JavaScript ではないが JavaScript を読み込めるから拡張子が.jsでも動作します。
WSHはVBScript とJScriptの間に横たわる橋みたいなもんと考えてればいいみたい。ちなみにWSHは言語ではくてプラットフォームなので 拡張子 wsf で行けば VBScriptとJScript の混在が可能だとか…。それ実際組んだらカオスですけどね。

ちなみに、利用できる拡張子はこんな感じ。

WSH:「.js」「.jse」「.wsf」「.vbs」
VBS:「.vbs」「.wsf」
JScript:「.js」「.jse」「.wsf」

Google先生の導く回答も混乱してらっしゃるという難解ぶり。
JScriptで調べるとJavaScriptを検索HITするし、記事にしてまとめてる方も混同したりしてますもんね。
JScript≠JavaScriptですから!違いは こちらこちら を参照すると解りやすいです。

という事でちょっと整理整頓してみます。

JScriptとVBScriptで大きく違う点は変数設置の方法

下の参考コード OpenCmd.jse と OpenCmd.vbs は『コマンドプロントを開いて 123456789 と記載してEnterを押し、5秒後に閉じる』という同じ処理をします。

■OpenCmd.jse ※JScript

■OpenCmd.vbs ※VBS

見ての通り、後半の書き方なんて全く同じ。
違うのはRUNで走らせている『Pathの記載方法』と『Dimでの変数宣言(VBS)』くらいです。

その他の細かい違いについて

それぞれの動作をまとめた資料があったのでパクって置いておきます。

VBScript JScript
条件コンパイル なし @cc_on
@if
@set
OOP クラス(Class)構文による型定義 prototypeによるオブジェクト定義
定数宣言 Const なし
GUI MsgBox関数,InputBox関数<による詳細な制御 なし
ブジェクトの代入 Set ステートメント 通常の値の場合と同じ
組み込みオブジェクト Err
RegExp
JavaScriptのオブジェクト
Enumerator
RegExp
VBArray
ActiveXObject
GetObject
変数宣言の強制 不可
参照渡し ByRef,ByVal 言語既定
オブジェクトへのアクセス制御 Private なし
エラー制御(例外) On Error Resume Next,On Error Goto 0 throw,try,catch,finally
動的プログラミング Execute
ExecuteGlobal
eval
関数オブジェクト
オブジェクトの破棄 Nothing ガベージコレクト
関数とプロシージャ Sub,Functionによる定義の区別、呼び出し方法(Call)による区別 区別なし
細かいところ インクリメンタル演算子がない
比較と代入が文脈で判断される
※例えば、If A = 123 は比較、SET A = 123 なら代入
可変長配列 Redimステートメント Arrayオブジェクト

VBSには インクリメンタル演算子が無いのでループ内に『 i++ 』で変数加算していく事は出来ないようです。

『オブジェクトの宣言』と『破棄』はVBSでコード記載する時の鍵であったりします。
今回、大ハマリしたアクティブウィンドも最終的にはこの宣言と破棄と破棄されるタイミングのコントロールが原因でした。(ここら辺のお話は後程

まとめ

プログラミングでいろんな言語に触っていくと、書き方のクセとか微妙な違いに振れる事になります。
そして今回の様に「どこが違うんじゃい!」というのにも…。

そもそもね、わかりずらい奴多いですよね。

  • Java ≠ JavaScript ≠ JScript
  • JQuery ≠ AJAX
  • VBE ≒ VBA ≠ VBS

理解出来てくると「なるほど」だけど取っ掛かりの資料が混雑してらっしゃるから解くのに時間かかります。

今回のWSHもそんな感じ。だって検索するとVBSもJScriptもHITして、つまみ食いすると(それぞれ書き方違うから)動かないんですもん。

大切なことは『WSHはプラットフォームであって言語ではない』って事です。