iT邦幫忙

0

使用vbscript 列印出文字檔中,符合條件的特定幾行(2)

jatdr 2010-07-14 10:44:4612610 瀏覽

各位大大好 不好意思又來詢問了
小弟現在有一個文件檔內容如下:(aaa.txt)

"AAA.job" (aaa.js)
Started 2010/7/7 下午 11:59:00
"BBB.job" (bbb.js)
Started 2010/7/7 下午 11:59:00
"CCC.job" (ccc.exe)
Started 2010/7/8 上午 12:00:00
"DDD.job" (ddd.EXE)
Started 2010/7/8 上午 12:00:00
"AAA.job" (aaa.js)
Finished 2010/7/8 上午 12:01:06
Result: The task completed with an exit code of (0).
"CCC.job" (ccc.exe) 2010/7/8 上午 12:03:00 ** WARNING **
The task was forced to close since its execution time exceeded the configured maximum.
You may want to go to the Settings page and increase the "Stop the scheduled task after" time.
"DDD.job" (ddd.EXE) 2010/7/8 上午 12:03:00 ** WARNING **
The task was forced to close since its execution time exceeded the configured maximum.
You may want to go to the Settings page and increase the "Stop the scheduled task after" time.
"EEE.job" (EEE.exe)
Started 2010/7/8 上午 12:05:00
"BBB.job" (BBB.js)
Finished 2010/7/8 上午 12:09:10
Result: The task completed with an exit code of (0).


這是小弟管的某機器的 scheduled tasks之 log

現在的大麻煩就是...
小弟想要產出一個文件檔...是各JOB,在各日的執行結果就好...
而不是像裡面的文件一樣大雜燴....(因為該文件會留存很多天的JOB結果,並且都混在一起)
EX:
(針對AAA.job,在7/7的執行結果)
(即使完成時間是7/8 還是要顯示) 檔名:bbb.txt

"AAA.job" (aaa.js)
Started 2010/7/7 下午 11:59:00
"AAA.job" (aaa.js)
Finished 2010/7/8 上午 12:01:06
Result: The task completed with an exit code of (0).

小弟實在不是知道怎麼下IF 來判定那麼多條件...........
有沒有哪位大大可以幫忙一下或提供方向....嗚嗚
或是用哪個工具可以比較簡單的完成這個問題呢?
拜託大家幫忙了!!
謝謝大家!!!

看更多先前的討論...收起先前的討論...
misadm iT邦高手 10 級 ‧ 2010-07-16 09:20:50 檢舉
看無疑惑
你的意思是說,要寫一個 VBScript 來分析aaa.txt 嗎?那後面的例子的 bbb.txt 又是什麼呢?

然後是要把相同 Job 的紀錄放在一起嗎?
jatdr iT邦新手 5 級 ‧ 2010-07-16 11:21:18 檢舉
不好意思 我的文章中說明不清
不過意思 大概就是大大您講的第一句

我是想要從aaa.txt來產出bbb.txt 而bbb.txt這個檔是針對aaa.txt中,跟AAA.job有關的所有執行記錄

之後若能替換,也可以抓出aaa.txt中,所有BBB.job 或 CCC.job 或 DDD.job...等等
的所有有關執行記錄 再以該JOB為產出文字檔的檔名....

利用VBScript這個工具 把相同JOB的紀錄放在一起~~~

意思就是這樣...
謝謝大大的回應~~!!
misadm iT邦高手 10 級 ‧ 2010-07-20 09:04:35 檢舉
那 aaa.txt 中,有關 AAA.job 的相關紀錄,是否固定只有幾中,例如:
1. 一開始執行一定會出現『"AAA.job" (aaa.js)』
2. 『Started 2010/7/7 下午 11:59:00』這一行是否一定緊接在上一行之後?
3. 工作結束時會再出現這一行『"AAA.job" (aaa.js)』嗎?
4. 『Finished 2010/7/8 上午 12:01:06』同樣是否緊接在上一行之後?
5. 『Result: The task completed with an exit code of (0).』這一行也是緊接在上一行之後嗎?

我想說的是,如果 aaa.txt 中的訊息,沒有規則可言,那就無法使用 VBSctipt 達成。
jatdr iT邦新手 5 級 ‧ 2010-07-20 12:14:26 檢舉
謝謝大大提出的疑問,一一解答如下:
1.是的
2.是的
3.是的
4.是的
5.是的,但此行也有可能出現非0的 return code

不過我想請教,因為若是以DDD.job來看
他的JOB執行狀況就跟AAA.job不一樣

所以無法寫單一一個VBScript 來弄出各個JOB的執行記錄檔搂?
(只要換程式碼裡面的JOB名稱)

謝謝您!
misadm iT邦高手 10 級 ‧ 2010-07-20 14:15:44 檢舉
DDD.job 比較麻煩的是,以下兩行跟 DDD.job 有什麼規則可言?
『The task was forced to close since its execution time exceeded the configured maximum.』
『You may want to go to the Settings page and increase the "Stop the scheduled task after" time.』

是不是一定緊接在『"DDD.job" (ddd.EXE) 2010/7/8 上午 12:03:00 ** WARNING **
』之後呢?

