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

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

Ответить
Настройки темы
CMD/BAT - [решено] пример BAT-файла, который будет вносить коррективы в .cfg файл

Аватара для Ka3hak

Новый участник


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

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


Изменения
Автор: Ka3hak
Дата: 02-06-2017
Уважаемые, знающие форумчане. Подскажите пожалуйста абсолютно нулевому в этом деле затейнику
Не занимался я освоением BAT, потому как думал - обошёл это, мол.. Бог миловал. Но не тут-то было! И нет времени на освоение с нуля.
Чутка предыстории, позвольте.
Начал разработку оболочки для настройки эмулятора игровой приставки. Она должна быть визуальна понятной и доступной для рядового пользователя,
всё должно делаться чуть ли не с одной кнопки. Жалко коллег-форумчан RuTracker-а у которых уже головы пухнут от постоянных, однотипных объяснений типа:
"Нажмите то, потом то... Не помогло? Тогда вот это!" и т.д. Ну, в общем вы поняли. Хочу помогать людям
Графическую составляющую я уже "победил", а все необходимые настройки планирую вносить/выполнять по средствам BAT-файлов.
К делу. Мне нужен пример BAT-файла, который будет вносить коррективы в .cfg файл. Причём, как я понимаю нет необходимости
отыскивать там какой-то определённый раздел. Просто BAT-ник находит, к примеру, строку Dynarec.Enabled=1 и изменяет её на Dynarec.Enabled=0,
или DefaultImage=defualt.gdi на DefaultImage=image.gdi
Т.е. не обязательно 1 на 0, или defualt на image.. можно строку пОлностью. Так мне кажется даже проще будет.
Вот так, просто.. пожалуйста. Без эпических супер-кодов. Чтобы и я мог понять что происходит. Потому, как мне с этим в дальнейшем работать.

.cfg файл примерно такого содержания:
[nullDC]
Dynarec.Enabled=1
DefaultImage=defualt.gdi

Dynarec.DoConstantPropagation=1
Dynarec.SafeMode=1
Dynarec.UnderclockFpu=0
Dreamcast.Cable=3
Dreamcast.RTC=2127595098
Dreamcast.Region=3
Dreamcast.Broadcast=4
Emulator.AutoStart=0
Emulator.NoConsole=0

Отправлено: 20:05, 02-06-2017

 

Ветеран


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

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


Цитата Ka3hak:
Графическую составляющую я уже "победил", »
Чем?

Цитата Ka3hak:
Мне нужен пример BAT-файла, который будет вносить коррективы в .cfg файл »
Полагаю, Вам не нужен пакетный файл. Лучше продолжите побеждать тем же средством, что использовалось для «графической составляющей».
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:05, 02-06-2017 | #2



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

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


Ветеран


Contributor


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

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


Ka3hak,
Код: Выделить весь код
@Echo OFF

Set "cfgIn=Z:\Soft_In\tra la la.cfg"

Set Rep="Dreamcast.Region=333" "Dreamcast.Broadcast=444" "Dreamcast.RTC=5552127595098" "DefaultImage=image.gdi" "Dynarec.Enabled=0"

Copy "%cfgIn%" "%cfgIn%.tmp" >nul

>"%cfgIn%" (FOR /F "usebackq tokens=*" %%a IN ("%cfgIn%.tmp") DO Call :Rezult "%%a" %Rep%)

rem Del "%cfgIn%.tmp"
GoTo :Eof

:Rezult
	Set "InStr=%~1"
 	FOR /F "usebackq eol==" %%i IN ('%InStr%') DO Set "Par1=%%i"
	:Begin
 		FOR /F "usebackq eol==" %%j IN ('%~2') DO Set "Par2=%%j"
		If /I "%Par1%"=="%Par2%" Set "InStr=%~2" &GoTo :End                                              
		Shift
		If Not "%~2"=="" GoTo :Begin
	:End
	Echo %InStr%
GoTo :Eof
При работе батника создаётся копия исходного файла. Если её надо удалять, уберите rem перед Del
Кроме того, все пустые строки в файле будут удалены.
Лирическое отступление
Сделайте мне суперсовременный компьютер, но, так как мне его обслуживать, пусть он будет простым и на лампах

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


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

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:24, 02-06-2017 | #3


Забанен


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

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


