vbscript初心者です。ご教授頂けますと幸いです。

ネットワーク監視ログが毎朝出力され、そのログの中身を、各サーバにログインし手作業で確認を行っています。
この作業を、VBscriptで行いたいと思っているのですが、どうもうまくいかず困っています。

正常時のログには必ず「1,2」と文字列が出力されます。
この文字列を検索対象にして、「1,2」の記述があれば、新規の結果確認ログに「ネットワークは正常です」とコメントを付けて、ファイルを出力し、

「1,2」が見つからなかった場合は、そのログファイルの3行目のみを、新規の結果ログファイルに抽出する、VBscriptを作成したいと思っています。

異常時のログファイルには、異常を知らせるコメントが3行記述されてます。必要な行は、3行目だけなので、3行目を結果ログとして出力したい。

以下、構文ですがVB初心者であり、色々なサイトを見て作ってみましたが全然動かず今回、ここに投稿しました。

'検索対象のテキストファイルのオープン
Set WshShell = WScript.CreateObject("WScript.Shell")
Set objFs = CreateObject("Scripting.FileSystemObject")
Set objFs = Fs.OpenTextFile(NlbTmp)

If Instr(A,"1,2") > 0 Then
MsgBox "ネットワークは正常です"
Else

”異常の場合の条件分岐が分からず・・・”


Set oText = CreateObject("Scriptting.FileSystemObject").CreateTextFile( 結果ログ.log, True )

str = Fs.ReadLine
Fs.WriteLine(str)
End If


自分で作成するのが初めてな物で本当によろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

1.変数の誤用を避けるため、最初にOption Explicit文を置きます。


 この文があると、変数を事前定義せずに使うとエラーになります。
 この文が無いと変数名を間違えてもエラーにならないので、誤動作
 する可能性が高くなります。
2.Set WshShell = WScript.CreateObject("WScript.Shell") ?
 使わないオブジェクトは作らないようにします。
3.ファイルアクセスオブジェクト
 Dim objFs
 Set objFs = CreateObject("Scripting.FileSystemObject")
4.入力ファイルオブジェクト
 Dim inFle
 Set inFile = objFs.OpenTextFile("C:\~", 1) '1は入力モード
5.出力ファイルオブジェクト
 Dim outFile
 Set outFile = objFs.CreateTextFile("C:\~", True) 'Trueは上書き可
6.テキストの読み込み
 Dim text
 text = inFile.ReadLine() '1行分の読み込み
7.テキスト内に"1,2"があるかを調べる
 掲題のようにInStrでも良いし、RegExpを使っても良いでしょう。
 http://msdn.microsoft.com/ja-jp/library/cc392403 …
8.条件分岐
 If InStr(text, "1,2") > 0 Then
    WScript.Echo "ネットワークは正常です"
 Else
    '3行目をtextに読み込む
    outFile.WriteLine text '改行付きで書き込む
 End If
 '終了

この回答への補足

nda23さん

ご返信遅くなりすみません。

ご回答頂いた情報を元に作成してみます。
結果ご連絡させて頂きます。

補足日時:2009/05/22 15:08
    • good
    • 0
この回答へのお礼

nda23さん

ご連絡遅くなりすみませんでした。
無事、解決できました。
今後ともよろしくお願いいたします。

お礼日時:2009/05/25 13:19

小生もvbscript初心者ですので、


答えられるかどうかは分かりませんが。
補足要求です。

>ネットワーク監視ログが毎朝出力され、そのログの中身を、各サーバにログインし手作業で確認を行っています。
ログインもVBscriptで行う?

>正常時のログには必ず「1,2」と文字列が出力されます。
正常時のログファイルと異常時のログファイルは同じもの?
また特定の文字列(1,2)は何行目?
正常、異常に関わらず、データは3行固定なのでしょうか?


作成したコード全体の開示はできますか?
vbscriptは開発環境初が貧弱ですので、読み込みや書き込み、比較などを分解して、
それぞれコーディングする方が理解しやすいと思います。
それぞれ上手く動作したら組み合わせる訳です。

二度手間かも知れませんが、まとめてコーディングすると、
どこで間違えているか分かりません。

この回答への補足

kiki_sさん

ご返信遅くなりすみません。情報が不足でした。。

ログインは、VBscriptでは行いません。
ログファイルが対象SVからFTPで転送されてきます。

正常時と異常時のログの中身は別になります。
【正常時のログ】
WLBS クラスタ制御ユーティリティ
クラスタ 192.168.100.10
ホスト 1 はクラスタに参加してから 1 回、収束状態に入りました。
前回の収束が完了したのは大体次のとおりです: 2009/05/21 14:21:12
ホスト 1 はクラスタの一部として次のホストを既定値で収束しました:
1, 2

【異常時のログ】
WLBS クラスタ制御ユーティリティ
クラスタ 192.168.100.10
ホスト 1 は停止していてクラスタの収束状態を取得できません

以上がログの中身です。異常時のログは、ほぼ全て固定で出力されます。

補足日時:2009/05/22 15:01
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

