2014-01-30 47 views
1

我有一個日誌文件Source.txt與以下內容結構:升壓了批處理速度

Handle v3.51 
Copyright (C) 1997-2013 Mark Russinovich 
Sysinternals - www.sysinternals.com 

------------------------------------------------------------------------------ 
DataSource.exe pid: 5860 USER\DEVELOPMENT 
    5EC: File (R--) G:\apps\OracleClient\product\11.1.0\client_2\RDBMS\mesg\ocius.msb 
    600: File (R--) G:\apps\OracleClient\product\11.1.0\client_2\RDBMS\mesg\ocius.msb 
    614: File (R--) G:\apps\OracleClient\product\11.1.0\client_2\RDBMS\mesg\ocius.msb 
    628: File (R--) G:\apps\OracleClient\product\11.1.0\client_2\RDBMS\mesg\ocius.msb 
    834: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP1_RulesLogFiles\1-28-2014_Timer.log 
    838: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP1_RulesLogFiles\1-28-2014_Debug.log 
    854: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP1_RulesLogFiles\1-28-2014_Timer.log 
    858: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP1_RulesLogFiles\1-28-2014_Debug.log 
    874: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP1_RulesLogFiles\1-28-2014_Timer.log 
    878: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP1_RulesLogFiles\1-28-2014_Debug.log 
1058: File (RW-) C:\Windows\winsxs\amd64_microsoft.vc80.atl_1fc8b3b9a1e18e3b_8.0.50727.4053_none_8a1a02152edb659b 

------------------------------------------------------------------------------ 
DataSource.exe pid: 10568 USER\DEVELOPMENT 
1074: File (RW-) C:\Windows\winsxs\amd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4053_none_88e046c92fae6f57 
1078: File (RW-) C:\Windows\winsxs\amd64_microsoft.vc80.atl_1fc8b3b9a1e18e3b_8.0.50727.4053_none_8a1a02152edb659b 
    8F4: File (RW-) C:\Windows\winsxs\amd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4053_none_88e046c92fae6f57 
    908: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP2_RulesLogFiles\1-28-2014_Timer.log 
    90C: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP2_RulesLogFiles\1-28-2014_Debug.log 
    928: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP2_RulesLogFiles\1-28-2014_Timer.log 
    92C: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP2_RulesLogFiles\1-28-2014_Debug.log 
    948: File (RW-) G:\apps\Oracle\Middleware\user_projects\epmsystem8\products\FinancialManagement\Server Working Folder\APP2_RulesLogFiles\1-28-2014_Timer.log 
1064: File (RW-) C:\Windows\winsxs\amd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4053_none_88e046c92fae6f57 
1068: File (RW-) C:\Windows\winsxs\amd64_microsoft.vc80.atl_1fc8b3b9a1e18e3b_8.0.50727.4053_none_8a1a02152edb659b 
    | | 
    | | 
    | | 
and so on...... 

我想實現如下:

  1. 搜索「數據源的第一個發生然後搜索 第一次出現(APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9)中的任何一個單詞,我們假設找到APP1單詞,然後 將以下輸出發送到文件'Output.txt':

    DataSource.exe pid: 5860 USER\DEVELOPMENT APP1 
    
  2. 然後搜索「DataSource.exe」的第2個發生,然後再 搜索中(APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9)字中的任何一項,我們可以放棄它已經被發現的話],並假設APP2第一次發生字 發現然後附加以下輸出到同一個文件 'Output.txt的':

    DataSource.exe pid: 10568 USER\DEVELOPMENT APP2 
    

    等..

我用下面的工作腳本了:

@ECHO OFF 
setlocal enabledelayedexpansion 
SET "keystring1=" 
(
FOR /f "delims=" %%a IN (
    Source.txt 
) DO (
    ECHO %%a|FIND "DataSource.exe" >NUL 
    IF NOT ERRORLEVEL 1 SET keystring1=%%a 
    FOR %%b IN (APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9) DO (
    ECHO %%a|FIND "%%b" >NUL 
    IF NOT ERRORLEVEL 1 IF DEFINED keystring1 CALL ECHO(%%keystring1%% %%b&SET "keystring1=" 

)))>Output.txt 

GOTO :EOF 

問題:

我遇到了這裏的問題是一個Source.txt file of size 312 KB,這個劇本正在4 minutes to produce Output.txt即使只有9個應用程序,這似乎是相當大時間。

我想減少這個時間,無需使用任何額外的批處理文件。請任何解決方法?

*確切的應用程序名稱與APP1,APP2等不同。

+0

取而代之的搜索過程,然後確定哪些文件已打開,枚舉文件('dir'),併爲他們每個人的判斷是有它鎖定的過程('處理file') –

回答

0

您的二級搜索可能需要一些時間 - 其中%%a正在針對APP1.. APP2.. etc.進行檢查您可以創建第二批文件以使用不同參數調用此文件,並行運行它們。

如果你的腳本被稱爲script.bat,創建一個具有以下第二個腳本 -

START script.bat APP1 APP2 APP3 
START script.bat APP4 APP5 APP6 
START script.bat APP7 APP8 APP9 

然後改變你的腳本包括輸入參數。

@ECHO OFF 
setlocal enabledelayedexpansion 
SET "searchvals=%*" 
SET "keystring1=" 
(
    FOR /f "delims=" %%a IN (Source.txt) DO (
     ECHO %%a|FIND "DataSource.exe" >NUL 
     IF NOT ERRORLEVEL 1 SET keystring1=%%a 
     FOR %%b IN (%searchvals%) DO (
      ECHO %%a|FIND "%%b" >NUL 
      IF NOT ERRORLEVEL 1 IF DEFINED keystring1 CALL ECHO(%%keystring1%% %%b&SET "keystring1=" 
)))>Output.txt 

EXIT 

這樣的腳本的每個實例只比較Source.txt對三根弦的每一行,而不是9

希望這實際上沒有幫助。請注意,Output.txt的內容可能不會按順序排列。

+0

@大錯特錯。這真是一個很好的解決方案,但不幸的是,我被限制爲創建任何其他批處理文件。我只能在一個批處理腳本中實現這些功能。 – Sunny

0

此使用名爲findrepl.bat一個幫手批處理文件 - 下載來​​自:https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

findrepl.bat在同一文件夾中的批處理文件或路徑上。

@echo off 
for %%a in (APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9) do (
type "source.txt" |findrepl "DataSource.exe" /e:"^-----" /b:"%%a" |findrepl /o:1:1 2>nul 
) 
pause 
+0

@ foxi ..完美的幫手文件就是那個..意思..!但我不允許使用任何其他批處理文件。我必須在單個批處理文件中完成這些工作......請提供任何幫助嗎? – Sunny

+0

作爲一個感興趣的問題,您從Sunny解決方案中獲得的速度有多快? – foxidrive

0
@echo off 
setlocal EnableDelayedExpansion 

(for /F "tokens=1-5* delims=\ " %%a in ('findstr "DataSource.exe APP" Source.txt') do (
    if "%%a" equ "DataSource.exe" (
     set pid=%%a %%b %%c %%d\%%e 
     set "APP=" 
    ) else if not defined APP (
     set "APP=%%f" 
     set "APP=!APP:*APP=!" 
     echo !pid! APP!APP:~0,1! 
    ) 
)) > Output.txt 

goto :EOF 
+0

@Aacini..you也會同意我的觀點,即我們必須更加普遍地認識到,隨着速度的提高與日後的關注相關,將來可以輕鬆添加更多具有不同名稱的應用程序。 – Sunny