Войти

Показать полную графическую версию : [решено] Поиск и копирование текста из одного ini-файла в другой с помощью bat-ника


Nun-Nun
11-08-2016, 18:49
Требуется батник для следующей задачи:
в ini-файле есть строка, состоящая из двух частей. Первая часть строки состоит из всегда одинакового текста
Id = VLTE-
за которым следует вторая часть строки, содержащая периодически меняющийся текст, состоящий из латиницы, пробелов, знаков подчёркивания, точек и тире, т.е. минусов. Требуется с помощью батника скопировать текст, начиная с VLTE-, и до конца строки в другой ini-файл. Содержание этого второго ini-файла будет состоять из одной строки, содержащей скопированный текст, заключённый в кавычки, за которым будет следовать текст (без кавычек, кавычки привожу, чтобы показать пробелы):
" ---> " и текущая дата.

В итоговом ini-файле должно получиться что-то типа такого: "VLTE-набор букв латиницей и перечисленных выше символов"три пробела--->три пробела11.08.2016

P.S. Если второй ini-файл уже существует, нужно его перезаписать.

alpap
11-08-2016, 22:13
Если в файле строка вида

Id=VLTE-

то можно так:

@echo off
set "f_in=file1.ini"
set "f_out=file2.ini"
<"%f_in%">"%f_out%" (for /f "delims=" %%a in ('find "Id"') do @set "%%a"& cmd/v/c echo "!Id!" ---^^^> %date%)
exit


если именно так как указано, то так:

@echo off
set "f_in=file1.ini"
set "f_out=file2.ini"
<"%f_in%">"%f_out%" (for /f "tokens=2* delims==" %%a in ('find "Id"') do @set "s=%%a%%b"& cmd/v/c echo "!s:~1!" ---^^^> %date%)
exit


Если второй ini-файл уже существует, нужно его перезаписать. »
Конечный файл так или иначе перезапишется или создасться.

Nun-Nun
11-08-2016, 23:55
если именно так как указано, то так: »
Да, лучше именно так, как указано. Попробовал второй вариант - работает, но только если оба ini-файла находятся рядом с bat-файлом. На самом же деле второй ini-файл должен располагаться в находящейся рядом с bat-ником папке (извиняюсь, забыл об этом предупредить). Пробовал добавить путь, но с ним скрипт не работает (абсолютные пути в данном случае не подходят, т.к. на разных компах они сильно отличаются, а компов много). Можно ли это как-то поправить?
И ещё есть один вопрос: насколько вижу, скрипт выполняет поиск нужного текста по буквосочетанию "Id". Но "Id" может встречаться в ini-файле не только в искомой строке, но и в других строках. Это проблем не вызовет, на корректность поиска не повлияет?

alpap
12-08-2016, 03:05
Это проблем не вызовет, на корректность поиска не повлияет? »
с учетом
Первая часть строки состоит из всегда одинакового текста »
у меня выбора -то и нет, могу разве вместо ...find "Id"..., предложить:

...more^|findstr/r /c:"^Id"...

т.е. поиск строки, начинающейся с Id

(абсолютные пути в данном случае не подходят, т.к. на разных компах они сильно отличаются, а компов много). Можно ли это как-то поправить? »
надо несколько вариантов путей, тогда мне понятней будет чтобы поправить.

Nun-Nun
12-08-2016, 11:56
могу разве вместо ...find "Id"..., предложить: »
Неизменная часть строки, по которой целесообразно вести поиск это приведённый у меня вариант (табуляция, Id, табуляция, знак равно, пробел, VLTE-):
Id = VLTE-
т.е. в поиске этот кусок целесообразно использовать целиком, т.к. он не повторяется, в отличие от двухбуквенного "Id", который может присутствовать и в других местах, кроме искомой строки.
Что касается путей, то выглядеть это будет так: папка, в которой лежат bat-файл и ini-файл с исходным текстом \ папка, в которой должен располагаться итоговый ini-файл, т.е. примерно так:
folder1\file.bat
folder1\file-in.ini
folder1\folder2\file-out.ini

alpap
12-08-2016, 18:35
Nun-Nun,
Наконец что-то прояснилось:

@echo off
set "f_in=file-in.ini"
set "f_out=%~dp0folder2\file-out.ini"
<"%f_in%">"%f_out%" (for /f "tokens=3*" %%a in ('more^|findstr/rc:"^ Id = VLTE-\>"') do @echo "%%a%%b" ---^^^> %date%)
exit
.

Nun-Nun
12-08-2016, 20:18
alpap,

Попробовал. Не работает. В папке folder2 появляется выходной ini-файл, но в нём ничего нет, он пустой.

alpap
12-08-2016, 20:59
Не работает »
Точно, стоит один раз не проверить и приехали, исправил и проверил:

@echo off
set "f_in=file-in.ini"
set "f_out=%~dp0folder2\file-out.ini"
<"%f_in%">"%f_out%" (for /f "tokens=3*" %%a in ('more^|findstr/rc:"^[ ]*Id[ ]*=[ ]VLTE-"') do @echo "%%a%%b" ---^^^> %date%)
exit
.

Nun-Nun
12-08-2016, 21:24
Работает, но некорректно. Вот что оказывается записанным в итоговый ini-файл:
"VLTE-H7LMET. L.M07-635" ---^> 12.08.2016 , а должно быть: "VLTE-H7L MET. L.M07-635" ---> 12.08.2016
Т.е. не хватает одного пробела и присутствует символ ^

alpap
12-08-2016, 22:17
Угу? Когда cmd/v убрал забыл изменить:

@echo off
set "f_in=file-in.ini"
set "f_out=%~dp0folder2\file-out.ini"
<"%f_in%">"%f_out%" (for /f "tokens=3*" %%a in ('more^|findstr/rc:"^[ ]*Id[ ]*=[ ]VLTE-"') do @echo "%%a %%b" ---^> %date%)
exit

Так правильно.

Nun-Nun
12-08-2016, 22:32
alpap,

Да, так работает. Я это уже и сам поправил. Благодарю за помощь!




© OSzone.net 2001-2012