VBSなんて大嫌い
WindowAgentで、Oracleにユーザの追加・更新・削除を行うためのスクリプトを書く。
最初はRubyでルンルン書いていたのだけれど、やっぱりRubyはFJとしては使えないと言うことで、
仕方なしにbatで書く事に。
とは言え、DOSのbachでは、制御が難しいので、Windows標準ということでVBSで書く事に。
で、色々調べたわけさ。
最初はoraUserMent.vbsを書いて、それをWindowsAgentから起動しようとしたんだが、vbsなんて
知らないと言われた。vbsはWindowsアプリケーションではありませんだと。
で、oraUserMent.vbsをoraUserMent.batの中から呼ぶことに。
ついでに?cscriptからoraUserMent.vbsを起動する。
で、出来たのが以下のファイル。
oraUserMent.vbs
Option Explicit On Error Resume Next Dim mode,user,passwd,role,expired,delflag Dim objWshShell ' WshShell オブジェクト Dim strCmdLine ' 実行するコマンド Dim oExec Dim ret Const Connection = "system/trx850@aaaa.bbbb.oracle" Const UserAddSql = "@useradd.sql" Const UserDelSql = "@userdel.sql" if (WScript.Arguments.Count >= 6) then mode = WScript.Arguments.Item(0) user = WScript.Arguments.Item(1) passwd = WScript.Arguments.Item(2) role = WScript.Arguments.Item(3) expired = WScript.Arguments.Item(4) delflag = WScript.Arguments.Item(5) Set objWshShell = WScript.CreateObject("WScript.Shell") If Err.Number = 0 Then if ( mode = "DEL" ) or ( expired = 1 ) or ( delflag = 1 ) then strCmdLine = "sqlplus -S -L " & Connection & " " & UserDelSql & " " & user else strCmdLine = "sqlplus -S -L " & Connection & " " & UserAddSql & " " & user & " " & passwd & " " & role end if Set oExec = objWshShell.Exec(strCmdLine) Do While oExec.Status = 0 WScript.sleep 10 Loop if oExec.ExitCode <> 0 Then ret = oExec.ExitCode End If Else ret = Err.Number End If Set objWshShell = Nothing else ret = 1 end if Set oExec = Nothing Set objWshShell = Nothing WScript.quit ret
oraUserMent.bat
cd c:\EXGEN\WindowsAgent\Scripts cscript oraUserMent.vbs %1 %2 %3 %4 %5 %6 >> userMent2.log exit /b %errorlevel%
当初は、
cscript c:\EXGEN\WindowsAgent\Scripts\oraUserMent.vbs %1 %2 %3 %4 %5 %6 >> c:\EXGEN\WindowsAgent\Scripts\userMent2.log exit /b %errorlevel%
と書いていたのだが、起動するカレントディレクトリがc:\EXGEN\WindowsAgent\Scripts以外の場合にはsqlplusから戻ってこなくなってしまう現象が発生。
最初は、コマンドラインから起動すると正常に動くのに、WindowsAgentから起動するとハングアップしてしまって、原因不明。またWindowsAgentのバグかぁ?
と思っていたのだが、ちょっと気になって、pwdを変更したらコマンドラインからもハングアップしてしまった。
うーーん、きっと何か理由はあると思うのだが、WScript.execの標準・エラー入出力関係か?
とにかく、最初にcdでスクリプトのあるフォルダに移動してやるとちゃんと動く。
何だかなぁ。
こんなことに1日使っちまったい。(-_-##
そうそう、上のスクリプトで、一番悩んだのは、sqlplusの実行結果をWindowsAgentにまで伝える方法。
sqlplusの実行結果をoExecオブジェクトで受け取り、oExec.ExitCodeの内容をretにコピー。
retの内容を、WScript.quit retとして、oraUserMent.vbsの終了ステータスとして返す。
それが、oraUserMent.batの%errorleve%に格納されるので、oraUserMent.batでは、exit /b %errorlevel%としてWindowAgentに伝える。
ああ、もう面倒臭い!!
sqlplus -> vbs -> bat -> WindowsAgentへの伝言ゲームでした。(T-T;;