гм... ну не знаю, попытаюсь... насколько получится...
забыл уточнить про кодировку исходного 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. данный вариант предполагает отсутствие незначащих пробелов между элементами