2016-09-21 181 views
0

之後找到字符串並回顯所有內容我正在創建一個摘要審計文件,並且我正在掃描的文件之一是300-1000 +個頁面。我試圖提取到這個審計文件的信息總是最後3頁左右。Windows批處理腳本 - 在

所以,雖然我有點熟悉findstr或find函數,但我不知道如何在找到這些信息後返回所有東西。幫幫我?

使用該邏輯,那麼在餘額報告後如何獲取所有數據?

FINDSTR /l "BALANCE REPORT" EXAMPLE.REPORT 1>NUL 2>&1 && (
ECHO WHAT DO I PUT HERE??? >> NightlyAudit.txt 
) || (
ECHO No Balance Report Found! >> NightlyAudit.txt 
) 
+0

您需要向我們提供您熟悉的代碼,然後尋求幫助。 – Compo

+0

編輯爲OP – brodimaggio12

+1

您需要對示例報告中您要搜索的內容非常具體。您現在提供的示例是在內容中搜索區分大小寫的BALANCE項和區分大小寫的REPORT項。 – Compo

回答

3

我覺得你FINDSTR搜索可能是不正確的 - "BALANCE REPORT"將匹配包含BALANCEREPORT任何線路。我懷疑你想匹配字符串BALANCE REPORT,在這種情況下,你需要使用/c:"BALANCE REPORT"

您可以添加/ N選項以獲取匹配的行號,使用FOR/F解析出該值,然後使用MORE和+ n跳過適當的行數。

下面將寫出如果你想在輸出中包含匹配的行匹配的行

@echo off 
setlocal 
set "skip=" 
for /f "delims=:" %%N in (
    'findstr /nlc:"BALANCE REPORT" example.report' 
) do if not defined skip set skip=%%N 
if not defined skip (
    echo BALANCE REPORT not found 
    exit /b 1 
) 
more +%skip% example.report >NightlyAudit.txt 

之後來到所有行,那麼你就必須減去一個。如果第一行恰好匹配,那麼你不想跳過任何行,但更不允許+ 0,所以邏輯要求不是簡單地減去1

@echo off 
setlocal 
set "skip=" 
for /f "delims=:" %%N in (
    'findstr /nlc:"BALANCE REPORT" example.report' 
) do if not defined skip set skip=%%N 
if not defined skip (
    echo BALANCE REPORT not found 
    exit /b 1 
) 
set /a skip-=1 
if %skip% equ 0 (
    set "skip=" 
) else (
    set "skip=+%skip%" 
) 
more %skip% example.report >NightlyAudit.txt 

注多一點,更多的會將任何[Tab]字符轉換爲一系列空格。還有一個潛在的問題。我不確定MORE可以跳過多於64K行,如果您的源文件有1000頁,每行有60行,那麼您可能會接近極限。

因此,MORE可能無法爲您工作,在這種情況下您需要一種替代方案。這是一種使用純批處理的方法,但速度相對較慢,每行約8190字節。

替換爲較命令下面的比賽後打印所有行:

... 
>NightlyAudit.txt (
    for /f "skip=%skip% delims=" %%A in ('findstr /n "^" example.report') do (
    set "ln=%%A" 
    setlocal enableDelayedExpansion 
    echo(!ln:*:=! 
    endlocal 
) 
) 

如果要包括匹配行,則跳過變量的計算改變了一下,一樣的FOR/F選項。 FOR/F也不允許skip = 0,但語法與MORE相比稍有不同。

... 
set /a skip-=1 
if %skip% equ 0 (
    set "skip=" 
) else (
    set "skip=skip=%skip%" 
) 
>NightlyAudit.txt (
    for /f "%skip% delims=" %%A in ('findstr /n "^" example.report') do (
    ... 

這是很容易,如果你使用其他腳本語言與你輸入的單一讀出,以實現自己的目標。例如,你可以在CSCRIPT中使用JScript。

例如,可以使用下列寫匹配後的所有行:

writeAfterMatch。JS

var str, go=0; 
while (!WScript.StdIn.AtEndOfStream) { 
    str=WScript.StdIn.ReadLine(); 
    if (go) WScript.StdOut.WriteLine(str); 
    if (!go) if (str.indexOf(WScript.Arguments(0))>0) go=1; 
} 

使用

cscript //nologo writeAfterMatch.js "BALANCE REPORT" <example.report >NightlyAudit.txt 

只是扭轉幾行的順序,並可以包括匹配行:

writeAfterMatchInclusive.js

var str, go=0; 
while (!WScript.StdIn.AtEndOfStream) { 
    str=WScript.StdIn.ReadLine(); 
    if (!go) if (str.indexOf(WScript.Arguments(0))>0) go=1; 
    if (go) WScript.StdOut.WriteLine(str); 
} 

使用

cscript //nologo writeAfterMatchInclusive.js "BALANCE REPORT" <example.report >NightlyAudit.txt 

另一種選擇是用我的JREPL.BAT text processing utility解決用最少的代碼的問題。 JREPL是純粹的腳本(混合JScript /批處理),它可以在任何從XP以後的Windows機器上本機運行。通過從命令行發佈JREPL /??可以獲得完整的文檔。

它可能看起來很嚇人,因爲有太多的選擇。但解決方案其實很簡單。

下一個郵輪將後寫出來的所有行比賽

jrepl "BALANCE REPORT" "go++;$0" /l /j /jendln "if(go<2)$txt=false;if(go)go++" /jbeg "go=0" /f example.report /o NightlyAudit.txt 

這個簡單的變化將包括匹配行:

jrepl "BALANCE REPORT" "go=1;$0" /l /j /jendln "if(!go)$txt=false" /jbeg "go=0" /f example.report /o NightlyAudit.txt 

如果使用內自己的JREPL命令批處理腳本,那麼你需要使用CALL JREPL。

+0

這正是我一直在尋找的謝謝!我只是在學習這些語言,並且cscript正在完善。謝謝! – brodimaggio12

+0

對於任何人來說,第一個代碼示例不包含'for'循環正確工作所需的'/ N'。那些'findstr'命令應該包括'findstr/N ...'。好的答案,否則。 –

+0

@ByronWall - OMG,我在我的文本中討論/ N選項,然後忘記將它包含在代碼中!感謝您的評論。我修復了代碼。 – dbenham

1

一般結構爲:

FINDSTR [switch(es)] [string(s)] [source] 1>NUL 2>&1 && (
    [successful commands] 
) || (
    [unsuccessful commands] 
) 
+0

使用您的FINDSTR代碼再次更新OP。感謝您的幫助@Compo – brodimaggio12