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

Компьютерный форум 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

 

Ветеран


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

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


Цитата Stalker_AleX333:
На Win XP никто запускать не будет. »
так пишите тогда на Powershell
зачем вам exe?

Отправлено: 20:30, 21-01-2019 | #2



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

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


Ветеран


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

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


Цитата Stalker_AleX333:
Доп. извращений не нужно. »
Куда уж:
Цитата Stalker_AleX333:
конвертированного в exe cmd-шника, »
больше-то .

Отправлено: 20:43, 21-01-2019 | #3

Stalker_AleX333


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

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


Busla, "знал бы прикуп, жил бы в Сочи" - изначально cmd-шник простенький был и со своими обязанностями вполне справлялся. А в Powershell-е я не бум-бум. Да и кода там уже столько, что в ближайшей перспективе времени не найдется на его переписывание. Если-бы был какой-нибудь конвертер...

Iska, это чисто от шаловливых ручонок, а не от моей прихоти.

Последний раз редактировалось Stalker_AleX333, 21-01-2019 в 21:58.


Отправлено: 21:46, 21-01-2019 | #4


Ветеран


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

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


Stalker_AleX333, если бы Вы обфусцировали скрипт WSH посредством Microsoft Script Encoder (при всей эфемерности подобной обфускации) — я бы понял: это легальный штатный способ. Но где и когда аукнется сконвертированный в исполняемый файл пакетный файл — кто его знает. Наконец, что может помешать тем же самым шаловливым ручкам ровно тем же самым образом пошалить в файле конфигурации?!

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

Stalker_AleX333


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

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


Цитата Iska:
Но где и когда аукнется сконвертированный в исполняемый файл пакетный файл — кто его знает. »
Эээ, тут я не очень понял, что имеется ввиду?

Цитата Iska:
Наконец, что может помешать тем же самым шаловливым ручкам ровно тем же самым образом пошалить в файле конфигурации?! »
Банальное не знание его местонахождения. А cmd-шник exe-шник лежит на видном месте и автоматически запускается после установки продукта. Ну и потом его можно дергать, в любой момент (тут пришлось еще и создавать проверку того, что процесс игрушки, известной в народе как Скайрим, с файлами которой он работает - не запущен).

Отправлено: 22:17, 21-01-2019 | #6


Ветеран


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

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


Цитата Stalker_AleX333:
Эээ, тут я не очень понял, что имеется ввиду? »
Их поведение не всегда предсказуемо.

Цитата Stalker_AleX333:
Банальное не знание его местонахождения. »
Ну, если о местоположении файла конфигурации знает исполняемый файл, то найти его проблем не составит. Так или иначе, Вы теряете главное, что есть в скриптах/пакетных файлах — простой процесс внесения в них корректировок.

Отправлено: 22:35, 21-01-2019 | #7

Stalker_AleX333


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

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


Цитата Iska:
Их поведение не всегда предсказуемо. »
Кто знает. Откатить все назад я всегда могу.

Цитата Iska:
Ну, если о местоположении файла конфигурации знает исполняемый файл, то найти его проблем не составит. »
Для этого нужно понимание и цель. ЦА - простые игроки, пожмакали пару кнопочек, прога сделала им что нужно и все, все довольны. Ковырять такие вещи, станут разве что сторонники теории вирусов\троянов\шифровальшиков. Хотя, для последних есть инструкция как все сделать в ручную (хоть это и долго, неудобно) и ссылки на онлайн проверку в антивирусных лабораториях. Да и запретить не могу. Хотят - ради бога, пусть ищут то, чего нет. Будут буянить - дам исходники и отчеты сканирования, у меня секретов нет. "Продукт" не коммерческий.

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


Отправлено: 22:55, 21-01-2019 | #8


Старожил


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

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


Смотрю, здесь как и раньше, упорно советуют переходить на PowerShell, и только потом, неохотно и со скрипом помогают. Имхо, если человеку не хватает возможностей cmd, он уже сразу на Python перейдёт, и не будет привязан к платформе, если что. А уж если просит батник, то не потому, что такой ретроград и не хочет пользоваться чистеньким и новеньким павершеллом, а потому что только с батниками и умеет работать, в 70% случаев. Оставшееся спишем на банальное "да без разницы на чём, лишь бы проблему решить".

Stalker_AleX333, держите пример нужного вам. Здесь есть чтение из конфига, запись в конфиг (с сохранением комментариев), проверка на существование файлов. Это именно пример, к своему скрипту прикрутите самостоятельно.
Если непонятен принцип работы — спрашивайте, постараюсь объяснить.
Код: Выделить весь код
@Echo Off
Setlocal EnableDelayedExpansion
Set SettingsFile=config.txt

Call :ReadCFG "%SettingsFile%"

:: Проверяем, существуют ли файлы
Set "MissingFiles[]="
For %%? In (%$RequiredFiles[]%) Do (
	If Not Exist "%%~?" Set MissingFiles[]=!MissingFiles[]!, %%~?
)
If Defined MissingFiles[] (
	Echo [ОШИБКА] Некоторые файлы, необходимые для корректной работы программы, не найдены:
	Echo %MissingFiles[]:~2%
	Echo Извлеките папку Silver Raven mods pack data из установочных архивов со сборкой в папку игры и перезапустите панель управления. Убедитесь, что антивирусное ПО не блокирует ее работу.
)

:: Проверяем значение переменной из конфига
If "%$update_installed%" == "true" (
	rem goto :autoupdate
	rem Выполняем апдейт и записываем изменённое значение обратно в конфиг
	Set $update_installed=false
	Call :WriteCFG "%SettingsFile%"
)

Pause&Exit



:: Читаем настройки из файла, игнорируем комментарии и устанавливаем переменные $имя=значение
:ReadCFG (config_file_path)
	For /F "usebackq eol=# tokens=1,2* delims==" %%A In ("%~1") Do Set "$%%A=%%B"
Exit /B

:: Записываем изменённые значения в конфиг, сохраняя комментарии
: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
И пример конфиг-файла:
Код: Выделить весь код
# [Settings File]
# Файлы для проверки при запуске
RequiredFiles[]="E:\repo\vichan-ng\LICENSE.md", "E:\repo\vichan-ng\.installed", "E:\repo\vichan-ng\.gitignore", ".\..\memcard.7z"
update_installed=true
# Переменная - значение
Key=Value

Последний раз редактировалось Anonymоus, 22-01-2019 в 01:28.

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

Отправлено: 23:39, 21-01-2019 | #9


Ветеран


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

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


Цитата Anonymоus:
и не будет привязан к платформе, если что. »
Он будет привязан к Python'у .

Anonymоus, Вы где пропадали столько времени , коллега?

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



Компьютерный форум 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




 
Переход