2016-09-21 182 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