Windowsスクリプティングホスト(WSH)


Windows98以降、Windowsスクリプティングホスト(以降WSHと略す)が使用可能となりました。このWSHについて簡単に説明しておきます。スクリプト言語と言いますと、Perlを筆頭に様々なものが存在しますが、Windows系では主に、JAVAスクリプト(Jスクリプト)・VBスクリプトが使われています。元々これらはHTMLファイルのスクリプトタグ中で使われるものとして開発されたものですが、Windows98以降、標準で単独での使用が可能となります。文字や画像を表示するだけのホームページからもうワンランク上を目指すと、スクリプトを使用するケースが多いと思われます。また、VisualBASIC(以降VBと略す)はその手軽さから、Windowsプログラミングの入門としてよく使われています。これらで学んだノウハウがほぼそのまま利用できるのですから、プログラミング言語としてのハードルは比較的低いものと思われます。
ここではVBスクリプトに絞って、簡単なプログラムを作成してみましょう。(VBスクリプトを使用した)WSHとは、簡単に言うと「バッチファイル以上、VB以下」の簡易プログラミング機能をエンドユーザーに提供するものです。拡張子をVBSとしたテキストファイルを作ればそれでOKです。「プログラミング環境」と言わず「プログラミング機能」と表現したのは、特別何かを用意したり、何かの設定をしたりという作業は不要だからです。「実行は?」と言うと、これまた簡単でエクスプローラから作成したファイルをダブルクリックするだけです。作成・実行の手軽さという点に絞って言えば、バッチファイルと同等です。では、何ができるのでしょう?

・ファイル操作
大抵の作業はGUIで事足りるWindows環境で、敢えてバッチファイルを使う用途のトップはファイル操作ではないでしょうか。以下は「copy」,「move」,「del」を実行するプログラムです。ファイル名は適当に変更して試して下さい。
Option Explicit '変数は宣言が必要                                            

Dim FileSystem

Set FileSystem = CreateObject("Scripting.FileSystemObject")
FileSystem.CopyFile "Srcfile","Dstfile"
FileSystem.MoveFile "Srcfile","Dstfile"
FileSystem.DeleteFile "Tgtfile"

・プログラムの実行
Windows(MS-DOSも含む)用のプログラムの実行ができます。OS標準のプログラムでも、フリーウェアでも、自作プログラムでも構いません。以下は「メモ帳」と「ペイント」を起動するプログラムです。
Option Explicit '変数は宣言が必要                                            

Dim WshShell

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run "NOTEPAD.EXE" 'メモ帳の起動
WshShell.Run "MSPAINT.EXE" 'ペイントの起動

・レジストリ操作
。以下は「.TXT」に関連付けられたファイルタイプを取得して表示するプログラムです。安全のため、取得だけを行っていますが、追加・変更・削除も可能です。
Option Explicit '変数は宣言が必要                                            

Dim WshShell
Dim Msg

Set WshShell = CreateObject("WScript.Shell")
On Error Resume Next

Msg = "Registry Error"
Msg = WshShell.RegRead("HKCR\.txt\")
Wscript.Echo Msg

・環境変数の操作
環境変数の取得・設定が可能です。環境変数の設定を各環境に合わせておけば、スクリプトファイルを変更せずに、複数のマシンで共通して使用可能なスクリプトを作成するというようなことが可能になります。以下は、環境変数「PATH」を取得して表示、環境変数「TEST_PATH」に標準のパスに任意の新たなパスを追加して表示するものです。
Option Explicit '変数は宣言が必要                                            

Dim WshShellEnv

Set WshShellEnv = CreateObject("WScript.Shell").Environment("Process")
WScript.Echo WshShellEnv("PATH")

WshShellEnv("TEST_PATH") = WshShellEnv("PATH") + ";C:\USR\TOOL"
WScript.Echo WshShellEnv("TEST_PATH")

・実行順の制御
バッチファイルは本来、キーボードからコマンドを入力する手間を省略しただけのマクロでしたが、機能の拡張によりプログラム的な要素を持たせることが可能になりました。その一例として「for」や「goto」などでの実行順の制御がありますが、これらもVB流の記述で可能となります。これまでは、上から順に実行してゆく例ばかりを示しましたが、以下は「メモ帳」を10個実行する例です(あまり実用的な例ではありませんが...)。
Option Explicit '変数は宣言が必要                                            

Dim WshShell
Dim iCnt

Set WshShell = CreateObject("WScript.Shell")
For iCnt = 1 to 10
WshShell.Run "NOTEPAD.EXE" 'メモ帳の起動
Next

・Windowsスクリプティングホストのバージョンの取得
以下は、Windowsスクリプティングホストのバージョンを取得・表示するものです。今後、機能が拡張されたとしても、バージョンに合わせた制御が可能となります。
Option Explicit '変数は宣言が必要                                            

WScript.Echo Wscript.Name & " Version " & Wscript.Version

・OCXの実行
標準の機能として用意されていなくても、OCXファイルを自作することで、いくらでも拡張が可能となります。以下は、スキャンディスク、デフラグなど時間のかかる処理を実行して、終了したら、パソコンの電源をオフにするというものです(やっと実用的な例が示せました)。
Option Explicit '変数は宣言が必要                                            

Dim WshShell
Dim EW

Set WshShell = CreateObject("WScript.Shell")

'スキャンディスクの実行
WshShell.Run "SCANDSKW/all/n",SW_SHOW,TRUE

'デフラグの実行
WshShell.Run "DEFRAG/all/f/noprompt",SW_SHOW,TRUE

'電源のオフ(自作のOCX)
Set EW = CreateObject("WinBatch.ExitWin") 'Windowsの終了
EW.flag = 5 '電源オフ
Call EW.ExitWin
本題からは逸れますが、私はWinBatchというOCXファイルを作成して、バッチ処理で「あったらいいな」と思った機能を組み込んでいます。上のスクリプトで使用しているのは、Windows終了のAPI、ExitWindowsEx()のラッパーのようなものですが、ソースの一部を紹介しておきます。このように、WindowsAPIのラッパーを作っておけば、ほとんどのAPIはスクリプトから簡単に実行できます。「不可能は無い」と言っても決して過言ではありません。
// ExitWin.cpp : CExitWin のインプリメンテーション
#include "stdafx.h"
#include "WinBatch.h"
#include "ExitWin.h"

/////////////////////////////////////////////////////////////////////////////
// CExitWin


STDMETHODIMP CExitWin::get_flag(long *pVal)
{
    // TODO: この位置にインプリメント用のコードを追加してください
    *pVal = m_flag;
    return S_OK;
}

STDMETHODIMP CExitWin::put_flag(long newVal)
{
    // TODO: この位置にインプリメント用のコードを追加してください
    m_flag = newVal;
    return S_OK;
}

STDMETHODIMP CExitWin::ExitWin()
{
    // TODO: この位置にインプリメント用のコードを追加してください
    ::ExitWindowsEx(m_flag, 0);
    return S_OK;
}

ざっと、簡単な例を交えて説明致しましたが、バッチファイルでできることは一通り可能であること、VBで可能な処理の多くも可能であることはお分かり頂けたと思います。
私の個人的な印象は「結構、イケてる」です。


戻る