2011-11-14 252 views
0

我在寻找一个批处理脚本,它显示给定文件中的几行文字。 例如可以说,我有内容的文件在批处理脚本之间显示的批处理脚本

SERVICE_NAME: Appinfo 
DISPLAY_NAME: Application Information 
     TYPE    : 20 WIN32_SHARE_PROCESS 
     STATE    : 4 RUNNING 
           (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN) 
     WIN32_EXIT_CODE : 0 (0x0) 
     SERVICE_EXIT_CODE : 0 (0x0) 
     CHECKPOINT   : 0x0 
     WAIT_HINT   : 0x0 

SERVICE_NAME: BFE 
DISPLAY_NAME: Base Filtering Engine 
     TYPE    : 20 WIN32_SHARE_PROCESS 
     STATE    : 4 RUNNING 
           (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN) 
     WIN32_EXIT_CODE : 0 (0x0) 
     SERVICE_EXIT_CODE : 0 (0x0) 
     CHECKPOINT   : 0x0 
     WAIT_HINT   : 0x0 

SERVICE_NAME: BITS 
DISPLAY_NAME: Background Intelligent Transfer Service 
     TYPE    : 20 WIN32_SHARE_PROCESS 
     STATE    : 4 RUNNING 
           (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN) 
     WIN32_EXIT_CODE : 0 (0x0) 
     SERVICE_EXIT_CODE : 0 (0x0) 
     CHECKPOINT   : 0x0 
     WAIT_HINT   : 0x0 

SERVICE_NAME: CertPropSvc 
DISPLAY_NAME: Certificate Propagation 
     TYPE    : 20 WIN32_SHARE_PROCESS 
     STATE    : 4 RUNNING 
           (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN) 
     WIN32_EXIT_CODE : 0 (0x0) 
     SERVICE_EXIT_CODE : 0 (0x0) 
     CHECKPOINT   : 0x0 
     WAIT_HINT   : 0x0 

SERVICE_NAME: Cissesrv 
DISPLAY_NAME: HP Smart Array SAS/SATA Event Notification Service 
     TYPE    : 10 WIN32_OWN_PROCESS 
     STATE    : 4 RUNNING 
           (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN) 
     WIN32_EXIT_CODE : 0 (0x0) 
     SERVICE_EXIT_CODE : 0 (0x0) 
     CHECKPOINT   : 0x0 
     WAIT_HINT   : 0x0 

现在,如果我想打印从SERVICE_NAME: BFE直到SERVICE_NAME: CertPropSvc。我如何在Windows批处理脚本中执行此操作?

+3

你尝试过什么吗? –

回答

1

阅读HELP FORHELP IF

然后开始实施循环读取文件这样

for /f "tokens=*" %%a in (c:\temp\services.txt) do (
    echo %%a 
) 

,并添加到它的内容,一些检查...

for /f "tokens=*" %%a in (c:\temp\services.txt) do (
    if /i "%%a"=="SERVICE_NAME: BFE" echo Begin here 
    if /i "%%a"=="SERVICE_NAME: CertPropSvc" echo End here 
) 

一次你有这个设置,使用一个变量来标记你需要复制的部分,像这样

if /i "%%a"=="SERVICE_NAME: BFE" set /a inside=1 
if /i "%%a"=="SERVICE_NAME: CertPropSvc" set /a inside=0 

你需要初始化这个变种循环

set /a inside=0 

之外,使用这个变量来决定是否使用行

if %inside%==1 echo %%a 

,但是,它可能无法工作,你会需要照顾延迟扩展 ...读取HELP SET,然后尝试在BAT文件的顶部添加SETLOCAL ENABLEDELAYEDEXPANSION,并将变量引用(而不是%VAR%)更改为!VAR!

我把所有作品拼凑在一起作为练习。

1

您可以调用子程序将其输入重定向到您要读取的文件,并在子程序读取文件行中使用set /P line=命令。该子程序必须搜索起始行,然后从该行搜索到echo,直到结束。下面的批处理文件需要从参数%1%2的起始和结束行:

@echo off 
call :SearchStart %1 %2 < the_file.txt 
exit /b 

:SearchStart 
set /P line= 
if /I not "%line%" == "%~1" goto SearchStart 
:PrintUntilEnd 
echo/%line% 
set line= 
set /P line= 
if /I not "%line%" == "%~2" goto PrintUntilEnd 

为了得到你想要的,如果前面的批处理文件被命名为BETWEEN.BAT行:

BETWEEN "SERVICE_NAME: BFE" "SERVICE_NAME: CertPropSvc" 

也许你们会想要添加一些额外的代码来检查参数中给出的开始或结束行是否不存在于文件中并在这些情况下退出读取循环。