Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Изменение параметров в .ini файле

Ответить
Настройки темы
CMD/BAT - [решено] Изменение параметров в .ini файле
Stalker_AleX333


Сообщения: n/a

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


Изменения
Автор: Stalker_AleX333
Дата: 05-12-2017
Требуется изменить значения определенных параметров в ini файле, находящемуся по заранее известному пути. При отсутствии нужного параметра, его необходимо добавить в соответствующий раздел вида:

[Interface]
fMouseCursorSpeed=1.0000
bDialogueSubtitles=0
bGeneralSubtitles=0
bShowCompass=1
[GamePlay]
bShowFloatingQuestMarkers=1
bShowQuestMarkers=1
iDifficulty=0
[Controls]
fMouseHeadingSensitivity=0.0200
fGamepadHeadingSensitivity=0.6667
bAlwaysRunByDefault=1
bInvertYValues=0
bGamePadRumble=1
bUseKinect=0
[Particles]
iMaxDesired=750
[SaveGame]
fAutosaveEveryXMins=15.0000

и т.д.

Я полистал последние 5-7 страниц форума и нашел там приблизительно подходящий мне код:
Код: Выделить весь код
@Echo Off
CALL :REPLINE "file.ini" "Server_address=" "Server_address=192.1.1.1"
CALL :REPLINE "file.ini" "Server_port=" "Server_port=8080"
:REPLINE
If Not Exist "%~1" Exit /B 1
If Exist "%~dpn1.tmp" DEL /F/Q "%~dpn1.tmp"
Set $N=0& For /F "Delims=:" %%i In ('FindStr /BINRC:" *%~2" "%~1"') Do Set $N=%%i
If %$N% NEQ 0 For /F "Tokens=1* Delims=:" %%i In ('FindStr /ENRC:"$" "%~1"') Do If "%%i"=="%$N%" (
Echo %~3>>"%~dpn1.tmp" ) ELSE Echo.%%j>>"%~dpn1.tmp"
If Exist "%~dpn1.tmp" If Exist "%~1" DEL /F/Q "%~1"
If Exist "%~dpn1.tmp" REN "%~dpn1.tmp" "%~nx1"
Exit /B 0
Правда, пока никак не могу понять, как мне его адаптировать под свои нужды.

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

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


Т.е. выглядеть это должно как-то так:

Код: Выделить весь код
set "SkyrimPrefs=%USERPROFILE%\Documents\My Games\Skyrim Special Edition"
call :repline "SkyrimPrefs.ini" "bFXAAEnabled=" "bFXAAEnabled=0"
call :repline "SkyrimPrefs.ini" "fTreesMidLODSwitchDist=" "fTreesMidLODSwitchDist=8192.000"
call :repline "SkyrimPrefs.ini" "fMeshLODLevel1FadeTreeDistance=" "fMeshLODLevel1FadeTreeDistance=6144.000"
и т.д.
А если не нашли нужный параметр, найти его секцию (прим. [MAIN]) и добавить в ее конец, не трогая остальные.

Отправлено: 18:49, 05-12-2017

 
Stalker_AleX333


Сообщения: n/a

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


megaloman, так все работает, но после прожатия "продолжить" вываливается ошибка об отсутствии ini файла, хотя он есть и на тот момент уже отредактирован:

Скрытый текст
Код: Выделить весь код
cls
:: Копирование отсортированного списка модов
set "FileIn1=Silver Raven mods pack settings\Plugins.txt"
set "BoxOut1=%USERPROFILE%\AppData\Local\Skyrim Special Edition"
if not exist "%BoxOut1%" md "%BoxOut1%"
copy /y "%FileIn1%" "%BoxOut1%\"

:: Копирование файла настроек игры Skyrim.ini
set "FileIn2=Silver Raven mods pack settings\Skyrim.ini"
set "BoxOut2=%USERPROFILE%\Documents\My Games\Skyrim Special Edition"
if not exist "%BoxOut2%" md "%BoxOut2%"
copy /y "%FileIn2%" "%BoxOut2%\"

if exist "%FileIn1%" ( color 07
 echo.
 echo.
 echo ■ Отсортированный список плагинов успешно скопирован в AppData пользователя.
)

if exist "%FileIn2%" ( color 07
 echo.
 echo.
 echo ■ Skyrim.ini успешно скопирован в папку документов пользователя.
)

if not exist "%FileIn1%" ( color 0c
 echo.
 echo.
 echo *ОШИБКА! Файл Plugins.txt не найден!
 echo.
 echo Не удалось скопировать отсортированный список плагинов.
 echo Извлеките папку Silver Raven mods pack settings из установочных архивов со сборкой в папку с игрой вручную и перезапустите панель управления. Убедитесь, что антивирусное ПО не блокирует ее работу и у вас достаточно прав на доступ к папкам пользователя.
)

