Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Поиск и копирование текста из одного ini-файла в другой с помощью bat-ника (http://forum.oszone.net/showthread.php?t=317733)

Nun-Nun 11-08-2016 18:49 2658931

Поиск и копирование текста из одного ini-файла в другой с помощью bat-ника
 
Требуется батник для следующей задачи:
в ini-файле есть строка, состоящая из двух частей. Первая часть строки состоит из всегда одинакового текста
Код:

        Id        = VLTE-
за которым следует вторая часть строки, содержащая периодически меняющийся текст, состоящий из латиницы, пробелов, знаков подчёркивания, точек и тире, т.е. минусов. Требуется с помощью батника скопировать текст, начиная с
Код:

VLTE-
, и до конца строки в другой ini-файл. Содержание этого второго ini-файла будет состоять из одной строки, содержащей скопированный текст, заключённый в кавычки, за которым будет следовать текст (без кавычек, кавычки привожу, чтобы показать пробелы):
Код:

"  --->  "
и текущая дата.

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

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

alpap 11-08-2016 22:13 2658988

Если в файле строка вида
Код:

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

Цитата:

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

Конечный файл так или иначе перезапишется или создасться.

Nun-Nun 11-08-2016 23:55 2659005

Цитата:

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

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

alpap 12-08-2016 03:05 2659033

Цитата:

Цитата Nun-Nun
Это проблем не вызовет, на корректность поиска не повлияет? »

с учетом
Цитата:

Цитата Nun-Nun
Первая часть строки состоит из всегда одинакового текста »

у меня выбора -то и нет, могу разве вместо ...find "Id"..., предложить:
Код:

...more^|findstr/r /c:"^Id"...
т.е. поиск строки, начинающейся с Id

Цитата:

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

надо несколько вариантов путей, тогда мне понятней будет чтобы поправить.

Nun-Nun 12-08-2016 11:56 2659107

Цитата:

Цитата alpap
могу разве вместо ...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 2659225

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 2659246

alpap,

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

alpap 12-08-2016 20:59 2659261

Цитата:

Цитата 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 21:24 2659273

Работает, но некорректно. Вот что оказывается записанным в итоговый ini-файл:
Код:

"VLTE-H7LMET. L.M07-635"  ---^>  12.08.2016
, а должно быть:
Код:

"VLTE-H7L MET. L.M07-635"  --->  12.08.2016
Т.е. не хватает одного пробела и присутствует символ ^

alpap 12-08-2016 22:17 2659293

Угу? Когда 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 2659297

alpap,

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


Время: 17:32.

Время: 17:32.
© OSzone.net 2001-