Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


Комментарии по тексту скрипта
Код: Выделить весь код
@Echo Off
cls

Set "FileIn=Z:\Soft_In\Тра ля ля.ini"

rem Контролируем наличие в батнике данных для замены/обновления
Set /A Nbeg=0
For /F "usebackq delims=:" %%i In (`"FINDSTR /B /L /I /N /C:":AddParametersSpisok" "%~dpnx0""`) DO Set /A Nbeg=%%i
If %Nbeg% EQU 0 Echo !!! Не найдены параметры для замены &Pause &Exit /B 240

rem Контролируем наличие исходного ини-файла
If Not Exist "%FileIn%" Echo !!! Не найден файл "%FileIn%" &Pause &Exit /B 240

rem Организуем отдельный Refresh файл, куда помещаем из батника данные для корректировки исходного ини-файла
>"%FileIn%.Refresh" (For /F "usebackq tokens=1,* delims==" %%i In (`"more +%Nbeg% "%~dpnx0""`) DO (
	If /I "%%i"=="GoTo :Eof" GoTo :Cont
	If Not "%%j"=="" (Echo %%i=%%j)
	If "%%j"=="" For /F "tokens=1 delims=]" %%s In ("%%i") DO (Echo %%s])      
))
:Cont

rem Организуем промежуточный tmp файл из исходного, в котором удалены все упомянутые для корректировки параметры
>"%FileIn%.tmp" (For /F "usebackq tokens=1* delims==" %%i In ("%FileIn%") DO (
	If "%%j"=="" For /F "tokens=1 delims=]" %%s In ("%%i") DO (Echo %%s])
	If Not "%%j"=="" (FINDSTR /B /I /N /C:"%%i" "%FileIn%.Refresh" >nul 2>nul)||(Echo %%i=%%j)      
))

rem Получаем боевой ини-файл с именем исходного. Берём tmp-файл, 
rem Последовательно анализируем наличие секции в Refresh файле, если она там присутствует, забираем из Refresh файла всю секцию
rem Дописываем далее в эту секцию всё что осталось в tmp-файле из этой секции
rem Просматриваем Refresh-файл, если не находим какой-либо помянутой там секции в боевом файле, дописываем эту секцию в конец 

>"%FileIn%" (For /F "usebackq tokens=1,* delims==" %%i In (`"more "%FileIn%.tmp""`) DO (
	If "%%j"=="" (
		Echo %%i
		For /F "usebackq delims=:" %%n In (`"FINDSTR /B /L /I /N /C:"%%i" "%FileIn%.Refresh"" 2^>nul`) DO Call :NewParameters %%n
	) Else (
		(Echo %%i=%%j)
	)
	)
	Set /A Log=1
	For /F "usebackq tokens=1,* delims==" %%i In (`"more "%FileIn%.Refresh""`) DO (
		Call :AddSections "%%i"  "%%j" 
	)
)
rem Удаляем промежуточные файлы
Del "%FileIn%.tmp" 2>nul
Del "%FileIn%.Refresh" 2>nul 

GoTo :Eof

rem Забираем секцию из Refresh файла
:NewParameters
	For /F "usebackq tokens=1,* delims==" %%a In (`"more +%1 "%FileIn%.Refresh""`) DO (
		If "%%b"=="" GoTo :Eof
		(Echo %%a=%%b)
	)
GoTo :Eof

rem Добавляем в конечный файл отсутствующие в нём секции из Refresh файла
:AddSections
	If %2=="" (
		Set /A Log=1
		FINDSTR /B /L /I /N /C:%1 "%FileIn%" >nul 2>nul && Set /A Log=0
	)
	If %Log% EQU 1 If %2=="" Echo %~1 
	If %Log% EQU 1 If Not %2=="" Echo %~1=%~2 
GoTo :Eof

:AddParametersSpisok

[Display]
bFXAAEnabled=01234567890
fTreesMidLODSwitchDist=8192.000
fMeshLODLevel2FadeTreeDistance=4096.000
fMeshLODLevel1FadeTreeDistance=6144.000
kuku=868768686
iMaxDecalsPerFrame=250
iMaxSkinDecalsPerFrame=100
[MAIN]
fSkyCellRefFadeDistance=600000.0000
[Trees]
uiMaxSkinnedTreesToRender=200
[Water]
iWaterReflectHeight=1024
iWaterReflectWidth=1024

GoTo :Eof
Есть одна неприятная тонкость: в конце строк, особенно в названии секций, не должно быть пробелов, которые визуально могут не восприниматься. Я доработал скрипт, чтобы этого избежать.
Я не узнаю своего скрипта, трудно понять, в чём загвоздка
Старый анекдот.
- Звонок в техподдержку: у меня не работает компьютер.
- Следует совет: а попробуйте устранить неисправность сами.
-Возмущенный клиент: а как директор фирмы смотрит на то, что вы уклоняетесь от работы?
- ответ: положительно, обычно после действий клиента доходы фирмы значительно вырастают.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 06-12-2017 в 20:50.


Отправлено: 19:18, 06-12-2017 | #8