PDA

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


avb_trader
07-10-2010, 14:21
Доброго времени всем!!!

имеется такой листинг:

[Программа1]
Версия=2.1.0.55
[Программа2]
Версия=1.0.0.14
[Программа3]
Версия=1.1.1.1
[Программа5]
версия=6.1.1.0
[программа4]
версия=2.0.0.0
[программа8]
версия=4.1.1

собственно вопрос: как написать такой батничек, чтобы он искал в этом файле нужную секцию и следующую строку менял на другую, т.е. секцию [Программа2] версия=1.0.0.14 заменить на [Программа2] версия=1.0.0.15, причем чтобы можно было одновременно заменять несколько секций с проверкой существующей версии, а то может и менять не надо
Заранее спасибо всем откликнувшимся!

NiOl
07-10-2010, 18:50
Уточните, КАК Вы хотите передавать список данных для изменения. Файликом?

avb_trader
08-10-2010, 08:55
Ну, в принципе у меня задача обрабатывать несколько разнесенных местоположений с этими фалами - проще прописать эти данные в нем самом

amel27
08-10-2010, 12:32
avb_trader, весьма туманное условие, уточняющие вопросы:

- могут ли в секции присутствовать другие параметры кроме "Версия"?
- обязательно ли сохранять относительное положение секции в файле?
- что значит "с проверкой", если предполагается простая замена параметра?

avb_trader
08-10-2010, 13:20
amel27, спасибо за появление!! я много ваших постов прочитал - понял - Вы МАСТЕР в этом деле, пишите очень красиво!!

1. В данном случае конкретно в секции присетвтует только параметр "Версия=1.1.1.1", но хотелось бы универсальности, чтобы не только сдесь это использовать, но и на других примерах (скадем конфиги openvpn - для замены в них параметров)
2. Сохранять относительное положение не обязательно
3. возможно есть такой вариант что секция найдена нужная - но в ней уже заменено на требуемую версию или версия для замены не соответствует нужной. Например надо заменить
[Приложение1]
версия=1.1.1.1
на
[Приложение1]
версия=1.1.2.1
А в файле присутствует
[Приложение1]
версия=1.1.1.0

Надеюсь понятно объяснил, по крайней мере - старался :)

amel27
09-10-2010, 12:16
пишите очень красиво!! »гм... ну не знаю, попытаюсь... насколько получится... :o

забыл уточнить про кодировку исходного INI, предположим что это WIN (ANSI/1251)
само собой, кодировка самого батника родная - DOS (OEM/866)

батник устанавливает параметр "версия" секции "[Программа2]" равным "1.0.2.14",
то же для секции "[Программа3]", но только если исходное значение параметра равно "2.1.0.0"

@echo off

call :SETVAL file.ini [Программа2] версия 1.0.2.14
call :SETVAL file.ini [Программа3] версия 1.0.2.14 2.1.0.0

EXIT

:SETVAL
CHCP 1251 >nul& SETLOCAL DisableDelayedExpansion& set $f=F
(for /f "usebackq tokens=1* delims==" %%a in ("%~1") do (
set "$a=%%a"& set "@a=%%~a"& set "$b=%%b"& set "@b=%%b"
SETLOCAL EnableDelayedExpansion
if "!@a:~,1!"=="[" (echo !$a!
if /i "!@a!"=="%~2" (set "$f=T") else set "$f=F" ) else (
if "!$f!"=="T" if /i "!@a!"=="%~3" (
if "%~5"=="" (set "$b=%4") else if "%~5"=="!@b!" set "$b=%4")
echo !$a!=!$b!
)
for /f "delims=" %%i in ("!$f!") do ENDLOCAL& set "$f=%%~i"
))>"%~dpn0.tmp"
copy /y "%~dpn0.tmp" "%~1" >nul&& del "%~dpn0.tmp"
CHCP 866 >nul& ENDLOCAL& exit /b


P.S. данный вариант предполагает отсутствие незначащих пробелов между элементами

avb_trader
11-10-2010, 08:20
amel27, СУПЕР!!!!
Спасибо большое!!

Вы - профессионал!




© OSzone.net 2001-2012