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;;