要在行之间显示的Windows批处理脚本

时间:2011-11-14 09:40:39

标签: windows batch-file

我正在寻找一个显示给定文件中几行的批处理脚本。 例如,假设我有一个内容为

的文件
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批处理脚本中执行此操作?

2 个答案:

答案 0 :(得分: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

你需要在循环之外初始化这个var

set /a inside=0

并使用此变量来决定是否使用该行

if %inside%==1 echo %%a

但是,它可能无效,您需要处理延迟扩展 ...阅读HELP SET,然后尝试在BAT顶部添加SETLOCAL ENABLEDELAYEDEXPANSION文件,并将变量引用而不是%VAR%更改为!VAR!

我把所有碎片放在一起作为练习。

答案 1 :(得分: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"

也许您可能需要添加一些额外的代码来检查参数中给出的起始行或结束行是否在文件中不存在,并在这些情况下退出读取循环。