QWSH.Run の処理内容をテキストに落とすには

WSHを利用して、アプリケーションを実行しています。その際の、処理内容(結果)をテキストに落としたいのですが、うまくいきません。どなたか、アドバイスを宜しくお願いします。

Aベストアンサー

単純に実行の仕方がまずいだけかと。

CScript スクリプト名 //Nologo >c:\list.txt

vbsやjsのファイルを直接起動してるのにWScriptが規定のスクリプトエンジンになってませんか?

そんなことをしたくないのであれば、RunメソッドではなくExecメソッドを使い、StdOutを自分でテキストファイルに出力してください。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/wslrfexecmethod.asp

参考URL:http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/wslrfexecmethod.asp

QVBSでエクセル内の行数を取得する方法

VBS初心者です。よろしくお願い致します。

VBSでエクセル内のデータの行数を取得する方法を教えて下さい。

セル1 セル2 セル3 セル4
123   234   875   ads
あい  うえ  458   444

上記がエクセルの内容だとしたら、3行という結果が欲しいのです。

どうぞよろしくお願い致します。

Aベストアンサー

>自分でエクセル内のデータを1行にして再度実行すると、値はやはり4と返してきます
書式か何か残ってるんじゃないでしょうか

>objExcel.Visible = false
true にして実行してみると判るかと思いますが、
エクセルを非表示するという設定を(明示的に)しています。

QVBscriptからバッチに変数を渡すには?

VBscriptからバッチに文字列を渡したいのですが、どう書いたらいいでしょうか?

VBscriptにWscript.Quit 1と数字を入れた場合、バッチ側は%errorlevel%で取得できると思うのですが、文字列は出来ませんでした。

よろしくお願いします。

Aベストアンサー

こんな感じでできると思います。

[VBS側]
'環境変数に格納したい値をEchoして終了
WScript.Echo kekka

[バッチ側]
for /f "usebackq tokens=*" %%i IN (`call cscript //nologo <vbsフルパス>\hoge.vbs`) DO @set vbskekka=%%i

※INの中のクォートはバッククォートである点に注意

私はこんな感じでよく使っていて、もちろん文字列もOK
ですが、日本語が扱えるかどうかは未検証です。
(半角英数以外はつかった事がない)

QVBScriptでCSVファイルを読み出したい

現在VBScriptでCSVファイルを1行ずつ読み取って、2次元配列に格納するプログラムを作成しています。
CSVファイルの中身は、サンプルで
shop,price,sales
001,500,700
003,1200,90
024,,18 という並びになっています。
実データは300件くらいです。
1行目のヘッダーを読み飛ばし、2行目のデータから1行ずつ読取、","でsplitを用いてまず1次配列に格納しています。
1次元配列のarrLine(0)=001、(1)=500、(2)=700と入ったデータを
2次元配列arrshopに順次保存?したいのです。
----------------------------------------------
dim strLine '1行ずつ読込んだデータを持つ
dim ntLineNum '行数のカウント
dim arrLine '","で区切った要素を持つ一次元配列
dim arrshop '一次元配列になった要素を2次元配列として格納

Do until .AtEndOfStream
  strLine = .ReadLine
  if 0<>strComp("",Trim(strLine)) then
ntLineNum = intLineNum + 1
  end if
  arrLine = split(strLine , ",")
  arrshop = Array(arrLines,i)
i = i + 1
loop
-----------------------------------------
msgbox arrshop(2)(0) と指定すると「003」出るようにしたいです。
Array関数が上手くないような気もします・・・。
どなたかご教授お願いします(>_<。)

現在VBScriptでCSVファイルを1行ずつ読み取って、2次元配列に格納するプログラムを作成しています。
CSVファイルの中身は、サンプルで
shop,price,sales
001,500,700
003,1200,90
024,,18 という並びになっています。
実データは300件くらいです。
1行目のヘッダーを読み飛ばし、2行目のデータから1行ずつ読取、","でsplitを用いてまず1次配列に格納しています。
1次元配列のarrLine(0)=001、(1)=500、(2)=700と入ったデータを
2次元配列arrshopに順次保存?したいのです。
--------------------------...続きを読む

Aベストアンサー

Arrayのところがおかしいですね。

動くか検証してないですが…
arrshop = Array(arrLines,i)
の代わりに
Redim Preserve arrshop(i+1)
arrshop(i)=arrLines
でやってみてください。
それと最初にiは0か1にでも初期化してから使う事をお勧めします。

Qカンマ区切りのCSVファイルから""を削除したい

初めて質問いたします

以下のような形式のCSVファイルがあります
例)
品名,数量,単価,金額
"りんご",1,150,150
"バナナ",10,200,2000
"メロン","1,000","2,000","2,000,000"

上記のように、品名にはダブルクォーテションがつき、
数量、単価、金額については桁区切りのカンマが発生する場合、ダブルクォーテーションで囲まれています

上記のようなデータを
りんご,1,150,150
バナナ,10,200,2000
メロン,1000,2000,2000000
のように別ファイルへ出力するにはどのようにすればよいでしょうか?

