ハードなソフトの話

アクセスカウンタ

zoom RSS バッチファイルからVBScriptをつまみ食いする

<<   作成日時 : 2010/07/18 22:13   >>

ガッツ(がんばれ!) ブログ気持玉 2 / トラックバック 0 / コメント 0

問題点:

バッチファイルは簡単に書けるが低機能である。そこで、バッチファイルから、VBScriptを呼び出して機能を補完する記事をよく見かける。しかし、そのたびに、小さなスクリプトファイルを作ると最終的に小さなスクリプトファイルの山になる。これはスクリプトの整理に困るし、ディスクの無駄である。それならば、VBScriptの機能を簡単にバッチファイルから呼び出すことができるコマンドを作ればいい。

このコマンドをVBI.VBSとして開発した。ソースファイルはこの記事の最後に載せてある。

使用例:

たとえば、バッチファイルの中でVBScriptのWScript.Sleepを使いたいとき、次のように記述する。

VBI “WScript.sleep 1000”

曜日別に実行するバッチファイルを切り替えたいときは、次のように記述する。

vbi "WScript.quit(weekday(now()))"
if errorlevel 1 call sunday
if errorlevel 2 call monday
. . .
if errorlevel 7 call saturday

ダブルクォートはコマンドラインで使うのは難しいので代わりにシングルクォートを使う。

たとえば、Helloと表示したいなら、次のようにする

VBI “wsh.echo ‘Hello’”

ただし、これだと面倒なので、標準出力に文字列を出力する say という関数も用意した。

VBI “say ‘Hello’”

エラー出力したいときのために warn という関数も用意した。

VBI “warn ‘Hello’”

ちょっと複雑だけど、次のようにすれば inputboxを使って環境変数に値を渡すことができる

@echo off
setlocal

call :inputbox ans "データを入力してください"
if "%ans%"=="" (
    cscript //nologo vbi.vbs "msgbox 'キャンセルされました'"
) else (
    cscript //nologo vbi.vbs "msgbox '%ans% が入力されました'"
)

endlocal
goto :eof

:inputbox
set %1=
for /f %%f in ( 'vbi "say inputbox('%2') "') do set %1=%%f
goto :eof

/include オプションを使えば、自分で作った関するも使える。たとえば、iif関数を組み込みたいとき、次のようなiif.vbsを用意し

function iif(x,t,f)
    if x then iif = t else iif = f
end function

VBIコマンドで指定する

VBI /include:iif.vbs "say iif( 1=1 , 'yes','no')"
VBI /include:iif.vbs "say iif( 1<>1 , 'yes','no')"

VBI.vbsのソース

こんな感じになる

Option Explicit

dim fs  : set fs   = CreateObject("Scripting.FileSystemObject")
dim fin : set fin  = WScript.stdin
dim fout: set fout = WScript.stdout
dim ferr: set ferr = WScript.stderr

dim vbi_optinclude: vbi_optinclude = "/include:"
dim vbi_mode: vbi_mode = ""
dim vbi_arg,vbi_include
for each vbi_arg in WScript.Arguments
    if left(vbi_arg,1) = "/" Then
        if left(vbi_arg,len(vbi_optinclude)) = vbi_optinclude then
            dim vbi_pos    : vbi_pos = instr(vbi_arg,":")+1
            dim vbi_incfile: vbi_incfile = mid(vbi_arg,vbi_pos)
            dim vbi_ts     : set vbi_ts = fs.opentextfile( vbi_incfile )
            vbi_include = vbi_include & vbCrLf & vbi_ts.readall
            vbi_ts.close
            vbi_include = vbi_include & vbCrLf
        elseif vbi_arg = "/debug" then
            vbi_mode= vbi_arg
        end if
    else
        vbi_exec vbi_parse(vbi_include & vbi_arg),vbi_mode
    end if
Next

function gets
    gets=fin.readline
end function

function getall
    getall= fin.readll
end function

function warn(s)
    ferr.writeline s
    warn = s
end function

function say(s)
    fout.writeline s
    say = s
end function

function vbi_parse(x)
    vbi_parse = replace(x,chr(&h27),chr(&h22))
end function

function vbi_exec(x,mode)
    if mode = "/debug" then
        dim sDebug: sDebug = x
        sDebug = replace(sDebug,vbCrLf,vbCrlf & "debug: ") 
        warn sDebug
    end if
    vbi_exec = execute(x)
end function

スクリプトをコマンドとして実行するには CSCRIPT を次のように実行し、VBI.VBSをPATHに含まれる適切なフォルダにコピーする必要がある。

cscript //nologo //H:CScript //S //i

あとがき:

いい加減、Windows Power Shell に移行したい気持ちもあるが、未だにWindows 2000/XP/Vistaをわたり歩く人生を歩んでいるのでそうもいかない。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ
気持玉数 : 2
ガッツ(がんばれ!) ガッツ(がんばれ!)

トラックバック(0件)

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

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
バッチファイルからVBScriptをつまみ食いする ハードなソフトの話/BIGLOBEウェブリブログ
文字サイズ:       閉じる