- 締切済み
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サーバーの~)は取得できませんでした。 どのようにしたら取得できるようになるでしょうか。 なお、このメールで届く情報はひとつ以上であり、ひとつのメール内に複数の情報が入る場合があります。 もしおわかりになる方がいらっしゃいましたら、ご教示いただきたく存じます。 足りない情報は都度補足いたします。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- prophetok
- ベストアンサー率44% (13/29)
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)
頭の4行しか取得しないようなプログラムになっているんじゃないの? 取得している部分のソースを開示しないと、コメントのしようがないよ。
補足
申し訳ございません。 確かに最初の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