トップWSH >  WSH入門

WSH入門

5〜10年ぶりにWSHを使ってみた。 ZIPファイルがWSHで簡単に解凍できるのに驚いた。 圧縮は空のZIPファイルを作成するなど、解凍よりは少し手間がかかる。

1.WSHとは

WSH(Windows Script Host)とは、Windows上で JScript(マイクロソフト版JavaScript)やVBScriptで記述されたプログラム を実行するためのソフトウェア(インタプリタ)である。

WSH自体はJavaScript/VBScript以外の言語にも対応可能になっており、他のスクリプト言語用の動作環境をインストールすることにより、 Perlなどでもバッチ処理を行える。

JavaScriptプログラムは通常ブラウザ上で動作するが、 WSHを使えばブラウザなしでJavaScriptプログラムを実行できる。

Windows 7 では、WSHインタプリタ wscript.exe は C:\Windows\System32 に置かれていることが whereコマンドで確認できる。

c:\mh\mcc>where wscript
C:\Windows\System32\wscript.exe

下に簡単な配列の並び替えプログラムを示す。 ただし、数値の小さい順ではなく、文字列として ASCIIコードの小さい順に並び替えるものである。

ホームページでの出力は document.writeln(num) が使えるが、 WSHの場合、documentオブジェクトは存在しない。 下のプログラムでは echo関数を使用している。
wsh01.js

  var num = [3.14, 1.414, 1234, 9];  // 配列
  num.sort();           // 配列をソート(ASCII順)
  WScript.echo(num);    // 出力 1.414, 1234, 3.14, 9

2.コマンドラインからパラメータを受け取る

コマンドラインからパラメータを受け取るには WScript.arguments を使う。

JScript版 wsh02.js
  for (var i = 0; i < WScript.arguments.length; i++)
     WScript.echo(WScript.arguments(i));
VBScript版 wsh02.vbs
  for  i = 0 to WScript.arguments.count - 1
     WScript.echo WScript.arguments(i)
  next

実行結果を下に示す。

c:\mh\www\wsh>cscript wsh02.js 234 asd
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

234
asd

c:\mh\www\wsh>cscript wsh02.vbs 234 asd
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

234
asd

2.JavaScriptでファイルのコピー

次のプログラムを実行する(wscript wsh03.jsまたはcscript wsh03.js)と、 c:\waves.bat がフォルダ c:\mh にコピーされる。

wsh03.js
  var objShell = new ActiveXObject("shell.application");
  var objFolder = objShell.NameSpace("c:\\mh");
  objFolder.CopyHere("c:\\waves.bat");

CopyHereメソッドにはオプションの指定も可能である ( Folder.CopyHere methodを参照)。

3.JavaScriptでZIPファイルの解凍

JScriptでZIPファイルの解凍が簡単に行える。 次のプログラムを実行すると c:\mharc\_scc3.zip が c:\mharc\_scc3 に展開される。

wsh04.js
  var objShell = new ActiveXObject("shell.application");
  var objFolder = objShell.NameSpace("c:\\mharc\\_scc3");
  var objInput = objShell.NameSpace("c:\\mharc\\_scc3.zip");
  objFolder.CopyHere(objInput.items());

4.VBScriptでZIPファイルに圧縮

ZIPファイルへの圧縮も簡単に行える。 圧縮の場合には、最初に空のZIPファイルを作成しておき、そこにコピーしてゆく。

下にVBScriptで記述したプログラムを示す。 JScriptでも概ね同様のプログラムとなる。

wsh10.vbs
Dim workPath, zipFileName, objFSO, objFile, bs, i, strbuf

zipFileName = "c:\mh\www\wsh\test1.zip"
workPath = "c:\mh\tmp"

bs = Array(80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
For i = 0 To UBound(bs)
  strbuf = strbuf & Chr(bs(i))
Next

'空のZIPファイルを作成
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(zipFileName, 2, True)
objFile.Write(strbuf)
objFile.Close

'フォルダ内のファイルを全てZIPファイルに格納
For Each objFile In objFSO.GetFolder(workPath).Files
   CreateObject("Shell.Application").NameSpace(zipFileName).CopyHere(objFile.path)
   WScript.sleep 3000
Next


[参考資料]
  1. コマンドラインからパラメータを受け取る
  2. Folder.CopyHere method
  3. Easily zip / unzip files using Windows Shell32
  4. JScriptで簡単にZIPを扱う
  5. WSHでzip解凍&圧縮