• 締切済み

VBSで繰り返し情報の取得

BASP21で受信したメールを整形してデータベースへ取り込もうと考えています。 最初の情報は取り込むことができたのですが、次の情報を取り込むことができません。 どのようにしたらよいでしょうか。 届くメールの内容は以下のようになっています。 ---------------- From: メールサーバー To: 監視サーバー Subject: =監視状況 This is a multi-part message in MIME format. Content-Type: text/plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit 123サーバーのCPU使用率が10%上昇しました。 プロセス: ABCDaemon 日時: 2009/06/22 09:05:55 状況: 影響なし。 --------------------------------------------------- 345サーバーのCPU使用率が40%上昇しました。 プロセス:ServD 日時: 2009/06/22 09:05:55 状況: プロセスダウンしました。 ------hogehoge@smtp.hoge.co.jp-- このメールのサブジェクトやアドレス、メール本文の最初の情報(ここでは、123サーバーの~という4行です)は取得できました。 しかし、次の情報の(345サーバーの~)は取得できませんでした。 どのようにしたら取得できるようになるでしょうか。 なお、このメールで届く情報はひとつ以上であり、ひとつのメール内に複数の情報が入る場合があります。 もしおわかりになる方がいらっしゃいましたら、ご教示いただきたく存じます。 足りない情報は都度補足いたします。 よろしくお願いします。

みんなの回答

  • prophetok
  • ベストアンサー率44% (13/29)
回答No.2

VBはほとんど経験がないので、的外れかもしれませんが・・ RegExExec  とはパターンマッチングのプロシージャですか? 返値にマッチした箇所の数を返すのであれば(これが違っていたら以下は全くの嘘) 下記のコードで、質問の例の場合2 or 6を返しますよね。      If RegExExec(strMAIL_DATA," (.+)サーバーの(.+)使用率が(.+)上昇しました。",aryMATCH) > 0 Then       strSRV = aryMATCH(0)       strUSE = aryMATCH(1)       strRATE = aryMATCH(2)      End If VBの構文はまったく覚えていないので、javaっぽく書きます。 VBの構文に置き換えて試してみてください。 int match_no = RegExExec(strMAIL_DATA," (.+)サーバーの(.+)使用率が(.+)上昇しました。",aryMATCH); if( match_no > 0 ) { match_no/=3;//質問の例で6を返す場合、2なら不要 for( int i = 0; i < match_no; i++) { strSRV[i] = aryMATCH[i*3]; strUSE[i] = aryMATCH[i*3+1); strRATE[i] = aryMATCH[i*3+2]; } } 他の、マッチング処理部分も同様。 後はDB書き込みの部分も配列に対応させる。

  • prophetok
  • ベストアンサー率44% (13/29)
回答No.1

頭の4行しか取得しないようなプログラムになっているんじゃないの? 取得している部分のソースを開示しないと、コメントのしようがないよ。

kumoi828
質問者

補足

申し訳ございません。 確かに最初の4行しか取れないプログラムであるというのは理解しています。 最初の4行の情報取得後、連続して繰り返し4行ずつ取得してデータベースへ情報を取り込む方法がわかりません。 取り込む部分のソースを記載しますので、ご確認お願いします。 Sub MailProc(strMAIL_FILEin) Dim aryMAIL_DATA Dim strMAIL_DATA Dim aryMATCH Dim strRECVDATE Dim strRECVTIME Dim strFROMADDR Dim strDATA_TYPE Dim strTYPE Dim strDATE Dim strTIME Dim strSENTSERVER Dim strSRV Dim strUSE Dim strRATE Dim strPROCESS Dim strPSTATUS Dim strRSTATUS Dim intPSTATUS Dim intRSTATUS Dim strTMPSTATUS Dim strEXCLUDE Dim intEXCLUDE aryMAIL_DATA = objBASP.ReadMail(strMAIL_FILEin, _ "date:from:subject:",">" & ATTACH_DIR) If IsArray(aryMAIL_DATA) Then  strTYPE = ""  For each strMAIL_DATA in aryMAIL_DATA   ' 各データの種別(From:、To:、Bodyなど)   RegExExec strMAIL_DATA,"^([^\s]+:)",aryMATCH   strDATA_TYPE = aryMATCH(0)   Select Case strDATA_TYPE    ' 日付    Case "Date:"     If RegExExec(strMAIL_DATA,"^Date: ([^\s]+) ([^\s]+)",aryMATCH) > 0 Then      strRECVDATE = aryMATCH(0)      strRECVTIME = aryMATCH(1)     End If    ' 送信元メールアドレス    Case "From:"     If RegExExec(strMAIL_DATA,"^From: ([^\s]+)@.+",aryMATCH) > 0 Then      strSENTSERVER = aryMATCH(0)     End If    ' メールタイトル    Case "Subject:"     If RegExExec(strMAIL_DATA,"^Subject: (警告|標準).+",aryMATCH) > 0 Then      strTYPE = aryMATCH(0)     End If    ' メール本文の処理    Case "Body:"     If strTYPE = "警告" Then      If RegExExec(strMAIL_DATA," (.+)サーバーの(.+)使用率が(.+)上昇しました。",aryMATCH) > 0 Then       strSRV = aryMATCH(0)       strUSE = aryMATCH(1)       strRATE = aryMATCH(2)      End If      ' 確認対象外のプロセスを判断      If RegExExec(strMAIL_DATA,"プロセス:(.+)",aryMATCH) > 0 Then       strPROCESS = aryMATCH(0)       strEXCLUDE = "-"       intEXCLUDE = 0       If InStr(1,strPCFILE,"testd", 1) > 0 Then        strEXCLUDE = "対象外"        intEXCLUDE = 1       End If      End If      If RegExExec(strMAIL_DATA,"日時:\s*(\d+\/\d+\/\d+) (\d+:\d+:\d+)",aryMATCH) > 0 Then       strDATE = aryMATCH(0)       strTIME = aryMATCH(1)      End If      If RegExExec(strMAIL_DATA,"処理:\s*(.+)\r\n",aryMATCH) > 0 Then       'strPSTATUS = "-"       'intPSTATUS = 0       strTMPSTATUS = aryMATCH(0)       If strTMPSTATUS = "影響なし。" Then        strPSTATUS = "影響なし。"        intPSTATUS = 1       End If       If InStr(1,strTMPSTATUS,"プロセスダウンしました。", 1) > 0 Then        strPSTATUS = "プロセスダウン"        intPSTATUS = 2        strRSTATUS = "再ロード失敗"        intRSTATUS = 2       End If       If InStr(1,strTMPSTATUS,"プロセス再ロードしました", 1) > 0 Then        strPSTATUS = "プロセスダウン"        intPSTATUS = 2        strRSTATUS = "最ロード成功"        intRSTATUS = 1       End If      End If    Case Else   End Select  Next  ' 検出結果の出力  If strTYPE <> "" Then    WScript.Echo strSENTSERVER & vbTab & Mid(strRECVDATE,1,4) & vbTab & Mid(strRECVDATE,6,2) & vbTab & Mid(strRECVDATE,9,2) & vbTab & strRECVTIME & vbTab & strSRV & vbTab & strUSE & vbTab & strRATE & vbTab & strPROCESS & vbTab & strDATE & " " & strTIME & vbTab & strPSTATUS & vbTab & strRSTATUS & vbTab & vbTab & strEXCLUDE & vbTab & strTYPE  End If End if End Sub

関連するQ&A