Войти

Показать полную графическую версию : [решено] пример BAT-файла, который будет вносить коррективы в .cfg файл


Страниц : [1] 2

Ka3hak
02-06-2017, 20:05
Уважаемые, знающие форумчане. Подскажите пожалуйста абсолютно нулевому в этом деле затейнику :)
Не занимался я освоением 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

Iska
02-06-2017, 22:05
Графическую составляющую я уже "победил", »
Чем?

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

megaloman
02-06-2017, 22:24
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
Кроме того, все пустые строки в файле будут удалены.Сделайте мне суперсовременный компьютер, но, так как мне его обслуживать, пусть он будет простым и на лампах :)

greg zakharov
02-06-2017, 22:58
Без временных файлов:
@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

megaloman
03-06-2017, 00:34
@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

Не уверен, стОит ли обходиться без копии исходного файла

Ka3hak
03-06-2017, 01:24
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, и Вам в частности, если всё-таки доведу задумку до ума ;)

Iska
03-06-2017, 05:55
Iska, приберегите предположения и поверьте - то самое средство весьма ограничено в функционале и им я могу только запускать исполняемые файлы. »
Я согласен быть счастливым приберечь. Согласен быть богатым поверить проверить. Но как ты, такой большой и толстый, уместился в таком маленьком кувшине Вы не берегите, не стесняйтесь, озвучьте название того самого средства.

megaloman
03-06-2017, 14:50
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
)
.......
.......
Я бы предпочёл, чтобы общение было корректным. Никто никому ничем не обязан. Зачем истерика? ИМХО, Ваш последний пост необходимо удалить

megaloman
04-06-2017, 12:28
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 этого избежать.
"после манипуляций, скрипт перестал работать." - без комментариев, я бы предложил Вам описать, что при этом происходит, выдаются ли какие-либо сообщения. А так - нет мыслей. У меня в указанной постановке работает

Ka3hak
04-06-2017, 15:13
ВСЁ РАБОТАЕТ! Большое и жирное СПАСИБО! Задача выполнена на 200%

Ka3hak
27-06-2017, 05:14
Подскажите ещё вот, "вдовесок" пожалуйста, где ошибка? Или как указать правильный путь...?
В задумке - BAT-ник находит exe-фай, в директории находящейся папкой выше, переименовывает и запускает с параметрами приоритета.
Моя корявая версия переименовывает не только exe-шник находящийся папкой выше, но и по одному exe-шнику на своём пути.
Я понимаю что код возможно через зад написан :D. Я его наковырял на просторах...


echo off
setlocal enableextensions enabledelayedexpansion
for /f "delims=*" %%i in ('dir /b /s "..\*.exe"') do (
ren "%%i" "nullDC_Win32_Release!%%~xi"
)
endlocal

start /realtime "\" nullDC_Win32_Release.exe
popd

echo

Iska
27-06-2017, 11:29
В задумке - BAT-ник находит exe-фай, в директории находящейся папкой выше, »
Находит все исполняемые файлы в каталоге на уровень выше текущего и всех вложенных в него

переименовывает »
Неправильно переименовывает. Что должно означать это:
ren "%%i" "nullDC_Win32_Release!%%~xi" »
?

megaloman
28-06-2017, 08:26
@Echo Off

Set "Exe=nullDC_Win32_Release.exe"

Set "DirBat=%~dp0"
FOR /F "delims=" %%d IN ("%DirBat:~0,-1%") DO Pushd "%%~dpd"

FOR %%f IN (*.exe) DO If Not Exist "%Exe%" Ren "%%f" "%Exe%"

If Exist "%Exe%" Start " " /Realtime "%Exe%"
Popd

Ka3hak
29-06-2017, 03:33
megaloman спасибо Вам большое! Всё отрабатывает как надо, только вот ещё один момент...
Можно ли прикрутить исключение по имени exe-шника, например с названием "exeshnik.exe"?
Ну, чтобы переименовывало любой первый .exe, кроме указанного в исключении. А ещё лучше - нескольких указанных: "exeshnik1.exe", "exeshnik2.exe".

megaloman
29-06-2017, 12:49
@Echo Off

Set "Exe=nullDC_Win32_Release.exe"
Set "Exclude="exe1.exe" "exe2.exe" "exe3.exe""

Set "DirBat=%~dp0"
FOR /F "delims=" %%d IN ("%DirBat:~0,-1%") DO Pushd "%%~dpd"

FOR %%f IN (*.exe) DO If Not Exist "%Exe%" (
Echo %Exclude% | Find /I """%%f""" >nul ||Ren "%%f" "%Exe%"
)
If Exist "%Exe%" Start " " /Realtime "%Exe%"

Popd

Ka3hak
30-05-2018, 20:47
Добрый вечер megaloman! Тут ещё вопросик возник...
Касательно кода:
@Echo OFF

Set "cfgIn0=..\..\..\nullDC.cfg"
Set Rep="BufferSize=2048"

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%)

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
Я так понимаю, что зачёркнутые строки не особо нужны. Это ведь всего лишь сообщение "Файл не найден"?
И ещё момент вот в чём... Как мне прикрутить сюда скрипт .VBS, для того, чтобы .BAT-ник отрабатывал в скрытом режиме, ну т.е. - никаких консольных окон (даже на долю секунды).
Я использовал также Bat To Exe Converter для превращения .BAT-ников в .exe-шники, но этот вариант меня не совсем устраивает, т.к. VirusTotal видит их как Trojan-ов.
Так как в планах размещать свой проект на форумах, то опасаюсь что начнётся паника (ну, вы понимаете).

Iska
30-05-2018, 21:33
Я так понимаю, что зачёркнутые строки не особо нужны. Это ведь всего лишь сообщение "Файл не найден"? »
Они нужны для того, чтобы не возникало панических сообщений вида: «А!!!!!! НИЧО НЕ РАБОТАЕТ!!!!».

Как мне прикрутить сюда скрипт .VBS, для того, чтобы .BAT-ник отрабатывал в скрытом режиме, ну т.е. - никаких консольных окон (даже на долю секунды).
Я использовал также Bat To Exe Converter для превращения .BAT-ников в .exe-шники, но этот вариант меня не совсем устраивает, т.к. VirusTotal видит их как Trojan-ов. »
Проще всего — переписать весь код на WSH, дабы не громоздить Пелион на Оссу. Можно даже не переписывать, а взять любой из готовых вариантов VBScript-кода для работы с ini-файлами.

Ka3hak
07-06-2018, 01:04
Окей, продолжаем тему BAT. Вопрос к megaloman. Повторяюсь к megaloman!!! Уповаю на ваше Величие в познаниях BAT.
Как прикрутить к BAT-нику таймер на внесение изменений в параметр Set Rep="BufferSize=2048"?
Т.е. сначала вносится значение "2048" и после, ~через 5 сек. значение меняется на "4096", либо строка целиком - на строку Set Rep="BufferSize=4096" (не суть)
@Echo OFF

Set "cfgIn0=..\..\..\nullDC.cfg"
Set Rep="BufferSize=2048"

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%)

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
Если такое конечно возможно... Если НЕТ - тогда, вероятно, необходимо использовать 2-ой BAT-файл, который будет отрабатывать не сразу после запуска,
а по истечении (в нашем примере) 5-ти сек. Надеюсь понятно изложил суть ;)

megaloman
07-06-2018, 14:22
@Echo Off

Set "cfgIn0=Box_In\nullDC.cfg"

Call :Main "BufferSize=2048" "Dreamcast.Region=333" "Dreamcast.Broadcast=444" "Dreamcast.RTC=5552127595098"

Timeout /T 5 >nul
rem ping -n 5 127.0.0.1>nul

Call :Main "BufferSize=4096" "Dreamcast.Region=aaa333" "Dreamcast.Broadcast=aaa444" "Dreamcast.RTC=aaa5552127595098"

GoTo :Eof

:Main
Set Rep=%*

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:
Exit /B 1
)
.....................................
.....................................
Таймаут организован утилитой Timeout (начиная, по крайней мере, с Win 7, она присутствует в системе. В противном случае таймаут можно организовать через Ping (в моём примере он закомментирован)
Если не хотите видеть аварийное сообщение (а это плохо, батник не работает, а в чём дело, не понятно) лучше не полностью убрать If, а сделать If Not Exist "%cfgIn%" Exit /B 1, чтобы сохранилась хотя бы предсказуемость работы скрипта
Моё Величие в познаниях BAT весьма скромное

Ka3hak
10-06-2018, 18:29
megaloman Вы ВОЛШЕБНИК!!! Всё прекрасно работает! И крайний вопросик на будущее...
BAT-ник никак не хочет отрабатывать в файле подобного содержания:
/*-----------------------------------------------------------.
/ Choose effects /
'-----------------------------------------------------------*/

// Set to 1 for ON or 0 for OFF
#define USE_SMAA_ANTIALIASING 1 //[0 or 1]
#define USE_FXAA_ANTIALIASING 0 //[0 or 1]
#define USE_EXPLOSION 0 //[0 or 1]
#define USE_CARTOON 1 //[0 or 1]
#define USE_ADVANCED_CRT 0 //[0 or 1]
#define USE_BLOOM 1 //[0 or 1]
#define USE_HDR 1 //[0 or 1]
#define USE_SPLITSCREEN 1 //[0 or 1]
Не получается внести изменения в параметр строки #define USE_SPLITSCREEN
Я так понимаю, что мне мешает "испОлненное оглавление"(выделенное красным)
Этот момент как-нибудь обходится? Или нужен абсолютно другой, новый код?




© OSzone.net 2001-2012