Без временных файлов:
Код: Выделить весь код
@echo off
  setlocal enabledelayedexpansion
    set "cfg=%~dp0test.cfg"
    call:getlinenumbers "!cfg!" n
    call:setaltdata "!cfg!" !n!
    more < "%~dp0test.cfg:s" > "!cfg!"
  endlocal
exit /b

:getlinenumbers
  for /f %%i in ('find /v /c "" ^< "%~1"') do set "%~2=%%i"
exit /b

:setaltdata
  3<"%~1" (for /l %%i in (1, 1, %2) do (
    <nul set /p s=<&3
    call:replace dynamic.enabled 1 0
    call:replace defaultimage default image
    echo !s!
  ))>>"%~1:s"
exit /b

:replace
  echo !s!|>nul findstr /irc:"%~1"&set "s=!s:%~2=%~3!"
exit /b

Отправлено: 22:58, 02-06-2017 | #4


Ветеран


Contributor


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

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


Еще вариант без временных фйайлов
Код: Выделить весь код
@Echo OFF

Set "cfgIn=Z:\Soft_In\tra la la.cfg"

Set Rep="Dreamcast.Region=333" "Dreamcast.Broadcast=444" "Dreamcast.RTC=5552127595098" "DefaultImage=image.gdi" "Dynarec.Enabled=0"

Set /A N1=10000
Set /A N=%N1%-1
FOR /F "usebackq tokens=*" %%a IN ("%cfgIn%") DO Call :MassTo "%%a"
>"%cfgIn%" (FOR /L %%i IN (%N1%,1,%N%) DO Call :MassFrom "A%%i")

GoTo :Eof                                     

:Rezult
	Set "InStr=%~1"
 	FOR /F "usebackq eol==" %%i IN ('%InStr%') DO Set "Par1=%%i"
	:Begin
 		FOR /F "usebackq eol==" %%j IN ('%~2') DO Set "Par2=%%j"
		If /I "%Par1%"=="%Par2%" Set "InStr=%~2" &GoTo :End                                              
		Shift
		If Not "%~2"=="" GoTo :Begin
	:End
	Echo %InStr%
GoTo :Eof

:MassTo
	Set /A N+=1
	Set "A%N%=%1"
GoTo :Eof

:MassFrom
	Call Set "Arg=%%%~1%%"
	Call :Rezult %Arg% %Rep%
GoTo :Eof
Не уверен, стОит ли обходиться без копии исходного файла

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

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:34, 03-06-2017 | #5


Аватара для Ka3hak

Новый участник


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

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


Iska, приберегите предположения и поверьте - то самое средство весьма ограничено в функционале и им я могу только запускать исполняемые файлы.
greg zakharov не совсем понял как работает ваш пример. Точнее вообще не понял и он у меня почему-то не работает. А так, я бы с удовольствием и с ним поэкспериментировал

megaloman спасибо большое, КЛАСС!(от всей души) Порадовало ваше "Лирическое отступление" :D Вот только несколько вопросиков:
1. чем отличаются коды первого и второго примеров? Работают-то они в принципе одинаково о_О
2. на ~2 секунды запускается консоль cmd. Я так понял её не убрать?
3. я уже понял, что в Set "cfgIn=Z:\Soft_In\tra la la.cfg" можно указать просто "cfgIn=tra la la.cfg", если BAT-ник в корневой,
а как поместить BAT-файл в подпапку корневой, без указания директории, т.е. "tra la la.cfg" в корневой эмулятора, а BAT в "Корневая_папка\BATS\BAT.bat"
4. и ещё один вопросик - на счёт удаления пустых строк. Сейчас это без надобности, всё и так прекрасно работает, но... Уверен пригодится в будущем!
Обещаю выразить благодарность в описании, форуму OSzone, и Вам в частности, если всё-таки доведу задумку до ума

Последний раз редактировалось Ka3hak, 03-06-2017 в 02:31.


Отправлено: 01:24, 03-06-2017 | #6


Ветеран


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

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


Цитата Ka3hak:
Iska, приберегите предположения и поверьте - то самое средство весьма ограничено в функционале и им я могу только запускать исполняемые файлы. »
Я согласен быть счастливым приберечь. Согласен быть богатым поверить проверить. Но как ты, такой большой и толстый, уместился в таком маленьком кувшине Вы не берегите, не стесняйтесь, озвучьте название того самого средства.
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:55, 03-06-2017 | #7


Ветеран


Contributor


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

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


