程序输出中的管道字符串

时间:2014-02-16 02:50:51

标签: command-line pipe

我有一个程序,一次连续输出3或4行数据(有时第4行是状态更新)。我想只保留第二个(以“cmd:”开头)和第三行(以“prc:”开头),然后去掉最后输出的前5个字符。有没有办法通过Windows命令行执行此操作?我到目前为止:

 program.exe -flags | FINDSTR /c:"cmd" /c:"prc" |  WHAT???? > "output.txt" 

更好的是,有没有办法用逗号替换换行符(除了删除前5个字符),以便输出在同一行上有两个值对(cmd和prc)?

感谢您的帮助。

另外:有没有办法在多个文件之间动态分割输出,这样没有一个文件大于10MB或10,000行等等?例如,当“output01.txt”达到10K行时,开始将输出发送到“output02.txt”,依此类推?

2 个答案:

答案 0 :(得分:0)

这是一个解决方案(已编辑:它不会将两行附加到一行中),但对于第二部分,program.exe必须停止并重新启动才能更改output filename

这使用名为repl.bat的帮助程序批处理文件 - 从https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

下载

repl.bat放在与批处理文件相同的文件夹中或放在路径上的文件夹中。

program.exe -flags | repl "^(cmd|prc): " "" a >output.txt

答案 1 :(得分:0)

对于您的全部要求,Windows批处理不是一个很好的选择。它可以使用许多其他脚本语言轻松解决,例如VBScript,JScript,PowerShell。可能有unix utils的Windows端口也可能使工作更轻松。

但我确实设法提出了一个有效的本地批处理解决方案。它要求将程序输出重定向到临时文件,然后日志记录脚本从该文件中读取。唯一真正的缺点是日志记录脚本在紧密循环中轮询输入。

<强> LOGGER.BAT

@echo off
setlocal enableDelayedExpansion
if "%~1" == ":process:" goto :process

set file=0
set "maxLines=%~2"
if not defined maxLines set "maxLines=10000"
for /l %%. in () do (
  set /a file+=1
  set suffix=00!file!
  set suffix=!suffix:~-3!
  cmd /c ^""%~f0" :process: ^>"%~dpn1!suffix!%~x1"^" || exit
)

:process
set "cnt=0"
set "cmd="
for /l %%. in () do (
  set "ln="
  set /p "ln="
  if defined ln (
    if "!ln:~0,5!" equ "[END]" exit 1
    if defined cmd (
      (echo !cmd!,!ln:~5!)
      set "cmd="
      set /a cnt+=1
      if !cnt! geq !maxLines! exit 0
    ) else if "!ln:~0,5!" equ "cmd: " set "cmd=!ln:~5!"
  )
)

LOGGER.BAT需要两个参数:1)输出文件的基本名称,以及2)每个输出文件中的最大行数。如果给定的输出文件是“output.txt”,则记录器将创建“output001.txt”,“output002.txt”等。

我认为你的程序最终会自行结束,或者通过一些外部触发器结束。 LOGGER.BAT需要一种方法来了解输入何时耗尽。它会在看到以[END]开头的输入行时终止。

以下是记录器的调用方式:

(program.exe -flags & echo [END]) >logger.tmp | <logger.tmp LOGGER.BAT output.txt 10000