我有一个程序,一次连续输出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”,依此类推?
答案 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