Ka3hak,
Код: Выделить весь код
Set "cfgIn0=tra la la.cfg"
Set Rep="Dreamcast.Region=333" "Dreamcast.Broadcast=444" "Dreamcast.RTC=5552127595098" "DefaultImage=image.gdi" "Dynarec.Enabled=0"

Set "cfgIn=%~dp0"
FOR /F "usebackq delims=" %%j IN ('%cfgIn:~0,-1%') DO Set "cfgIn=%%~dpj%cfgIn0%"

If Not Exist "%cfgIn%" (
	Echo ????? Файл %cfgIn% не найден !!!!!
	pause
	GoTo :Eof
)
.......
.......
Я бы предпочёл, чтобы общение было корректным. Никто никому ничем не обязан. Зачем истерика? ИМХО, Ваш последний пост необходимо удалить

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


Отправлено: 14:50, 03-06-2017 | #8


Ветеран


Contributor


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

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


Ka3hak,
Можно, пожалуйста, и код полностью
Постановка задачи: Путь\файл.cfg\Папка\файл.bat
В батнике указываем только имя файл.cfg
Код: Выделить весь код
@Echo OFF

Set "cfgIn0=tra la la.cfg"
Set Rep="Dreamcast.Region=333" "Dreamcast.Broadcast=444" "Dreamcast.RTC=5552127595098" "DefaultImage=image.gdi" "Dynarec.Enabled=0"

Set "cfgIn=%~dp0"
FOR /F "usebackq delims=" %%j IN ('%cfgIn:~0,-1%') DO Set "cfgIn=%%~dpj%cfgIn0%"

If Not Exist "%cfgIn%" (
	Echo:
	Echo ????? File %cfgIn% not found !!!!!
	Echo:
	pause
	GoTo :Eof
)

Copy "%cfgIn%" "%cfgIn%.tmp" >nul

>"%cfgIn%" (FOR /F "usebackq tokens=*" %%a IN ("%cfgIn%.tmp") DO Call :Rezult "%%a" %Rep%)

rem Del "%cfgIn%.tmp"
GoTo :Eof

:Rezult
	Set "InStr=%~1"
 	FOR /F "usebackq eol==" %%i IN ('%InStr%') DO Set "Par1=%%i"
	:Begin
 		FOR /F "usebackq eol==" %%j IN ('%~2') DO Set "Par2=%%j"
		If /I "%Par1%"=="%Par2%" Set "InStr=%~2" &GoTo :End                                              
		Shift
		If Not "%~2"=="" GoTo :Begin
	:End
	Echo %InStr%
GoTo :Eof
Аналогично второй вариант. Если в первом варианте батник делает копию исходного файла с именем файл.cfg.tmp, который при желании можно оставить rem Del "%cfgIn%.tmp", а без желания - удалить Del "%cfgIn%.tmp", то второй вариант делает то же, но без создания промежуточного файла.
"на ~2 секунды запускается консоль cmd" - на форуме сто раз обсуждалось как этого избежать, не вижу смысла искать.
"насчёт удаления пустых строк" - моё дело предупредить, это особенность работы батника, и не возьмусь в рамках CMD этого избежать.
"после манипуляций, скрипт перестал работать." - без комментариев, я бы предложил Вам описать, что при этом происходит, выдаются ли какие-либо сообщения. А так - нет мыслей. У меня в указанной постановке работает

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

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:28, 04-06-2017 | #9


Аватара для Ka3hak

Новый участник


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

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


ВСЁ РАБОТАЕТ! Большое и жирное СПАСИБО! Задача выполнена на 200%

Последний раз редактировалось Ka3hak, 04-06-2017 в 15:36.


Отправлено: 15:13, 04-06-2017 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - bat файл, который создаст 2 bat файла mazahaka2000@vk Скриптовые языки администрирования Windows 1 17-06-2015 22:07
CMD/BAT - [решено] bat файл, при запуске которого в файле .cfg стирался весь текст и вставлялся новый kennydzzze Скриптовые языки администрирования Windows 3 21-07-2014 10:53
CMD/BAT - bat который будет дописывать строки в конец файла infoman1@vk Скриптовые языки администрирования Windows 9 11-07-2014 22:21
CMD/BAT - bat который будет дописываться в exe infoman1@vk Скриптовые языки администрирования Windows 1 10-06-2014 18:39
CMD/BAT - [решено] Создание bat который будет создавать другой bat для создания 3 root13 Скриптовые языки администрирования Windows 5 27-10-2013 15:46




 
Переход