ハードなソフトの話

アクセスカウンタ

zoom RSS VBScriptの実行時にWScriptからCScriptへ自動的に切り替える

<<   作成日時 : 2009/08/06 14:40   >>

なるほど(納得、参考になった、ヘー) ブログ気持玉 2 / トラックバック 0 / コメント 0

CScript専用のスクリプトがある場合、ほとんどは、スクリプトの先頭に次のようなコードを挿入してユーザーに注意し、CScriptを使うようにユーザーに指示する。
if not lcase(right(WScript.Fullname,11)) = "cscript.exe" then
    msgbox "このプログラムはCScriptで実行してください"
end if

しかし、これは不便である。仮にユーザーの環境が固定されていて常にCScriptでいい場合、次のコマンドを入力することになっている。
cscript //h:cscript

この場合、エクスプローラからスクリプトファイルを実行するとコマンドウィンドウが消えてしまい。実行結果が確認できない。
そんなわけで、次のようにスクリプト(WCSwitch.vbs)を作成した。
option explicit

class WCSwitch
    private m_ws, m_env, m_EnvVarName, m_IsCScript 

    private sub Class_Initialize()
        set m_ws = CreateObject("WScript.Shell")
        set m_env = m_ws.environment("Volatile")
        m_IsCscript = lcase(right(WScript.Fullname,11)) = "cscript.exe"
        dim vName
        vName = WScript.ScriptFullName
        vName = replace(vName,"\","_")
        vName = replace(vName,":","_")
        m_EnvVarName = vName
        if not m_IsCscript then spawn
    end sub

    private sub Class_Terminate()
        if m_IsCScript and len(m_env(m_EnvVarName)) > 0 then
            msgbox "終了しました",vbOKOnly,"CScriptからの通知"
            m_env.remove(m_EnvVarName)
        end if
    end sub

    private sub spawn
        const DQ = """", HDQ = "^"""

        dim oExec,sCmdline
        sCmdline = "cmd /C " & DQ & _
            "start cscript //nologo " & _
            HDQ & WScript.ScriptFullName & HDQ &  DQ
        m_env(m_EnvVarName)="1"
        set oExec = m_ws.Exec(sCmdLine)
        do while oExec.status = 0
            wscript.sleep 100
        loop
        wscript.quit
    end sub

end class

dim wcs: set wcs = new WCSwitch
WScript.echo "コマンドプロンプトからこんにちは!"

エクスプローラからWCSwitch.vbsをダブルクリックすると動作がわかりやすい。
こんな感じになる…
画像

すぐにウィンドウが消えてしまうときは、次のコマンドを実行してからもう一度WCSwitch.vbsをダブルクリックしてみよう。
cscript //h:wscript

このスクリプトは次のような動作をする。
  • cscriptで実行されたときコマンドウィンドウにメッセージを表示して終了する
  • wscriptで実行されたとき、コマンドウィンドウを開いて、その中にメッセージを表示し「終了しました」メッセージボックスを表示する

これでエクスプローラからダブルクリックしてもCScriptで出力し、コマンドウィンドウのメッセージを確認することができる。
WSFならWCSwitchのインクルードしてプログラムの先頭でオブジェクトを生成するだけで簡単に組み込みことができる。
なお、このクラスモジュールではボラティル環境変数を使っている。詳しくは以下の記事が参考になるかもしれない。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ
気持玉数 : 2
なるほど(納得、参考になった、ヘー)
ナイス

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
VBScriptの実行時にWScriptからCScriptへ自動的に切り替える ハードなソフトの話/BIGLOBEウェブリブログ
文字サイズ:       閉じる