|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - CMD-шник с внешним конфиг-файлом |
|
CMD/BAT - CMD-шник с внешним конфиг-файлом
|
Stalker_AleX333
Сообщения: n/a |
Поскольку меня задолбало перед каждой из множества опцией конвертированного в exe cmd-шника, устанавливать проверки наличия необходимых файлов на своих местах и править его при любом чихе (ибо ее юзеры, любят творить дичь), я решил запилить нечто вроде внешнего конфиг файла, где будут храниться все постоянно изменяемые параметры.
1. Для проверки наличия файлов по списку, нарыл такой код: :: NoTot счётчик отсутствующих файлов set NoTot=0 :: NoFil перечень отсутствующих файлов set NoFil= :: перебор элементов заданного перечня for %%a in ("file 1.txt" "file 2.txt") do call :ChkFile %%a :: если всё в порядке - делаем то, что нужно if %NoTot% == 0 goto IfAllOk :: если чего-то нет - известим о факте echo ! Missed %NoTot% file(s) [%NoFil% ] goto :eof :ChkFile проверка наличия, учёт отсутствия файла if exist %1 goto :eof :: если файла нет, запомним имя и увеличим счётчик set NoFil=%NoFil% %1 set /a NoTot=%NoTot%+1 goto :eof :IfAllOk действия при наличии всех файлов из списка Скрытый текст
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 Silver Raven mods pack data\ENB\enbseries\textures\SMAA_AreaTex.dds Silver Raven mods pack data\ENB\enbseries\textures\SMAA_SearchTex.dds Silver Raven mods pack data\ENB\enbseries\textures\Firelut.png Silver Raven mods pack data\ENB\enbseries\textures\Firelut1.png Silver Raven mods pack data\ENB\enbseries\textures\Firelut2.png Silver Raven mods pack data\ENB\enbseries\enbadaptation.fx Silver Raven mods pack data\ENB\enbseries\enbbloom.fx Silver Raven mods pack data\ENB\enbseries\enbdepthoffield.fx Silver Raven mods pack data\ENB\enbseries\enbeffect.fx Silver Raven mods pack data\ENB\enbseries\enbeffectpostpass.fx Silver Raven mods pack data\ENB\enbseries\enblens.fx Silver Raven mods pack data\ENB\enbseries\enbsmaa.fx Silver Raven mods pack data\ENB\enbseries\SMAA.h Silver Raven mods pack data\ENB\enbseries\_weatherlist.ini Silver Raven mods pack data\ENB\enbseries\enbadaptation.fx.ini Silver Raven mods pack data\ENB\enbseries\enbbloom.fx.ini Silver Raven mods pack data\ENB\enbseries\enbdepthoffield.fx.ini Silver Raven mods pack data\ENB\enbseries\enbeffect.fx.ini Silver Raven mods pack data\ENB\enbseries\enbeffectpostpass.fx.ini Silver Raven mods pack data\ENB\enbseries\enblens.fx.ini Silver Raven mods pack data\ENB\enbseries\enbraindrops.png Silver Raven mods pack data\ENB\d3d11.dll Silver Raven mods pack data\ENB\d3dcompiler_46e.dll Да и в принципе, указывать любые отсутствующие файлы по списку не нужно, в случае их нехватки пойдет и что-то, вроде этого: if not exist "%что-угодно из списка%" ( color fc echo. echo ╔════════════════════════════════════════════════════════════╗ echo ║ Панель управления Silver Raven mods pack версии 1.4.0 BETA ║ echo ╚════════════════════════════════════════════════════════════╝ echo. echo. echo *ОШИБКА! Некоторые файлы, необходимые для корректной работы программы, не найдены. echo Извлеките папку Silver Raven mods pack data из установочных архивов со сборкой в папку игры и перезапустите панель управления. Убедитесь, что антивирусное ПО не блокирует ее работу. echo. echo. pause exit ) При каждом запуске cmd-шника, в config.cfg проверяется статус строки update_installed, если он = false игнорим и продолжаем свою работу. Если = true, тогда goto :autoupdate После выполнения кода в :autoupdate, меняем значение update_installed на = false. Аналогично, возможно ли указывать список файлов для переименования\перемещения\удаления во внешнем файле? cls del /f /q *список файлов ищем в config.cfg, в строке autoupdate_files_for_delete = * popd ) endlocal Возможно, я запутанно все описал и это идиотская утопия. И да, я знаю, что такое лучше сделать на чем-нибудь другом, ну тут уж так получилось. Надеюсь на вашу помощь! З.Ы. На Win XP никто запускать не будет. Доп. извращений не нужно. |
|
Отправлено: 19:47, 21-01-2019 |
Старожил Сообщения: 415
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Цитата Iska:
![]() |
||
Отправлено: 00:16, 22-01-2019 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Anonymоus:
![]() Цитата Anonymоus:
|
||
Отправлено: 00:59, 22-01-2019 | #12 |
Stalker_AleX333
Сообщения: n/a |
Anonymоus, вот это царский подгон. Благодарствую! (на некоторых форумах все спасибы в ЛС, как у нас не знаю, но не могу удержаться) Постараюсь разобраться с этим в ближайшее время. И надеюсь, не придется доканывать тупыми вопросами...
|
Отправлено: 01:44, 22-01-2019 | #13 |
Старожил Сообщения: 415
|
Профиль | Отправить PM | Цитировать Stalker_AleX333, тупых вопросов в программировании не бывает, любое желание разобраться, а не просто собрать Франкенштейна из кусков чужого кода — похвально. Если что-то будет не очевидно, спрашивайте, мне или остальным форумчанам не трудно объяснить будет или указать на ресурс, где можно об этом узнать.
|
Отправлено: 01:59, 22-01-2019 | #14 |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Цитата Anonymоus:
Цитата Anonymоus:
![]() Ну, а если студенту требуется решение в определенной среде, то ... лично мое мнение - мы оказываем медвежью услугу, предлагая студентам готовые решения. Цитата Anonymоus:
![]() Цитата Anonymоus:
Цитата Anonymоus:
|
|||||
------- Последний раз редактировалось YuS_2, 22-01-2019 в 11:09. Отправлено: 10:50, 22-01-2019 | #15 |
Stalker_AleX333
Сообщения: n/a |
Народ, а можно имена отсутствующих файлов из конфига выводить с новой строки?
![]() Так, читабельность не очень. Попробовал подергать delims, но это наверное не то, в данном случае. Код Anonymоus-а особо не трогал: :: Чтение конфиг-файла панели управления 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 ║ Панель управления Silver Raven mods pack версии 1.4.0 BETA ║ echo ╚════════════════════════════════════════════════════════════╝ echo. echo. echo *ОШИБКА! Следующие файлы, необходимые для корректной работы программы, не найдены: echo. echo. echo %ControlPanelMissingFiles:~2% echo. echo. echo Извлеките папку Silver Raven mods pack data из установочных архивов со сборкой в папку игры вручную и перезапустите панель управления. Убедитесь, что антивирусное ПО не блокирует ее работу. echo. echo. pause exit ) |
Отправлено: 23:10, 23-01-2019 | #16 |
Старожил Сообщения: 415
|
Профиль | Отправить PM | Цитировать Stalker_AleX333, конечно можно. Внесите следующие изменения:
For %%? In (%$ControlPanelFilesList%) Do ( If Not Exist "%%~?" set ControlPanelMissingFiles=!ControlPanelMissingFiles!,"%%~?" ) Echo *ОШИБКА! Следующие файлы, необходимые для корректной работы программы, не найдены: echo. echo. For %%A In (%ControlPanelMissingFiles%) Do Echo %%~A echo. echo. echo Извлеките папку Silver Raven mods pack data из установочных архивов со сборкой в папку игры вручную и перезапустите панель управления. Убедитесь, что антивирусное ПО не блокирует ее работу. |
Отправлено: 05:36, 28-01-2019 | #17 |
Stalker_AleX333
Сообщения: n/a |
Anonymоus, я вот думаю, а может можно как-то упростить изменение параметров в конфиг-файлах? У меня ведь все строго заданно:
вроде того-же, UpdateInstalled=true > UpdateInstalled=false Может можно обойтись без фильтра комментариев и временных файлов? Открыли строго указанный файл и заменили строго указанное значение. Все, остальное пофигу... Вот как-то так (но с временным файлом, правда и как надо не работает): 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% |
Отправлено: 23:13, 28-01-2019 | #18 |
Старожил Сообщения: 415
|
Профиль | Отправить PM | Цитировать Если честно, не вижу смысла в упрощении. Разве что на размере скрипта сэкономить? Так он всё равно в exe конвертируется.Для вашего случая может быть избыточно наличие тех же комментариев в конфиге, но можно ведь просто их не использовать?
Просто если вдруг в будущем понадобится добавить ещё что-то, в случае использования функции из моего примера никаких изменений вносить не понадобится, а ваш вариант со временем обрастёт кучей условий, когда скрипт панели управления будет прирастать функционалом. |
Отправлено: 19:07, 29-01-2019 | #19 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать Stalker_AleX333,
Вариант без временных файлов
@Echo Off cls If "%~1"=="" ( Set "Config=Z:\Soft_In\config.cfg" ) Else ( Set "Config=%~1" ) If Not Exist "%Config%" (Echo File "%Config%" not found &Pause &Exit /B) Set /A NConf=1000 FOR /F "usebackq delims=" %%s IN (`2^>nul more "%Config%"`) DO ( Set /A NConf+=1 Call Set "@@Conf%%NConf%%=%%s" Set "%%s" ) Set /A Replace=0 rem Отсутствуют файлы Set /A NAbs=0 FOR %%f IN (%FControl%) DO If Not Exist "%%f" ( Set /A NAbs+=1 Call Set "@@NoFile%%NAbs%%=%%~f" Echo File "%%~f" not found ) Echo. rem Отсутствующие файлы запомнили в переменных (если надо) If Not %NAbs%==0 (Echo. &Set "@@NoFile") Echo. rem Удаляем файлы FOR %%f IN (%DelFiles%) DO If Exist "%%f" Echo Del "%%~f" If /I "%update_installed%"=="true" Call :autoupdate rem Если какой-то параметр изменился, переписываем config If Not %Replace%==0 ( >"%Config%" (FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "@@Conf"`) DO Echo %%j) ) pause GoTo :Eof :autoupdate Echo Делаем :autoupdate Соответственно указываем, что конфиг изменится Call :Replace "update_installed" "false" Exit /B :Replace FOR /F "usebackq tokens=1,2 delims==" %%i IN (`2^>nul Set "@@Conf"`) DO ( If /I "%%~j"=="%~1" (Set "%%~i=%%~j=%~2" &Set /A Replace+=1) ) Exit /B В конфиге прописываются имена_переменной=значение При изменении переменной из конфига в функции :Replace соответствующую переменную с префиксом @@Conf записывается измененная строка конфига При наличии изменённых строк конфиг перепишется Лишнее отображение информации можно убрать Путь к конфигу можно указать в аргументе батника. Либо жестко прописать внутри Пример конфига |
------- Последний раз редактировалось megaloman, 29-01-2019 в 23:50. Отправлено: 22:20, 29-01-2019 | #20 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Общее - [статья]OOBE.cmd/SetupComplete.cmd/FirstLogon.cmd | alegz81 | Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista | 19 | 17-04-2018 08:18 | |
CMD/BAT - копирование файлов из одной папки в другую cmd файлом через txt файл | Marina_Egorova | Скриптовые языки администрирования Windows | 1 | 15-03-2018 22:36 | |
Перестал открываться DVD-шник | cahes | Оптические приводы | 3 | 18-06-2016 12:24 | |
[решено] Как запустить cmd-шник в окне, которое нельзя закрыть | KostyaTax | Microsoft Windows NT/2000/2003 | 6 | 04-07-2005 18:09 | |
не запускается ехе"шник | rivera | Хочу все знать | 2 | 20-06-2005 16:51 |
|