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

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

avb_trader 07-10-2010 14:21 1513549

Поиск и изменение содержимого в INI файле
 
Доброго времени всем!!!

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

[Программа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 1513762

Уточните, КАК Вы хотите передавать список данных для изменения. Файликом?

avb_trader 08-10-2010 08:55 1514093

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

amel27 08-10-2010 12:32 1514219

avb_trader, весьма туманное условие, уточняющие вопросы:

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

avb_trader 08-10-2010 13:20 1514261

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 1514926

Цитата:

Цитата avb_trader
пишите очень красиво!! »

гм... ну не знаю, попытаюсь... насколько получится... :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 1516080

amel27, СУПЕР!!!!
Спасибо большое!!

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


Время: 21:41.

Время: 21:41.
© OSzone.net 2001-