if not exist "%FileIn2%" ( color 0c
 echo.
 echo.
 echo *ОШИБКА! Файл Skyrim.ini не найден!
 echo.
 echo Не удалось скопировать файл скрытых настроек игры.
 echo Извлеките папку Silver Raven mods pack settings из установочных архивов со сборкой в папку с игрой вручную и перезапустите панель управления. Убедитесь, что антивирусное ПО не блокирует ее работу и у вас достаточно прав на доступ к папкам пользователя.
)

:: Копирование измененных настроек игры в SkyrimPrefs.ini
call :skyrimprefs_ini_file "%USERPROFILE%\Documents\My Games\Skyrim Special Edition\SkyrimPrefs.ini"
if not %ErrorLevel%==0 goto :eof

:skyrimprefs_ini_file
set "FileIn3=%~1"
set /a Nbeg=0
:: Контролируем наличие в cmd(exe)-шнике данных для замены
for /f "usebackq delims=:" %%i in (`"findstr /b /l /i /n /c:":skyrimprefs_parameters_list" "%~dpnx0""`) do set /a nbeg=%%i

if exist "%FileIn3%" ( color 07
 echo.
 echo.
 echo ■ SkyrimPrefs.ini успешно отредактирован.
)

if not exist "%FileIn3%" ( color 0c
 echo.
 echo.
 echo *ОШИБКА! Файл SkyrimPrefs.ini не найден!
 echo.
 echo Не удалось внести изменения в файл настроек игры.
 echo Запустите лаунчер и произведите настройки, согласно своим предпочтениям. Убедитесь, что антивирусное ПО не блокирует работу панели управления и у вас достаточно прав на доступ к папкам пользователя.
)

if %Nbeg% equ 0 ( color 0c
 echo.
 echo.
 echo *ОШИБКА! Список параметров для SkyrimPrefs.ini не найден!
 echo.
 echo Не удалось внести изменения в файл настроек игры.
 echo Сообщите о данной проблеме автору сборки! Убедитесь, что антивирусное ПО не блокирует работу панели управления и у вас достаточно прав на доступ к папкам пользователя.
)

@echo.
@echo.
::::::::::::::::::::: После прожатия этой паузы вываливается ложная ошибка. Что-то она ломает:::::::::::::::::::::::::::::::
pause
:::::::::::::::::::::
:: goto main_menu

:: Создаем отдельный Refresh файл, куда помещаем данные для корректировки исходного ini файла
>"%FileIn3%.refresh" (for /f "usebackq tokens=*" %%i in (`"more +%nbeg% "%~dpnx0""`) do (if /i "%%i"=="goto :eof" goto :cont) &echo %%i)

:cont
:: Создаем временный файл из исходного, в котором удалены все упомянутые для корректировки секции
>"%FileIn3%.tmp" (for /f "usebackq tokens=1* delims==" %%i in ("%FileIn3%") do (
	if "%%j"=="" echo %%i
	if not "%%j"=="" (findstr /b /i /n /c:"%%i" "%FileIn3%.refresh" >nul 2>nul)||(echo %%i=%%j)
))

:: Получаем "боевой" ini файл с именем исходного
:: Берём временный файл, последовательно анализируем наличие секций в Refresh файле, если они там присутствуют, забираем их из Refresh файла
:: Дописываем в эту секцию всё, что осталось во временном файле из этой секции
:: Просматриваем Refresh-файл, если не находим какой-либо упомянутой там секции в боевом файле, дописываем ее в конец 
>"%FileIn3%" (for /f "usebackq tokens=1,* delims==" %%i in (`"more "%FileIn3%.tmp""`) do (
	if "%%j"=="" (
		echo %%i
		for /f "usebackq delims=:" %%n in (`"findstr /b /l /i /n /c:"%%i" "%FileIn3%.refresh"" 2^>nul`) do call :new_parameters %%n
	) else (
		(echo %%i=%%j)
	)
	)
	set /a log=1
	for /f "usebackq tokens=1,* delims==" %%i in (`"more "%FileIn3%.refresh""`) do (
		call :add_sections "%%i"  "%%j"
	)
)
:: Удаляем временные файлы
del "%FileIn3%.tmp" 2>nul
del "%FileIn3%.refresh" 2>nul

exit /b 0

:: Забираем секцию из Refresh файла
:new_parameters
	for /f "usebackq tokens=1,* delims==" %%a in (`"more +%1 "%FileIn3%.refresh""`) do (
		if "%%b"=="" goto :eof
		(echo %%a=%%b)
	)
goto :eof

