Показать полную графическую версию : CMD-шник с внешним конфиг-файлом
Stalker_AleX333
21-01-2019, 19:47
Поскольку меня задолбало перед каждой из множества опцией конвертированного в 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 никто запускать не будет. Доп. извращений не нужно.
На Win XP никто запускать не будет. »
так пишите тогда на Powershell
зачем вам exe?
Доп. извращений не нужно. »
Куда уж:
конвертированного в exe cmd-шника, »
больше-то ;).
Stalker_AleX333
21-01-2019, 21:46
Busla, "знал бы прикуп, жил бы в Сочи" - изначально cmd-шник простенький был и со своими обязанностями вполне справлялся. А в Powershell-е я не бум-бум. Да и кода там уже столько, что в ближайшей перспективе времени не найдется на его переписывание. Если-бы был какой-нибудь конвертер...
Iska, это чисто от шаловливых ручонок, а не от моей прихоти.
Stalker_AleX333, если бы Вы обфусцировали скрипт WSH посредством Microsoft Script Encoder (при всей эфемерности подобной обфускации) — я бы понял: это легальный штатный способ. Но где и когда аукнется сконвертированный в исполняемый файл пакетный файл — кто его знает. Наконец, что может помешать тем же самым шаловливым ручкам ровно тем же самым образом пошалить в файле конфигурации?!
Stalker_AleX333
21-01-2019, 22:17
Но где и когда аукнется сконвертированный в исполняемый файл пакетный файл — кто его знает. »
Эээ, тут я не очень понял, что имеется ввиду?
Наконец, что может помешать тем же самым шаловливым ручкам ровно тем же самым образом пошалить в файле конфигурации?! »
Банальное не знание его местонахождения. А cmd-шник exe-шник лежит на видном месте и автоматически запускается после установки продукта. Ну и потом его можно дергать, в любой момент (тут пришлось еще и создавать проверку того, что процесс игрушки, известной в народе как Скайрим, с файлами которой он работает - не запущен).
Эээ, тут я не очень понял, что имеется ввиду? »
Их поведение не всегда предсказуемо.
Банальное не знание его местонахождения. »
Ну, если о местоположении файла конфигурации знает исполняемый файл, то найти его проблем не составит. Так или иначе, Вы теряете главное, что есть в скриптах/пакетных файлах — простой процесс внесения в них корректировок.
Stalker_AleX333
21-01-2019, 22:55
Их поведение не всегда предсказуемо. »
Кто знает. Откатить все назад я всегда могу.
Ну, если о местоположении файла конфигурации знает исполняемый файл, то найти его проблем не составит. »
Для этого нужно понимание и цель. ЦА - простые игроки, пожмакали пару кнопочек, прога сделала им что нужно и все, все довольны. Ковырять такие вещи, станут разве что сторонники теории вирусов\троянов\шифровальшиков. Хотя, для последних есть инструкция как все сделать в ручную (хоть это и долго, неудобно) и ссылки на онлайн проверку в антивирусных лабораториях. Да и запретить не могу. Хотят - ради бога, пусть ищут то, чего нет. Будут буянить - дам исходники и отчеты сканирования, у меня секретов нет. "Продукт" не коммерческий.
Anonymоus
21-01-2019, 23:39
Смотрю, здесь как и раньше, упорно советуют переходить на 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
и не будет привязан к платформе, если что. »
Он будет привязан к Python'у :).
Anonymоus, Вы где пропадали столько времени ;), коллега?
Anonymоus
22-01-2019, 00:16
Он будет привязан к Python'у . »
Ну... верно, с этим ничего не поделаешь, но на *nix системах он уже стоит, а для win платформы, если цель — не запустить у себя, а распространять скрипт на клиентские машины, можно и статический билд сделать со вшитым интерпретатором и библиотеками.
Anonymоus, Вы где пропадали столько времени , коллега? »
Переезды, перемены, не всегда был интернет и свободное время. Каюсь, уже долго не заходил сюда :sorry:
можно и статический билд сделать со вшитым интерпретатором и библиотеками. »
…и мы возвращаемся к тому, с чего начали — невозможность быстрой правки и использования кода ;).
Переезды, перемены, не всегда был интернет и свободное время. Каюсь, уже долго не заходил сюда »
Спасибо, ясно.
Stalker_AleX333
22-01-2019, 01:44
Anonymоus, вот это царский подгон. Благодарствую! (на некоторых форумах все спасибы в ЛС, как у нас не знаю, но не могу удержаться) Постараюсь разобраться с этим в ближайшее время. И надеюсь, не придется доканывать тупыми вопросами...
Anonymоus
22-01-2019, 01:59
Stalker_AleX333, тупых вопросов в программировании не бывает, любое желание разобраться, а не просто собрать Франкенштейна из кусков чужого кода — похвально. Если что-то будет не очевидно, спрашивайте, мне или остальным форумчанам не трудно объяснить будет или указать на ресурс, где можно об этом узнать.
Смотрю, здесь как и раньше, упорно советуют переходить на PowerShell, и только потом, неохотно и со скрипом помогают. »
Просто, надежно и быстро ... а cmd не обладает такими возможностями, как powershell... да и powershell, нынче, изкаропки командный шелл по умолчанию (https://support.microsoft.com/ru-kz/help/4027690/windows-powershell-is-replacing-command-prompt)
Оставшееся спишем на банальное "да без разницы на чём, лишь бы проблему решить". »
как правило, если надо ехать, то на шашечки внимание обращать не приходится :)
Ну, а если студенту требуется решение в определенной среде, то ... лично мое мнение - мы оказываем медвежью услугу, предлагая студентам готовые решения.
Имхо, если человеку не хватает возможностей cmd, он уже сразу на Python перейдёт »
Это почему? Мне, например, за глаза хватает встроенных средств. Зачем тащить в систему сторонние разработки, если необходимые инструменты уже присутствуют в этой системе? :)
для win платформы»
на win платформах powershell уже стоит
на *nix системах »
для *nix - Powershell Core, однако...
Stalker_AleX333
23-01-2019, 23:10
Народ, а можно имена отсутствующих файлов из конфига выводить с новой строки?
http://j-p-g.net/it/2019/01/23/0220399001548274102.jpg (http://j-p-g.net/if/2019/01/23/0220399001548274102.jpg.html)
Так, читабельность не очень. Попробовал подергать 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
)
Anonymоus
28-01-2019, 05:36
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 из установочных архивов со сборкой в папку игры вручную и перезапустите панель управления. Убедитесь, что антивирусное ПО не блокирует ее работу.
Изменившиеся части выделены синим.
Stalker_AleX333
28-01-2019, 23:13
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%
Anonymоus
29-01-2019, 19:07
Если честно, не вижу смысла в упрощении. Разве что на размере скрипта сэкономить? Так он всё равно в exe конвертируется.Для вашего случая может быть избыточно наличие тех же комментариев в конфиге, но можно ведь просто их не использовать?
Просто если вдруг в будущем понадобится добавить ещё что-то, в случае использования функции из моего примера никаких изменений вносить не понадобится, а ваш вариант со временем обрастёт кучей условий, когда скрипт панели управления будет прирастать функционалом.
megaloman
29-01-2019, 22:20
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
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.