プログラムでの処理で、WSHを使ったものを教えていただけますと、幸いです
よろしくお願いいたします

Aベストアンサー

もう仕事は終わってしまったかもしれませんが、(^^ゞ
VBS で作ってみました。
対象CSVファイルのあるフォルダに保存して実行してみてください。
_NewFilesフォルダに保存されます。
※対象外のCSVファイルが有っても処理してしまいます

Dim oSh
Dim oFs
Dim BaseFolder
Dim newFolder
Dim f

Set oSh = CreateObject("Wscript.Shell")
Set oFs = CreateObject("Scripting.FilesystemObject")
Set BaseFolder = oFs.getFolder(oSh.currentDirectory)

newFolder = BaseFolder.Path & "\" & "_NewFiles"

If oFs.folderExists(newFolder) = False Then
oFs.createFolder (newFolder)
End If

For Each f In BaseFolder.Files
If oFs.GetExtensionName(f) = "csv" Then
Call changeIt(f.Path, newFolder)
End If
Next

MsgBox newFolder & " フォルダ内を検証"


Sub changeIt(orgFname, trgFolder)
Dim oFs
Dim orgF
Dim newF
Dim newFname
Dim buF
Dim oReg

Dim Mcol
Dim M
Dim M1, M2
Const forReading = 1
Const forWriting = 2

Set oFs = CreateObject("Scripting.fileSystemObject")
Set oReg = CreateObject("VBScript.RegExp")
Set orgF = oFs.getFile(orgFname).openAsTextStream(forReading)

newFname = trgFolder & "\" & oFs.getBaseName(orgFname) & "_New.csv"
oFs.CreateTextFile (newFname)
Set newF = oFs.getFile(newFname).openAsTextStream(forWriting)

With oReg
.Pattern = """.*?"""
.IgnoreCase = False
.Global = True
End With

Do Until orgF.atendofstream
buF = orgF.readline
Set Mcol = oReg.Execute(buF)

For Each M In Mcol
M1 = Replace(M.Value, ",", "")
buF = Replace(buF, M.Value, M1)
M2 = Replace(M1, Chr(34), "")
buF = Replace(buF, M1, M2)
Next

newF.WriteLine buF
Loop

orgF.Close: newF.Close
Set Mcol = Nothing
Set oReg = Nothing

End Sub

もう仕事は終わってしまったかもしれませんが、(^^ゞ
VBS で作ってみました。
対象CSVファイルのあるフォルダに保存して実行してみてください。
_NewFilesフォルダに保存されます。
※対象外のCSVファイルが有っても処理してしまいます

Dim oSh
Dim oFs
Dim BaseFolder
Dim newFolder
Dim f

Set oSh = CreateObject("Wscript.Shell")
Set oFs = CreateObject("Scripting.FilesystemObject")
Set BaseFolder = oFs.getFolder(oSh.currentDirectory)

newFolder = Bas...続きを読む

Qバッチでテキストファイルから任意の行のみ取得したい

batファイルを作成していて、
txtから特定の行のみをとりだし、変数に入れたいです。
どうもよくわからないので質問したいと思います。
まず以下の様なテキストファイルがあります。
-------------------
111
222
333
-------------------
実際の値、行数は違いますが、こんな感じに文字列が複数行並んでいます。

行いたい動作は、
-----------------------------------------
1.テキストファイルの1行目を変数Textに入れる(set Text=111)
2.変数Textを使用し色々処理をする
3.テキストファイルの2行目を変数Textに入れる(set Text=222)
4.変数Textを使用し色々処理をする
-----------------------------------------
コレを繰り返します。
2と4は同じ動作ですので、行数のカウンタを設定しループさせる予定です。
n行目を全て取り出す方法がわかれば行けると思うのですが、
どうも見つかりません。ご存知の方がいればお教え願いたいと思います。

batファイルを作成していて、
txtから特定の行のみをとりだし、変数に入れたいです。
どうもよくわからないので質問したいと思います。
まず以下の様なテキストファイルがあります。
-------------------
111
222
333
-------------------
実際の値、行数は違いますが、こんな感じに文字列が複数行並んでいます。

行いたい動作は、
-----------------------------------------
1.テキストファイルの1行目を変数Textに入れる(set Text=111)
2.変数Textを使用し色々処理をする
3.テキストファイルの2行目を変数T...続きを読む

Aベストアンサー

No3ですが、たぶん提示したスクリプトを見ると、ある事に気がつくはず?

findstr /n /r "." a.txt | findstr /r "^3:"

で3行目を表示してくれます。え!? それだけ。そうなんです

ただ、あと、先頭の”3:” をどうやって切り離すか? と言う問題にぶつかる。さらにファイルに先頭に”3:”があった場合、どうするのか? さらに、findstr の正規表現の動作が??? 表示すれるのはいいが、変数にどうやってセットするのか?

となる。結局 for 文を使いまわす事になります。

まあ、適当に改変して、上記の問題を解決してください。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報