リスト1●ping実行プログラムのソースコード(VBScript)
リスト1●ping実行プログラムのソースコード(VBScript)
[画像のクリックで拡大表示]
図1●リスト1を実行したところ
図1●リスト1を実行したところ
[画像のクリックで拡大表示]
レシピ
■WSH(Windows Script Host)が使える環境(Internet Explorer 5.0以降がインストールされていること)
■pingプログラム(Windowsに標準で装備されているものを利用)

 最初に触ったパソコンがWindowsマシンという世代の人は,コマンドラインの操作に慣れていないようです。じゃあどうするか。簡単なことです。使いにくいなら使いやすくしちゃえばいいんです。コマンドライン・プログラムをウインドウ・プログラムにしちゃいましょう。

 今回ご紹介するアイデアは,文字だけのコンソール・プログラムに“ガワ”を付けて「ウィンドウ・プログラムに見せてしまえ」というものです。

pingを使えば
ネット上の端末を調べられる

 Windowsに標準でインストールされているコマンドラインのプログラムの中で今回はping.exe(以下ping)を素材に使います。pingはネットワーク上の指定された端末(ルーターなども含む)に対して,パケットというデータの塊を投げるプログラムです。その返事によって,指定した端末が動作しているのか,通信の途中でパケットが欠落(パケット・ロス)していないかといったことを確認できます。TCP/IPで接続している端末ならば,ほとんどの場合,pingに対して返答が返ってきます。

 試しにWindows標準のpingプログラムを動かしてみましょう。スタート・メニューから([すべてのプログラム]→)[アクセサリ] → [コマンドプロンプト] (Windows 98/MeではDOSプロンプト)でコマンドプロンプトのウィンドウを開き,次のようにタイプしてEnterしてみてください。

ping 127.0.0.1

結果は英文のテキストでプロンプト内に表示されます。

 127.0.0.1というのは現在使っているパソコンそのものを示すIPアドレスです。ネットワーク上につながった別のパソコンがある場合,pingの後にそのパソコンのIPアドレスを入力すれば,そのパソコンからの反応を見ることができます。また,「ping nikkeibp.co.jp」のようにドメイン名でpingを発行することもできます。

HTAを使うとWSHでも
フォームを作れる

 さて,今回作成するプログラムについて説明しましょう。開発言語はWSH,具体的にはVBScriptです。ただし前回までのように「test.vbs」といったファイルではなく,「ping.hta」という名前で作成して保存します。

 拡張子「.hta」というのは「HTMLアプリケーション(HTA:HTML Applications)」と呼ばれる技術で,ファイルのアイコンをダブルクリックすると,ツールバーやアドレスバーのないInternet Explorer(IE)のウィンドウとして起動します。コードの部分はVBScriptですが,レイアウトや入力フォームにHTMLを使っています。WSHでは,入力はInputBox,出力はMsgBox程度しか使えず,ちょっとさびしいですよね。そこで<form>タグなどの各種コントロールを備えたHTMLのフォーム技術を使おうというのがHTAの考え方です。

標準出力をすべて変数に代入

 ではコードを見てください(リスト1[拡大表示])。後半の<script>タグの部分にVBScriptによるスクリプトがあることがわかると思います。

<html><head>
<title>サンプル・プログラム</title></head>
<body>
<form name="form1">
    <p>IPアドレスまたはサーバー名 
    <input type="text" name="ipaddr" value="127.0.0.1" /></p>
    <p>リクエスト・データ送信回数 
    <input type="radio" name="rd" />1
    <input type="radio" name="rd" checked />2
    <input type="radio" name="rd" />3
      
    送信パケットサイズ 
    <select name="pacsize">
    <option value="16">16
    <option value="32">32
    <option value="64">64
    </select> bytes
    </p>
    <p><input type="button" value="ping 実行"
        onClick="go_ping()" /></p>
    <textarea name="kekka" cols="80" rows="30"></textarea>
    <p><input type="reset" value="入力内容の初期化"></p>
</form>
<script language="VBScript">
    Dim WshShell, oExec
    Set WshShell = CreateObject("WScript.Shell")

    Sub go_ping()
        For i = 0 To document.form1.rd.length - 1
            if document.form1.rd(i).checked then
                loops = i + 1
            end if
        Next
        pacsize = document.form1.pacsize.value
        exCommand = "ping" & " " & document.form1.ipaddr.value
        exCommand = exCommand & " " & "-n" & " " & loops
        exCommand = exCommand & " " & "-l" & " " & pacsize
        Set oExec = WshShell.Exec(exCommand)
        R = oExec.Stdout.ReadAll
        document.form1.kekka.value = R
    End Sub
</script>
</body></html>

 まずは(1)の部分に注目してください。ボタンをクリックすると go_ping( ) というSubプロシジャを呼び出します。このプロシジャが今回のプログラムのすべてで,HTMLのフォーム上にある各コントロールの状態や,入力されている文字列をもらってきます。コントロールをVBScriptから参照するには,(3)のように「document.フォーム名.コントロール名.プロパティ」と記述します。

 pingプログラムを実行するには,(2)のようにWScript.Shellというオブジェクト(サンプルではWshShellと命名)が必要です。(4)のように「Set オブジェクト名 = WshShell.Exec("実行ファイル名")」とすると指定された実行ファイルを実行します。

 オブジェクト名の部分はリスト1ではoExec,実行ファイル名の部分がexCommandという変数になっていますが,これはpingのオプションをフォーム上の各コントロールの設定で組み立て直しているためです。生成されるexCommandは「ping -n 3 -l 32」 のような文字列になります。

 次が今回最大のポイントです。コマンドライン・プログラムが吐き出した実行結果は,(5)の「文字列変数 = oExec.Stdout.ReadAll」の行で文字列として取得します。リスト1では,Rという変数で受け取って,それをフォーム上の<textarea>タグに表示させています。Stdoutというのは標準出力を指しています。つまりコマンドプロンプトの画面そのものと考えてください。コマンドプロンプトへの出力内容(のデータ)を,ReadAllというメソッドで,スクリプトが奪い取ったわけです。

 では,リスト1のコードをメモ帳などのテキスト・エディタで入力し,ping.htaのような名前で保存したらダブルクリックして実行してみてください。図1[拡大表示]のような画面が表示されるはずです。値を設定して「ping 実行」ボタンをクリックしてみましょう。pingはコマンドライン・プログラムなので,起動時にしばらくコマンドプロンプトが画面上に出てきますが,処理が終わると勝手に閉じます。どうです?それっぽいウィンドウ・プログラムになったでしょ?