這兩行中間『絕對』不會出現別的資訊嗎?

只要有規則就可以整合在同一個 VBScript 中執行,但若你在日後還會出現 FFF.job 那你就必須再手動加入。

是不是考慮看看,源頭的記錄檔,是否有辦法分開來記錄,而不要全部都記錄在 aaa.txt 中呢?
jatdr iT邦新手 5 級 ‧ 2010-07-21 15:27:16 檢舉
先回答最後的問題:
是不是考慮看看,源頭的記錄檔,是否有辦法分開來記錄,而不要全部都記錄在 aaa.txt 中呢?
-->這個檔案是是微軟內建的scheduled task的 log file...他就只能把所有JOB的執行記錄這樣混雜在一起@_@

『The task was forced to close since its execution time exceeded the configured maximum.』
『You may want to go to the Settings page and increase the "Stop the scheduled task after" time.』

是不是一定緊接在『"DDD.job" (ddd.EXE) 2010/7/8 上午 12:03:00 ** WARNING **
』之後呢?
--->是的,若DDD.job為Warning,則後面兩行一定是跟著『"DDD.job" (ddd.EXE) 2010/7/8 上午 12:03:00 ** WARNING **』之後


那....如果我只要截出AAA.job, BBB.job執行的結果(這種沒什麼問題的JOB)
然後分別產出 AAAA.txt,BBBB.txt,的話
這樣可以嗎@@?

感謝大大您不斷的回應~~

1 個回答

4
misadm
iT邦高手 10 級 ‧ 2010-07-22 10:56:12
最佳解答

首先,您要會 VBScript 的讀取文字檔的方式。

<pre class="c" name="code">Const ForReading = 1

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("D:\aaa.txt", ForReading) '檔案路徑請自行修改
Do Until objFile.AtEndOfStream
    strLine = objFile.ReadLine '從檔案中每次讀取一整行文字
    Wscript.Echo strCharacters
Loop

objFile.Close

接著您也要會如何寫入一個檔案。

<pre class="c" name="code">Const ForAppending = 8

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile("D:\aaaJob.txt", ForAppending, True)

objTextFile.WriteLine("This is test file.")

objTextFile.Close

會讀取及寫入檔案之後,就只剩下分析 aaa.txt 的內容了。比較直覺的方式;若有 10 個 job 那就要分析 aaa.txt 10 次,當然您也可以直接將 aaa.txt 一口氣讀入陣列中,再慢慢來分析。

接著,只要按照您說的規則,將每個 job 分別寫入相對應的文字檔即可。

<pre class="c" name="code">strLine = objFile.ReadLine
If strLine = """AAA.job"" (aaa.js)" then
    '將 strLine 寫入 aaaJob.txt
    strLine = objFile.ReadLine '馬上再讀取一行,這一行一定是 AAA.job 的執行時間。
    '將 strLine 寫入 aaaJob.txt
    '接著進入回圈,搜尋下一個"""AAA.job"" (aaa.js)"
    Do Until objFile.AtEndOfStream
        strLine = objFile.ReadLine
        If strLine = """AAA.job"" (aaa.js)" then
            '將 strLine 寫入 aaaJob.txt
            strLine = objFile.ReadLine '馬上再讀取一行,這一行一定是 AAA.job 的結束時間
            '將 strLine 寫入 aaaJob.txt
            strLine = objFile.ReadLine '馬上再讀取一行,這一行一定是 AAA.job 的回傳結果
            '將 strLine 寫入 aaaJob.txt
        End If
        Exit Do '已經分析完畢,即使檔案沒有讀完也不需要再讀,所以強制中斷迴圈。
    Loop
End If

這樣就完成 aaa.job 的分析了,如果要再針對有問題的 job 分析,那您可以再多判斷是否有『WARING』的字出現。

<pre class="c" name="code">if Right(strLine,13) = "** WARNING **" then
    '將 strLine 寫入 aaaJob.txt
    strLine = objFile.ReadLine '馬上再讀取一行,這一行一定是『The task』開頭
    '將 strLine 寫入 aaaJob.txt
    strLine = objFile.ReadLine '馬上再讀取一行,這一行一定是『You may』開頭
    '將 strLine 寫入 aaaJob.txt
End If

第 1 行,是從 strLine『右』邊往『左』邊取 13 個字元,只要等於『** WARNING ** 』就可以認定產生錯誤。

那麼接下來的連續兩行,一定是相關的錯誤訊息,這樣您也可以將有問題的 Log 擷取出來了。

在這,我只寫出程式的邏輯,詳細的語法,您可能還是需要上網查一下,您可以參考這個網址:http://www.ecaa.ntu.edu.tw/weifang/htmltutor/VBScript/C-VBsdocs/vbstoc.htm

延伸閱讀:
http://www.microsoft.com/taiwan/technet/community/scriptcenter/filefolder/scrff58.mspx

jatdr iT邦新手 5 級 ‧ 2010-07-22 11:09:48 檢舉

謝謝您,最後規則判定的部份很受用!
相當感激!!

我要發表回答

立即登入回答