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

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

Ответить
Настройки темы
CMD/BAT - CMD-шник с внешним конфиг-файлом
Stalker_AleX333


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

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


Изменения
Автор: Stalker_AleX333
Дата: 30-01-2019
Поскольку меня задолбало перед каждой из множества опцией конвертированного в 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\config.cfg (там еще и другие данные. надо как-то обозначить границы)?
Скрытый текст

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
)
2. Есть код поиска текстовых строк во внешних файлах. Как его модифицировать для проверки и изменения параметров. Например:

При каждом запуске 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
autoupdate_files_for_delete = "Data\SKSE\EngineFixes64.*" "Data\SKSE\EngineFixes64_SNCT.*" "Data\RaceMenuPlugin.*" и т.д. и т.п.

Возможно, я запутанно все описал и это идиотская утопия. И да, я знаю, что такое лучше сделать на чем-нибудь другом, ну тут уж так получилось. Надеюсь на вашу помощь!
З.Ы. На Win XP никто запускать не будет. Доп. извращений не нужно.

Отправлено: 19:47, 21-01-2019

 

Старожил


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

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


Цитата Iska:
Он будет привязан к Python'у . »
Ну... верно, с этим ничего не поделаешь, но на *nix системах он уже стоит, а для win платформы, если цель — не запустить у себя, а распространять скрипт на клиентские машины, можно и статический билд сделать со вшитым интерпретатором и библиотеками.
Цитата Iska:
Anonymоus, Вы где пропадали столько времени , коллега? »
Переезды, перемены, не всегда был интернет и свободное время. Каюсь, уже долго не заходил сюда

Отправлено: 00:16, 22-01-2019 | #11



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

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


Ветеран


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

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


Цитата Anonymоus:
можно и статический билд сделать со вшитым интерпретатором и библиотеками. »
…и мы возвращаемся к тому, с чего начали — невозможность быстрой правки и использования кода .

Цитата Anonymоus:
Переезды, перемены, не всегда был интернет и свободное время. Каюсь, уже долго не заходил сюда »
Спасибо, ясно.

Отправлено: 00:59, 22-01-2019 | #12

Stalker_AleX333


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

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


Anonymоus, вот это царский подгон. Благодарствую! (на некоторых форумах все спасибы в ЛС, как у нас не знаю, но не могу удержаться) Постараюсь разобраться с этим в ближайшее время. И надеюсь, не придется доканывать тупыми вопросами...

Отправлено: 01:44, 22-01-2019 | #13


Старожил


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

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


Stalker_AleX333, тупых вопросов в программировании не бывает, любое желание разобраться, а не просто собрать Франкенштейна из кусков чужого кода — похвально. Если что-то будет не очевидно, спрашивайте, мне или остальным форумчанам не трудно объяснить будет или указать на ресурс, где можно об этом узнать.

Отправлено: 01:59, 22-01-2019 | #14


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Anonymоus:
Смотрю, здесь как и раньше, упорно советуют переходить на PowerShell, и только потом, неохотно и со скрипом помогают. »
Просто, надежно и быстро ... а cmd не обладает такими возможностями, как powershell... да и powershell, нынче, изкаропки командный шелл по умолчанию

Цитата Anonymоus:
Оставшееся спишем на банальное "да без разницы на чём, лишь бы проблему решить". »
как правило, если надо ехать, то на шашечки внимание обращать не приходится
Ну, а если студенту требуется решение в определенной среде, то ... лично мое мнение - мы оказываем медвежью услугу, предлагая студентам готовые решения.

Цитата Anonymоus:
Имхо, если человеку не хватает возможностей cmd, он уже сразу на Python перейдёт »
Это почему? Мне, например, за глаза хватает встроенных средств. Зачем тащить в систему сторонние разработки, если необходимые инструменты уже присутствуют в этой системе?

Цитата Anonymоus:
для win платформы»
на win платформах powershell уже стоит

Цитата Anonymоus:
на *nix системах »
для *nix - Powershell Core, однако...

-------
scio me nihil scire. Ѫ


Последний раз редактировалось 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
Благодарности: 257

Профиль | Отправить 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
Благодарности: 257

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


Если честно, не вижу смысла в упрощении. Разве что на размере скрипта сэкономить? Так он всё равно в exe конвертируется.Для вашего случая может быть избыточно наличие тех же комментариев в конфиге, но можно ведь просто их не использовать?
Просто если вдруг в будущем понадобится добавить ещё что-то, в случае использования функции из моего примера никаких изменений вносить не понадобится, а ваш вариант со временем обрастёт кучей условий, когда скрипт панели управления будет прирастать функционалом.
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:07, 29-01-2019 | #19


Ветеран


Contributor


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

Профиль | Отправить 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
Каждой строке конфига соответствует переменная @@Conf1001, @@Conf1002 ...
В конфиге прописываются имена_переменной=значение
При изменении переменной из конфига в функции :Replace соответствующую переменную с префиксом @@Conf записывается измененная строка конфига
При наличии изменённых строк конфиг перепишется
Лишнее отображение информации можно убрать
Путь к конфигу можно указать в аргументе батника. Либо жестко прописать внутри

Пример конфига
Код: Выделить весь код
FControl="D:\CMD_Forum\Box_In\3 Box_In.txt" C:\kuku.exe "Z:\Box_In\Errors\исходный файл.TXT" "D:\тра ля ля.doc"
DelFiles="Z:\Soft_Out\190124.csv" "Z:\Soft_Out\190125.csv" "Z:\Soft_Out\190126.csv"
update_installed=true

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


Последний раз редактировалось megaloman, 29-01-2019 в 23:50.


Отправлено: 22:20, 29-01-2019 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Общее - [статья]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




 
Переход