- - PR -
開始行から終了行の文字列を抜き出す
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-12-12 02:36
宜しく御願いします。
サーバのバックアップ作業で、フルバックアップ時のログと通常バックアップ時のログの文字列を抜き出す作業を手動で実施しており、それをVBSで出来るか模索中です。 (プログラムに関しては全くの初心者です・・・) ログの開始行から終了行までの間を抜き出せるように、Webを参照しながら作成してみました。 Const ForReading = 1 Const ForWriting = 2 Set objFSo = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("Reading.log", ForReading) strContents = objFile.ReadAll objFile.Close arrLines = Split(strContents, vbCrLf) Set objFile = objFSO.OpenTextFile("Writing.txt", ForWriting, True) For i = 0 to UBound(arrLines) intMatch = InStr(arrLines(i), "検索する文字を指定") If intMatch > 0 Then objFile.WriteLine arrLines(i-1) objFile.WriteLine arrLines(i) End If Next objFile.Close MsgBox "処理終了" 上記のスクリプトだと開始行と終了行しか取れず、その間の行が全く取得できない事がわかりました・・・ また、フルバックアップと標準バックアップのどちらかを選択出来るように条件分岐をさせたいのですが、上記のスクリプトと掛け合わせる事が出来ません・・・ VB関係に詳しい人間が周りにいない為、途方にくれており非常に困っております。 私事で申し訳ないのですが、どなたかご教授頂けないでしょうか・・・? | ||||||||||||||||
|
投稿日時: 2007-12-12 10:12
単に条件にマッチしていなかっただけではないでしょうか。 同じ行を複数回検索しないようですから。 と考えると 1 行がやたらと長い数行程度の log ファイルだったりしますか?
手動で良いのであれば MsgBox 関数。 それがダメならばコマンドライン引数が利用できるのではないでしょうか。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2007-12-12 10:15
私はいつも(ReadAllでは無く)ReadLineを使っています。
| ||||||||||||||||
|
投稿日時: 2007-12-12 10:50
↑単に開始行と終了行以外は、その検索文字列が入っていないだけかと。 例えば検索文字列に『バックアップジョブ』とあっても、ジョブの開始と終了で 『バックアップジョブの開始』・『バックアップジョブは終了コード??で終了 しました。』となっており、途中のログはジョブIDでロギングされているタイプ では無いかと推測します。
上記のParam.txtにはDOSのバッチか何かで、検索文字列(一行目に検索開始文字列を 二行目に検索終了文字列を)書き込んで下さい。 | ||||||||||||||||
|
投稿日時: 2007-12-13 03:16
上総さん、こあらさん、じゃんぬねっとさん、ご返答有難う御座いました。
じゃんぬねっとさん 文字がマッチングしていない、文字の超過に関しては問題ありませんでした。 こあらさん コピーペーストをして、拡張子をvbsに変換して使用したのですが、うまくいきませんでした。 上総さん バックアップログの中身を以下に記します。 ・「○○バックアップ_YYYYMMDD.log」を作成します。 ・バックアップを開始します。 ←開始行(開始文字列) ・YYYYMMDDにスタートしました。 中略 ・YYYYMMDDに終了しました。 ←終了行(終了文字列) ・「○○バックアップ_YYYYMMDD.log」はC:\aaa\bbb\cccに保存しました。 上総さんが書いて下さったコードを、vbsの中に貼り付け、param.txtをbatに変換して開始行から終了行の「・YYYYMMDDにスタートしました。」と「中略」をコピーペーストしたのですが、うまくいきませんでした・・・ 例えば、以下のようなスクリプトを作成する事は可能でしょうか? ・フルバックアップのログを取得 -[1] ・標準バックアップのログを取得 -[2] [1]の場合 ・ファイルパスを指定 ・開始行を指定 ・終了行を指定 ※開始行から終了行までの間の行も取得出来る様に設定 ・抜き出した文字を新たにテキストを作成 (テキスト名:フルバックアップ_YYYYMMDD_抜き出し.log) ・別フォルダのパスを指定し、テキストを保存する。 [2]の場合 [1]と同じ ※テキスト名や抜き出す文字に変動あり 文章がすごくわかりにくくてすみません。今回ばかりは自分の力で解決が困難なので、宜しく御願いします・・・ | ||||||||||||||||
|
投稿日時: 2007-12-13 09:39
上記は、ファイルへの出力箇所のソースコードの抜粋ですが、 この内容と以下の説明には矛盾があるように思います。
この説明を文字通り捉えると、ファイルがN行で構成されているとして 開始行=1行目、終了行=N行目ですから、配列arrLinesのインデックスでいうと 0行目と(N-1)行目のみが取れたということになります。 しかし、開始行(i=0)でマッチすると
が実行されるはずなので、配列の範囲外のアクセスでエラーになるはずです。 仮に開始行と終了行の2行しかなく、かつ、終了行だけがマッチした場合、 開始行と終了行の2行が取れます。 つまり、ソースコードとその実行結果の説明に矛盾がないとすれば、 ログは開始行と終了行の2行しかなく、マッチしたのは終了行だけということになるのではないでしょうか。 この辺から確認して欲しいところとしては以下のようなところかなと思います。 ・改行コードは間違いなくCR+LFか? →改行コードが違えば、Split関数の処理で期待しない結果になっているでしょう。 ・文字コードはShift-JISか? →文字コードが違えば、マッチすると期待されるものでもマッチするとは言えない。 ・じゃんぬねっとさんのコメントに対するレス 「文字がマッチングしていない、文字の超過に関しては問題ありませんでした。 」 はどのように確認したか? →確認方法に問題がないか、確認した方法を記載した方がよい。 ・ソースコードの途中にMsgBoxを使った行を差し込んでデバッグしてみる →例えば、
のような感じで処理で重要そうな変数が自分の期待通りの値になっているかを 確認しましょう。 | ||||||||||||||||
|
投稿日時: 2007-12-13 10:24
バルサンさん、すいません提示しているソースにミスがあった為、修正後のソースを
再掲します。
修正点 ・ファイルモードが反転していた為修正 ・開始文字列検出後のループ内での処理を修正 (開始文字列検出後、終了文字列検出までを書き込むように修正) ・WriteLine関数の使用方法に誤りがあった為修正 テストで使用したデータも掲載します。 Param.txtの中身
Reading.logの中身
Writing.txtの中身
取りあえずログの抽出はこれでよいかと思います。 [ メッセージ編集済み 編集者: 上総 編集日時 2007-12-13 10:25 ] | ||||||||||||||||
|
投稿日時: 2007-12-13 10:44
激しく勘違いしていたようですorz
(上総さんの投稿を見て、やっと理解しました。)
の指摘はポイントがずれてますので、 無視してください。 |
1|2|3
次のページへ»