IEのフォームから入力されたデータをバッチに送ります。
バッチとVBS、IEの複合技です。
バッチから起動したVBSでInternetExplorer(インターネットエクスプローラー:以下「IE」と表示)のフォームを表示し入力されたデータをバッチに返します。
通常、バッチでは入力しにくい複数行の文字データや選択入力、ファイル名の取得をIEのフォーム画面を利用して簡易GUI(グラフィカルユーザーインターフェイス:グーイ)のように使ってみます。
フォーム上のデータは javascript で操作可能ですので、入力のチェックなども比較的容易に追加できるでしょう。
通常業務でこんな面倒な入力を伴うバッチ処理が必要かどうか分かりませんが、定型パターンとして知っておくと便利なことがあるかもしれません。
ページトップへ戻る
ファイル名「ie.bat」
@REM
@ECHO OFF
IF NOT "%~9" == "" GOTO MSG
IF "%~1" == "/?" GOTO MSG
IF "%~1" == "/h" GOTO MSG
IF "%~1" == "/help" GOTO MSG
REM 環境変数に改行を含む複数の行を格納するための準備
SETLOCAL ENABLEDELAYEDEXPANSION
REM SETコマンド下の2行の空行は改行文字を設定するための指定の一部です。消してはいけません。
SET LF=^
REM フォームを呼び出すVBSを起動して入力されたフォームのデータを取り込みます。
FOR /F "tokens=1 delims=" %%F IN ('cscript //NoLogo ie.vbs') DO set %%F&ECHO %%F
EXIT /B
:MSG
ECHO このBAT処理は、ie.vbs、form.htmlとあわせて使用します。
ECHO BATからvbsを中継してieのフォームを呼び出し、入力データを取得するサンプルです。
ECHO (このバッチ処理はWindowsXPで動作を確認しました。)
ECHO 使い方
ECHO %~nx0 [/?|/h|/help]
ECHO パラメーター:/?、/h、/help を指定すると、この画面を表示します。
ECHO.
EXIT /B
ページトップへ戻る
ファイル名「ie.vbs」
Option Explicit
Dim objIE ' IE オブジェクト
Dim objFLD ' FILEシステム オブジェクト
Dim chk ' 「OK」の値を記録しておく変数
Dim par(100) ' フォームから読み取るデータを格納する配列変数
Dim CRLF ' 改行文字を格納しておく変数
CRLF = Chr(13) & Chr(10) ' 改行文字の設定
' ieオブジェクトの作成
Set objIE = WScript.CreateObject("InternetExplorer.Application")
If Err.Number = 0 Then
' ieのウインドーサイズと可視化(見える)の設定を行います。
objIE.width = 320 ' 横幅(ピクセル)
objIE.height = 480 ' 縦高(ピクセル)
objIE.Visible = True
' カレントフォルダー(ie.vbsが起動されたフォルダー)の取得
Set objFLD = CreateObject("Scripting.FileSystemObject").GetFolder(".")
' 標準では、カレントフォルダーの「form.html」を表示します。
objIE.Navigate objFLD.Path & "\" & "form.html"
Set objFLD = Nothing
chk = GetOK()
' 「B1」ボタンがクリックされるのを待ちます。
Do While (chk = GetOK()) : WScript.sleep (200) : Loop
Else
' ieオブジェクトの作成に失敗した時のエラー処理
WScript.Echo "エラー:" & Err.Description
WScript.Quit
End If
' ここからフォームに入力されたデータを取り出して、バッチ処理に送信します。
' objIE.document.frm.項目名.value でデータを取り出します。
' 項目名は name="項目名" で指定した名前です。
' iRepExG関数では、textarea から入力された複数行の文字データ中にある改行文字を「!LF!」に変換します。
par(0) = "v[1]=" & objIE.document.frm.txt.value
par(0) = iRepExG (par(0), CRLF, "!LF!") ' CRLF(改行)を「!LF!」に変換(バッチ側で改行文字に再変換されます。)
par(1) = "v[2]=" & objIE.document.frm.sel.value
par(2) = "v[3]=" & Chr(34) & objIE.document.frm.fil.value & Chr(34) ' Chr(34) ->「"」を表します。
WScript.echo par(0) ' par(0)をバッチ処理へ送信
WScript.echo par(1) ' par(1)をバッチ処理へ送信
WScript.echo par(2) ' par(2)をバッチ処理へ送信
' ここまででデータの入力とバッチへの送信処理は終わりです。
objIE.Quit
Set objIE = Nothing
WScript.Quit
'================================================================================
' 項目名「OK」の値を取得する関数
' 項目「OK」は「B1」ボタンがクリックされるたびに、
' フォーム内のjavascriput「add_one」関数で1ずつ
' カウントアップされていきます。
' この「OK」の値が変化していれば「B1」ボタンが
' クリックされたことが分かります。
Function GetOK()
Dim lngNum ' 項目OKに格納されている数字を取り出す変数
On Error Resume Next
lngNum = objIE.document.ok_button.ok.value
On Error Goto 0
GetOK = lngNum
End Function
' 原稿文字列を正規文字列で検索し、一致する文字をすべて置換文字列に置き換えます。
' regSource : 原稿文字列
' regPattern : 正規文字列
' regTarget : 置換文字列
Function iRepExG ( regSource, regPattern, regTarget )
Dim regExpression, Matches ' 変数を作成します。
Set regExpression = New RegExp ' 正規表現を作成します。
regExpression.Pattern = regPattern ' パターンを設定します。
regExpression.IgnoreCase = True ' 大文字と小文字を区別しないように設定します。
regExpression.Global = True ' 見つかったすべての文字列を置換するように設定します。
iRepExG = regExpression.Replace(regSource , regTarget) ' 置換を実行します。
End Function
ページトップへ戻る
ファイル名「form.html」
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS;">
<title>
</title>
<script type='text/javascript' language='JavaScript'>
<!--
function add_one() {
document.ok_button.ok.value += 1;
}
//-->
</script>
</head>
<body>
<form name="frm">
<!-- ここからデータ入力用の項目を設定します。 -->
テキスト:<textarea name="txt" cols="32" rows="6">文章を入力します。</textarea><br>
選択入力:<select name="sel">
<option value="" selected>下から選んでください</option>
<option value="apple">りんご</option>
<option value="orange">みかん</option>
<option value="grape">ぶどう</option>
</select><br>
ファイル:<input type="file" name="fil" value="ファイルを選んでください。"><br>
<!-- ここまでにデータ入力用の項目を設定します。 -->
</form>
<form name="ok_button">
<input type="button" name="B1" value="OK" onclick="add_one();">
<input type="hidden" name="ok" value="0">
</form>
</body>
</html>
ページトップへ戻る