Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
8 / 3 / 0
Регистрация: 05.02.2014
Сообщений: 42
1

Парсинг; сложный случай; For - не работает; (разбивка строки (с кэшированием)

04.03.2014, 10:25. Показов 1660. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Парсинг; сложный случай; For - не работает; (разбивка строки).

День добрый,
... Есть (*) программа 'coma.exe' выдающая (непрерывно, построчно) параметры в консоль (в столбцах (пять столбцов); разделители пробелы).
При вызове из '.bat' выдает (непрерывно,...) параметры в консоль '.bat' (непрерывно, т.е без возврата управления (в '.bat')).
При вызове из '.bat' через '| find' выдает (непрерывно,...) параметры в консоль '.bat' (непрерывно, т.е без возврата управления (в '.bat')).
При вызове из '.bat' с использованием 'for' (с целью парсинга) -- 'for висит (никакие) данные не выводятся (нет условий к их обработке)'.
Проводил эксперименты (надо признать достойного результата - нет; не привожу их здесь ввиду объема, и дабы не вводить (читающего) в заблуждение).
Прошу помочь (/подсказать) (еще) варианты...

Необходим парсинг параметров (консольной программы 'coma.exe'), с целью дальнейшей обработки в '.bat(.cmd)' (по религиозным соображениям).
````````````````````````````
С уважением, рассчитываю на понимание.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.03.2014, 10:25
Ответы с готовыми решениями:

RegEx, сложный парсинг строки
Здравствуйте, помогите написать регулярку, и можно ли вобще в данном случае ее написать? На входе...

Очень сложный случай
У меня есть usb флэшка, на ней была специальная программа защиты от вирусов, т.е. на флэшку нельзя...

Преобразование в число. Сложный случай
Дорогие друзья, требуется ваша помощь, есть вот такой код: double hi; ...

Сложный случай 3-х колонночного макета
Привет.Нужнеш каркас как разместить 3 блока . Первый и третий блок- динамечески изменяющиеся(не в...

4
Модератор
Эксперт JS
5198 / 2080 / 406
Регистрация: 06.01.2013
Сообщений: 4,794
04.03.2014, 14:47 2
Если она сама по себе не возвращает управление в батник, то парсинг провести можно только так:
Bash
1
2
3
4
5
6
@echo off
if "%~1"=="1" coma.exe>file.tmp & exit /b
start "" "%~0" 1
taskkill /f /im coma.exe >nul 2>&1
::Здесь парсим файл file.tmp
erase file.tmp
1
3460 / 1998 / 635
Регистрация: 26.02.2014
Сообщений: 1,457
04.03.2014, 23:40 3
trash50, попробуйте так:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
start "" /b coma.exe>1.log
>nul timeout /t 1
set n=0
setlocal enabledelayedexpansion
:#
tasklist /fi "imagename eq coma.exe" /fi "status eq running"| find "coma.exe">nul|| goto:##
more +!n!<1.log>2.log
for /f "delims=" %%i in ('find "Something"^<2.log') do echo.%%i
for /f %%i in ('find /c /v ""^<2.log') do set /a n=n+%%i
goto:#
:##
endlocal
del 1.log 2.log
exit /b
.


Может так случиться, что последняя строка разового вывода не будет отображаться полностью. Тогда её следует дублировать первой строкой следующего вывода, заменив в коде строку
Bash
1
for /f %%i in ('find /c /v ""^<2.log') do set /a n=n+%%i
на строку
Bash
1
for /f %%i in ('find /c /v ""^<2.log') do set /a n=n+%%i-1
.



Тестировалось на модели с построчным выводом ("в роли" "coma.exe" -- "calc.exe" и "cmd.exe" одновременно):

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
start "" calc.exe
>nul timeout /t 1
start "" /b cmd.exe /c "(for /l %%i in () do @(set /a m+=1&& echo.&& >nul timeout /t 1))>1.log"
set n=0
setlocal enabledelayedexpansion
:#
tasklist /fi "imagename eq calc.exe" /fi "status eq running"| find "calc.exe">nul|| goto:##
more +!n!<1.log>2.log
for /f "delims=" %%i in ('find "5"^<2.log') do echo.%%i
for /f %%i in ('find /c /v ""^<2.log') do set /a n=n+%%i
goto:#
:##
endlocal
taskkill /im cmd.exe
.
1
8 / 3 / 0
Регистрация: 05.02.2014
Сообщений: 42
05.03.2014, 20:29  [ТС] 4
ComSpec чувствую, что требуются пояснения
в частности этих строк:
Bash
1
2
3
4
... 
more +!n!<1.log>2.log
for /f "delims=" %%i in ('find "Something"^<2.log') do echo.%%i
for /f %%i in ('find /c /v ""^<2.log') do set /a n=n+%%i
Всем спасибо.
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
05.03.2014, 23:07 5
Полагаю ComSpec предлагает запустить в одном процессе:
Bash
1
coma.exe >> 1.log
А вторым процессом параллельно делать такое:
- считать сначала первую партию строк из файла. Запомнить сколько прочитано строк и в следующий раз по кругу начать чтение уже со следующей строки.
(вызов второго батника, который Вам нужен предполагается вставлять в конце строки 10).
Кстати, что такое find "5" мне неясно.
Вместо строк 9-11 нужно было написать:
Bash
1
for /f "delims=" %%i in ('more +!n!^<1.log') do echo.%%i& set /a n+=1
trash50, предлагаю еще вариант VBScript (файл .VBS)
Код проверял на программе MBRCheck by AD13
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const QT = """"
Set oShell = CreateObject("WScript.Shell")
Set oFSO = CreateObject("Scripting.FileSystemObject")
cur = oFSO.GetParentFolderName(WScript.ScriptFullName) 'каталог со скриптом
 
Set oExec = oShell.Exec(cur & "\" & "mbrcheck.exe")
oExec.StdIn.Write("Y" + VbCrLf)
Do
    sLine = "": ch = ""
    Do
        if (ch <> vbCr and ch <> vbLf) then sLine = sLine & ch
        ch = oExec.StdOut.Read(1)
    Loop Until ch = vbCr
    ch = oExec.StdOut.Read(1)
    'sOutput = oExec.StdOut.ReadLine()
    sOutput = sLine
    sArgs = ""
    For each Arg in split(sOutput)
        sArgs = sArgs & " " & QT & Arg & QT
    Next
    'if Len(sArgs) <> 0 then
    oShell.Run(QT & cur & "\" & "batch.bat" & QT & sArgs)
    'end if
Loop While Not oExec.StdOut.AtEndOfStream
mbrcheck.exe заменить на coma.exe и положить рядом с .VBS
Батник batch.bat я создавал такой:
Bash
1
@echo.%*>>ret.log
1
05.03.2014, 23:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2014, 23:07
Помогаю со студенческими работами здесь

Сложный случай, не могу понять. Получается у меня сгорели 2 новые материнки
Всем привет, до этого случая я считал, что более менее разбираюсь в компьютерах. Но эта ситуация...

Купил новую Palit GTX 1060 6144Mb не грузит дальше экрана материнской платы, случай сложный,рабочая
Случай таков: была AMD Radeon HD 7800 Series, поиграл в WD2, перегрев, отошёл граф.чип, артефакты в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru