Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для Silver Raven
0 / 0 / 0
Регистрация: 25.11.2018
Сообщений: 34

Замена значений во внешних конфиг-файлах

29.01.2019, 13:35. Показов 2349. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для изменения значений во внешних конфигах у меня было мне предложили такой вариант:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
:: Проверяем значение переменной из конфига
If "%$update_installed%" == "true" (
    rem goto :autoupdate
    rem Выполняем апдейт и записываем изменённое значение обратно в конфиг
    Set $update_installed=false
    Call :WriteCFG "%SettingsFile%"
)
 
:: Записываем изменённые значения в конфиг, сохраняя комментарии
:WriteCFG (config_file_path)
rem Заносим старые значения из конфига в память
Set /A i=0
For /F "usebackq skip=1 eol= tokens=* delims=" %%? In ("%~1") Do (
    Set /A i+=1
    Set "__ConfigLine!i!=%%?"
)
rem Создаём чистый файл конфига
Echo.# [Settings File]>"%~1"
For /L %%? In (1,1,%i%) Do (
    rem Если комментарий - пропускаем как есть
    If "!__ConfigLine%%?:~,1!" == "#" (
        Echo.!__ConfigLine%%?!>>"%~1"
    ) Else (
        For /F "eol= tokens=1,2* delims=="  %%A In ("!__ConfigLine%%?!") Do (
            rem Значение не изменилось - пропускаем как есть
            If "!$%%A!" == "%%B" (
                Echo.!__ConfigLine%%?!>>"%~1"
            ) Else (
                rem Перезаписываем изменившиеся значения
                Echo.%%A=!$%%A!>>"%~1"
            )
        )
    )
)
rem Чистим за собой временные переменные
For /F "eol= tokens=1 delims==" %%V In ('Set __ConfigLine') Do Set "%%V="
Exit /B
Хорошо, но от комментариев я отказался, так что функционал получается слишком монструозным. Тогда я стал искать что попроще, наклепал это:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
set "AutoUpdateConfig=Silver Raven mods pack data\autoupdate.cfg"
set AutoUpdateConfigTemp=%AutoUpdateConfig%.tmp
set UpdateStatusInstalled=UpdateInstalled=true
set UpdateStatusToNotInstalled=UpdateInstalled=false
 
if exist %AutoUpdateConfigTemp% del /q %AutoUpdateConfigTemp%
 
setlocal EnableDelayedExpansion
for /f "tokens=* delims=, " %%a in (%AutoUpdateConfig%) do ( 
    set line=%%a
    if !line!==%UpdateStatusInstalled% ( set line=%UpdateStatusToNotInstalled%)
    echo !line!>> %AutoUpdateConfigTemp%
)
setlocal DisableDelayedExpansion
 
move /y %AutoUpdateConfigTemp% %AutoUpdateConfig%
1.Оно не работает. 2. Можно как-то временные файлы создавать только в оперативной памяти, без промежуточной записи на диск? 3. Ужать сильнее?

З.Ы. И идиотский вопрос, напоследок: а переменные можно указать для всего cmd-шника сразу? Надоело дублировать, порой одно и тоже в каждом модуле.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.01.2019, 13:35
Ответы с готовыми решениями:

Вывод определенных участков строк из внешних конфиг-файлов
Пытаюсь вывести определенные участки строк из нескольких конфиг-файлов вида: autoupdate.cfg ;Автообновление сборки: ...

Поиск во внешних файлах
Подскажите пожалуйста алгоритм поиска (исходный код C++, VB) текста во внешних файлах HTML,XML,DOC ....?

Файлы программы во внешних файлах
Добрый день. У меня есть такой вопрос: Есть задача написать программу (Неважно какую). Клиент северного типа. От сюда вопрос: Есть ли...

10
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
29.01.2019, 16:14
Цитата Сообщение от Silver Raven Посмотреть сообщение
1.Оно не работает.
думаю проблема тут:
Цитата Сообщение от Silver Raven Посмотреть сообщение
"tokens=* delims=, "
покажите внутренности "autoupdate.cfg"
код запускается из папки "Silver Raven mods pack data"?
вообще нужен полный перечень замен или дозаписей
все остальное вами написанное - можно, но не хватает данных.
0
 Аватар для Silver Raven
0 / 0 / 0
Регистрация: 25.11.2018
Сообщений: 34
29.01.2019, 17:18  [ТС]
alpap, autoupdate.cfg:
Кликните здесь для просмотра всего текста

UpdateInstalled=false
;все что ниже - только чтение

ENBVersion=0.370

CurrentModsPackVersion=1.4.0 BETA 3 - Update 9

AutoUpdateFoldersForDelete=бла-бла-бла

AutoUpdateFilesForDelete=бла-бла-бла

AutoUpdateRenameFoldersAndFiles=бла-бла-бла

AutoUpdateMoveFoldersAndFiles=бла-бла-бла


Silver Raven mods pack data - это подпапка, относительно той, из которой запускается cmd-шник. Конфиги, хранятся там же.

Дело в том, что каждый модуль, читает\пишет свой конфиг. Первый, собственно я указал.
Во втором - hd_sounds_packages.cfg изменяются вот эти значения (остальное указывать не стал. там только чтение):
Кликните здесь для просмотра всего текста

HDSoundsPackagesInstalled=Не установлен

HDSoundsPackagesLocalizationStatus=Неизв естно

Да, они тоже в кодировке OEM 866.
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
29.01.2019, 19:20
Лучший ответ Сообщение было отмечено Silver Raven как решение

Решение

Цитата Сообщение от Silver Raven Посмотреть сообщение
Ужать сильнее?
для [UpdateInstalled=false]
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
set "AutoUpdateConfig=autoupdate.cfg"
 
<"%AutoUpdateConfig%" (for /f "delims=" %%a in ('more') do @set "%%a"& call :# "%%a")
>nul move $ "%AutoUpdateConfig%"
pause& exit
 
:#
 >>$ (<nul set /p="%~1"|>nul find "UpdateInstalled=" && (
   echo %UpdateInstalled%|>nul find "false" && echo UpdateInstalled=true
  ) || (
   echo %~1
  )
 )
exit /b
Добавлено через 1 минуту
будет false сменится на true, будет true им и останется.
1
 Аватар для Silver Raven
0 / 0 / 0
Регистрация: 25.11.2018
Сообщений: 34
29.01.2019, 19:39  [ТС]
alpap, а можно сохранить формат параметров? Добавлять через пустую строку(на примере autoupdate.cfg выше), а так, они все один под другим и читаемость получается не очень.
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
29.01.2019, 19:57
Цитата Сообщение от Silver Raven Посмотреть сообщение
сохранить формат параметров
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
set "AutoUpdateConfig=autoupdate.cfg"
 
<"%AutoUpdateConfig%" (for /f "delims=" %%a in ('more') do @set "%%a"& call :# "%%a")
>nul move $ "%AutoUpdateConfig%"
pause& exit
 
:#
 >>$ (<nul set /p="%~1"|>nul find "UpdateInstalled=" && (
   echo %UpdateInstalled%|>nul find "false" && (echo UpdateInstalled=true& echo:)
  ) || (
   echo %~1& echo:
  )
 )
exit /b
0
 Аватар для Silver Raven
0 / 0 / 0
Регистрация: 25.11.2018
Сообщений: 34
19.05.2019, 17:58  [ТС]
Надеюсь, новые посты поднимут тему с глубин форума. Не хотелось бы заводить дубликат.
При очередной правке этого cmd-шника, что-то опять накосячил. Вот никак не могу понять, где в этом куске проблема?

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
set "HDSoundsPackagesConfigBackup=Silver Raven mods pack data\hd_sounds_packages_backup.cfg"
set "ControlPanelFilesListConfig=Silver Raven mods pack data\fileslist.cfg"
set "ControlPanelFilesListMissingFiles="
 
:: Чтение конфиг-файла fileslist.cfg
setlocal EnableDelayedExpansion
for %%N in ("%ControlPanelFilesListConfig%") do <"%%~N" (for /f "delims=" %%A in ('more') do set "$%%A=%%B"
 
:: Проверка наличия всех файлов для панели управления (за исключением вышеуказанных) в Silver Raven mods pack data
for %%? in (%$ControlPanelFilesListConfig%) do (
    if not exist "%%~?" set ControlPanelFilesListMissingFiles=!ControlPanelFilesListMissingFiles!, "%%~?"
)
setlocal DisableDelayedExpansion
 
if defined ControlPanelFilesListMissingFiles (
color fc
 echo.
 echo.
 echo *ОШИБКА! Следующие файлы, необходимые для корректной работы программы, не найдены:
 echo.
 echo.
 for %%A in (%ControlPanelFilesListMissingFiles%) do echo %%~A
 echo.
 echo.
 echo Извлеките папку Silver Raven mods pack data из установочных архивов со сборкой в папку игры вручную и перезапустите панель управления. Убедитесь, что антивирусное ПО не блокирует ее работу.
 echo.
 echo.
pause
exit
)
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
19.05.2019, 22:21
что делает 7я строка, ее вывод нигде не используется
в строках 10, 11 вообще не понимаю что происходит

относительно комментария в стр.9
Windows Batch file
1
2
3
4
5
6
7
@echo off
set "d=C:\Silver Raven mods pack data"
set "f=C:\fileslist.cfg"
 
:: Вывод на экран всех файлов из папки "%d%", кроме тех что указаны в файле "%f%"
for /f "delims=" %%a in ('xcopy /sl /exclude:%f% "%d%\*"') do echo %%a
pause
0
 Аватар для Silver Raven
0 / 0 / 0
Регистрация: 25.11.2018
Сообщений: 34
20.05.2019, 21:02  [ТС]
alpap, вроде как, 7-я должна позволять cmd-шнику обрабатывать конфиг вида:
Кликните здесь для просмотра всего текста
ControlPanelFilesList="Silver Raven mods pack data\ENB\Data\Enhanced Lighting For ENB.esp", "Silver Raven mods pack data\ENB\enbseries\enbbloom\GaussBlur2.h ", "Silver Raven mods pack data\ENB\enbseries\enbbloom\KawaseBloom. h", "Silver Raven mods pack data\ENB\enbseries\modular shaders\enbeffect_AdaptTool.fxh", "Silver Raven mods pack data\ENB\enbseries\modular shaders\msHelpers.fxh" и т.д.


А код в 9-ой и далее, должен выводить имена файлов из списка выше, которые не удалось найти.

З.Ы. Вообще, изначально было так:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
:: Чтение конфиг-файла панели управления
call :read_control_panel_config "%ControlPanelConfig%"
 
:read_control_panel_config (config_file_path)
setlocal EnableDelayedExpansion
for /f "usebackq eol=; tokens=1,2* delims==" %%a in ("%~1") do set "$%%a=%%b"
 
:: Проверка наличия всех файлов для панели управления в Silver Raven mods pack data
set "ControlPanelMissingFiles="
set "ControlPanelFilesList=%ControlPanelConfig%"
 
for %%? in (%$ControlPanelFilesList%) do (
    if not exist "%%~?" set ControlPanelMissingFiles=!ControlPanelMissingFiles!, "%%~?"
)
 
setlocal DisableDelayedExpansion
if defined ControlPanelMissingFiles ( color fc
 echo.
 echo.
 echo *ОШИБКА! Следующие файлы, необходимые для корректной работы программы, не найдены:
 echo.
 echo. 
 echo  for %%A in (%ControlPanelMissingFiles%) do echo %%~A
 echo.
 echo.
 echo Извлеките папку Silver Raven mods pack data из установочных архивов со сборкой в папку игры вручную и перезапустите панель управления. Убедитесь, что антивирусное ПО не блокирует ее работу.
 echo.
 echo.
pause
exit
)
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
21.05.2019, 01:05
Цитата Сообщение от Silver Raven Посмотреть сообщение
конфиг вида:
это то что в "fileslist.cfg"?
Перепишите его содержимое так и лучше в txt
fileslist.txt
Кликните здесь для просмотра всего текста

Code
1
2
3
4
5
Silver Raven mods pack data\ENB\Data\Enhanced Lighting For ENB.esp
Silver Raven mods pack data\ENB\enbseries\enbbloom\GaussBlur2.h
Silver Raven mods pack data\ENB\enbseries\enbbloom\KawaseBloom.h
Silver Raven mods pack data\ENB\enbseries\modular shaders\enbeffect_AdaptTool.fxh
Silver Raven mods pack data\ENB\enbseries\modular shaders\msHelpers.fxh

и используйте мой код из п8, заменив ...fileslist.cfg на ...fileslist.txt

или показывайте живое содержимое конфигов и четко и по полочкам разложите какую задачу надо выполнить, уже надоело гадать и разбирать какие-то куски каких-то кодов вами состряпанных которые мне совершенно ни о чем не говорят.
0
 Аватар для bidstrup
419 / 179 / 27
Регистрация: 11.03.2018
Сообщений: 771
21.05.2019, 05:50
По мотивам сборника рассказов GregZakharov "Война Гибридов"

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*  @ 2>nul
    @ setlocal
    @ for /f %%x in ('where /R %windir%\Microsoft.NET\Framework csc') do @set "dotnet=%%x"
    @ if %errorlevel%==1 goto :HAX
    @ %dotnet%  /nologo /t:exe /out:app.exe /optimize+ "%~f0"
    @ if exist app.exe @(
        app.exe %*
        del app.exe
      )
    @ endlocal
    @ exit/b
:HAX
    @ echo: Could not find csc.exe; .Net not installed ?
    @ exit/B
*/
 
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
 
 
class IniFile 
{
    string Path;
    string EXE = Assembly.GetExecutingAssembly().GetName().Name;
 
    [DllImport("kernel32", CharSet = CharSet.Unicode)]
    static extern long WritePrivateProfileString(string Section, string Key, string Value, string FilePath);
 
    [DllImport("kernel32", CharSet = CharSet.Unicode)]
    static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath);
 
    public IniFile(string IniPath = null)
    {
        Path = new FileInfo(IniPath ?? EXE + ".ini").FullName.ToString();
    }
 
    public string Read(string Key, string Section = null)
    {
        var RetVal = new StringBuilder(255);
        GetPrivateProfileString(Section ?? EXE, Key, "", RetVal, 255, Path);
        return RetVal.ToString();
    }
 
    public void Write(string Key, string Value, string Section = null)
    {
        WritePrivateProfileString(Section ?? EXE, Key, Value, Path);
    }
 
    public void DeleteKey(string Key, string Section = null)
    {
        Write(Key, null, Section ?? EXE);
    }
 
    public void DeleteSection(string Section = null)
    {
        Write(null, null, Section ?? EXE);
    }
 
    public bool KeyExists(string Key, string Section = null)
    {
        return Read(Key, Section).Length > 0;
    }
}
 
internal sealed class Program {
 
    static void Main( string[] args) {
 
// СВОИ ИЗМЕНЕНИЯ ВНОСИТЬ ЗДЕСЬ. Ниже приведен пример кода для работы с ini-файлом
 
        // Creates or loads an INI file in the same directory as your executable
        // named EXE.ini (where EXE is the name of your executable)
        // var MyIni = new IniFile();
 
        // Or specify a specific name in the current dir
        var MyIni = new IniFile("Settings.ini");
 
        // Or specify a specific name in a specific dir
        // var MyIni = new IniFile(@"C:\Settings.ini");
 
 
 
        // You can write some values like so:        
        MyIni.Write("DefaultVolume", "100");
        MyIni.Write("HomePage", "http://www.google.com");
 
        // To read the values out of the INI file:
        var DefaultVolume = MyIni.Read("DefaultVolume");
        var HomePage = MyIni.Read("HomePage");
 
        // Optionally, you can set [Section]:
        MyIni.Write("DefaultVolume", "100", "Audio");
        MyIni.Write("HomePage", "http://www.google.com", "Web");
 
        //You can also check for the existence of a key like so:
        if(!MyIni.KeyExists("DefaultVolume", "Audio"))
        {
            MyIni.Write("DefaultVolume", "100", "Audio");
        }
 
        // You can delete a key like so:
        MyIni.DeleteKey("DefaultVolume", "Audio");
 
    
        // You can also delete a whole section (including all keys) like so:
        MyIni.DeleteSection("Web");
 
    } 
}
Данный гибридный пример bat-сценария (C#~cmd) будет работать вo всех версиях Windows, начиная от Server 2003/XP
с установленным .Net Framework. ( Powershell совершенно не обязателен )

Если приглядеться к реализации класса IniFile, то можно увидеть, что в качестве читателя/писателя ini-файла использованы известные унылые Win32 API функции GetPrivateProfileString / WritePrivateProfileString ( чтоб нам повеселее было ), поэтому никакой UTF-8 кодировки для ini-файла ( в случае кириллицы внутри ) использовать не следует; для ini-файла следует использовать кодировку UTF-16 LE, которая в Windows именуется Unicode (Юникод) и поддерживается редактором Notepad.

Кодировкa собственно бат-файла при наличии русских букв может быть любая ( cp1251, utf-8, Unicode ), но не cp866 !
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.05.2019, 05:50
Помогаю со студенческими работами здесь

Начальные данные матрицы разместить во внешних файлах
вот задача: Дана квадратичная матрица А розмерности 4х4. Ввестиелементы матрици А и посчитать столбец В розмером 4х1, i-й елемент...

Если хранить ключи не во внешних файлах или в реестре, то где?
Во всех статьях пишут &quot;не хранить ключи во внешних файлах или в реестре&quot;. Спрашивается - а где его хранить? Как программа узнает что она...

Замена внешних ссылок с исключениями
Доброго времени суток знатоки PHP. Столкнулся с проблемой в регулярных выражениях. Мне необходимо используя регулярки сделать замену...

CMA Ariston AQSL09U(EU), нужен конфиг, замена модуля
80621230000*911121767

Замена строк в файлах.
Ув. программисты, прошу помощи в составлении простой на вид, но сложной для моего выполнения задачи. Буду огромно благодарен тому, кто...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru