2014-02-16 3 views
0

У меня есть программа, которая выводит данные непрерывно 3 или 4 строки за раз (иногда 4-я строка - это обновление состояния). Я хочу сохранить только второй (начинается с «cmd:») и 3-й строки (начинается с «prc:»), а затем избавиться от этих первых 5 символов для окончательного вывода. Есть ли способ сделать это с помощью командной строки Windows? У меня до сих пор:строки трубопровода из выходных программ

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

Даже еще лучше, есть способ заменить символы новой строки (в дополнение к удалению первые 5 символов) с запятой, так что выход есть две пары значений (CMD и prc) в одной строке?

Спасибо за любую помощь.

ТАКЖЕ: есть ли способ разделить выход на лету между несколькими файлами, чтобы ни один файл не превышал 10 МБ или 10000 строк и т. Д.? например, когда «output01.txt» попадает в 10K строк, начните отправку вывода в «output02.txt» и так далее?

+1

все это в тысячу раз проще с помощью набора инструментов Unix/Linux. Есть несколько рабочих атак, которые вы можете установить в Windows, или достаточно просто запустить виртуальную машину в Windows, которая дает вам действительно полную среду Linux. Cygwin, mingw - 2 зрелые работы. Я не могу дать вам имя для установки VM Linux. Я уверен, что другие могут. удачи. – shellter

ответ

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 
+0

Параметр M может не работать, если программа запускается непрерывно, так как REPL.BAT должен буферизовать весь ввод до конца файла, если используется опция M. – dbenham

+0

@dbenham Спасибо. – foxidrive

+0

Но REPL.BAT не может искать '\ n' без опции' M' - немного уловки 22. Я не вижу хорошего решения проблемы новой строки, используя REPL.BAT, если программа работает непрерывно. – dbenham

0

Пакет Windows не очень хороший вариант для вашего полного набора требований. Его можно легко решить с помощью многих других языков сценариев, например VBScript, JScript, PowerShell. Могут быть порты Windows unix utils, которые также могут облегчить работу.

Но мне удалось создать эффективное пакетное решение. Для этого требуется, чтобы выход программы перенаправлялся во временный файл, а затем скрипт регистрации записывался из этого файла. Единственным реальным недостатком является то, что скрипт регистрации регистрируется для ввода в узком цикле.

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 
Смежные вопросы