:: Добавляем в конечный файл отсутствующие в нём секции из Refresh файла
:add_sections
	if %2=="" (
		set /a log=1
		findstr /b /l /i /n /c:%1 "%FileIn3%" >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

:: Список изменяемых секций в SkyrimPrefs.ini
:skyrimprefs_parameters_list
[Display]
bFXAAEnabled=0
fTreesMidLODSwitchDist=8192.000
fMeshLODLevel2FadeTreeDistance=4096.000
fMeshLODLevel1FadeTreeDistance=6144.000
iMaxDecalsPerFrame=250
iMaxSkinDecalsPerFrame=100
[MAIN]
fSkyCellRefFadeDistance=600000.0000
[Trees]
uiMaxSkinnedTreesToRender=200
[Water]
iWaterReflectHeight=1024
iWaterReflectWidth=1024
goto :eof


P.S. На сообщения в личке можно забить, они устарели. Из полезного, там разве что весь остальной код, который я сюда не прикреплял.

Последний раз редактировалось Stalker_AleX333, 07-12-2017 в 14:31.


Отправлено: 14:25, 07-12-2017 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Contributor


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

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


Stalker_AleX333, Извините, не берусь искать ошибки в чужом большом коде, особенно если я не понимаю логику постановки задачи, а восстанавливать её из кода - трудоёмкая и неблагодарная работа.
Цитата Iska:
Ждите коллег, может помогут. »

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


Отправлено: 15:09, 07-12-2017 | #12


Ветеран


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

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


Stalker_AleX333,
я наверное понимаю о чем вы. bat не будет работать в интерактивном режиме, выполнив задачу по изменению ini, bat должен завершить работу. Значит bat для изменения ini должен быть свой (отдельный), а запускать его можно из основного, например:
Код: Выделить весь код
::код основного
call "Путь к bat для изменения ini"
::код основного далее

Отправлено: 15:27, 07-12-2017 | #13

Stalker_AleX333


Сообщения: n/a

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


alpap, проблема в том, что не могу юзать два разных cmd-шника. Только один, упакованный в exe конвертером. Таковы условия.

А возможно, каждый раз создавать временный cmd-шник из основного, с помещением туда нужного кода, а после выполнения удаляя его?

При необходимости могу прикрепить все, что есть - целиком. То, что написано выше, лишь один из пунктов, который должен выполняться, через менюшку.

Отправлено: 16:10, 07-12-2017 | #14


Ветеран


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

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


Цитата Stalker_AleX333:
упакованный в exe конвертером »
конвертер без проблем упакует все что надо, вкладка ВКЛЮЧИТЬ-ДОБАВИТЬ

Отправлено: 16:14, 07-12-2017 | #15


Ветеран


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

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


Цитата Stalker_AleX333:
не могу юзать два разных cmd-шника. Только один, упакованный в exe конвертером. Таковы условия. »
Что-то мне подсказывает, что это надуманные условия. Если же речь идёт о том, что вот только исполняемый файл и никак иначе — берёте с++ и gcc, и пользуете унаследованные функции GetPrivateProfileString()/WritePrivateProfileString().

https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Отправлено: 16:41, 07-12-2017 | #16

Stalker_AleX333


Сообщения: n/a

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


alpap, Попробовал. При запуске exe-шника выдает ошибку, что мол не могу создать файл, бла-бла-бла.cmd. Продолжить работу?

Цитата Iska:
Что-то мне подсказывает, что это надуманные условия. »
Отчасти. Но это не мои условия. Так что увы и ах...

Последний раз редактировалось Stalker_AleX333, 07-12-2017 в 17:01.


Отправлено: 16:42, 07-12-2017 | #17


Ветеран


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

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


Stalker_AleX333,
я тоже не горю желанием разбирать ваш многоэтажный код и исходя из всего увиденного код надо делать на PowerShell или Autoit, тогда будет и удобно что-то менять в интерактивном режиме, можно и красочно сделать - выносное меню-окно и выпадающие списки, а cmd пусть тихо покурит в сторонке, не его это задачи.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:59, 07-12-2017 | #18

Stalker_AleX333


Сообщения: n/a

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


alpap, да, надо бы попробовать на PowerShell. А не насиловать несчастные cmd и bat файлы. Благодарю всех за помощь. Тему закрываю.

Отправлено: 17:43, 07-12-2017 | #19


Ветеран


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

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


Stalker_AleX333, коль Вам всё равно исполняемый файл нужо́́н — лучше попробуйте AutoIt, там хотя бы встроенные функции для работы с ini есть.

Отправлено: 17:54, 07-12-2017 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Изменение параметров в .ini файле

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Загрузка параметров из ini файла в GUI -TRM- AutoIt 21 30-09-2017 12:14
CMD/BAT - Переменная в Ini файле Renko13 Скриптовые языки администрирования Windows 2 28-06-2014 14:11
Разное - в файле desktop.ini на флешке в этом файле написано... imrik Microsoft Windows 2000/XP 1 17-03-2012 00:58
Перемешивание и сортировка в INI файле Centrinar AutoIt 39 23-06-2011 03:11
CMD/BAT - [решено] Поиск и изменение содержимого в INI файле avb_trader Скриптовые языки администрирования Windows 6 11-10-2010 08:20




 
Переход