![]() |
CMD-шник с внешним конфиг-файлом
Поскольку меня задолбало перед каждой из множества опцией конвертированного в exe cmd-шника, устанавливать проверки наличия необходимых файлов на своих местах и править его при любом чихе (ибо ее юзеры, любят творить дичь), я решил запилить нечто вроде внешнего конфиг файла, где будут храниться все постоянно изменяемые параметры.
1. Для проверки наличия файлов по списку, нарыл такой код: Код:
:: NoTot счётчик отсутствующих файлов Скрытый текст
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 При каждом запуске cmd-шника, в config.cfg проверяется статус строки update_installed, если он = false игнорим и продолжаем свою работу. Если = true, тогда goto :autoupdate После выполнения кода в :autoupdate, меняем значение update_installed на = false. Аналогично, возможно ли указывать список файлов для переименования\перемещения\удаления во внешнем файле? Код:
cls Возможно, я запутанно все описал и это идиотская утопия. И да, я знаю, что такое лучше сделать на чем-нибудь другом, ну тут уж так получилось. Надеюсь на вашу помощь! З.Ы. На Win XP никто запускать не будет. Доп. извращений не нужно. |
Цитата:
зачем вам exe? |
|
Busla, "знал бы прикуп, жил бы в Сочи" - изначально cmd-шник простенький был и со своими обязанностями вполне справлялся. А в Powershell-е я не бум-бум. Да и кода там уже столько, что в ближайшей перспективе времени не найдется на его переписывание. Если-бы был какой-нибудь конвертер...
Iska, это чисто от шаловливых ручонок, а не от моей прихоти. |
Stalker_AleX333, если бы Вы обфусцировали скрипт WSH посредством Microsoft Script Encoder (при всей эфемерности подобной обфускации) — я бы понял: это легальный штатный способ. Но где и когда аукнется сконвертированный в исполняемый файл пакетный файл — кто его знает. Наконец, что может помешать тем же самым шаловливым ручкам ровно тем же самым образом пошалить в файле конфигурации?!
|
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Смотрю, здесь как и раньше, упорно советуют переходить на PowerShell, и только потом, неохотно и со скрипом помогают. Имхо, если человеку не хватает возможностей cmd, он уже сразу на Python перейдёт, и не будет привязан к платформе, если что. А уж если просит батник, то не потому, что такой ретроград и не хочет пользоваться чистеньким и новеньким павершеллом, а потому что только с батниками и умеет работать, в 70% случаев. Оставшееся спишем на банальное "да без разницы на чём, лишь бы проблему решить".
Stalker_AleX333, держите пример нужного вам. Здесь есть чтение из конфига, запись в конфиг (с сохранением комментариев), проверка на существование файлов. Это именно пример, к своему скрипту прикрутите самостоятельно. Если непонятен принцип работы — спрашивайте, постараюсь объяснить. Код:
@Echo Off Код:
# [Settings File] |
Цитата:
Anonymоus, Вы где пропадали столько времени ;), коллега? |
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Anonymоus, вот это царский подгон. Благодарствую! (на некоторых форумах все спасибы в ЛС, как у нас не знаю, но не могу удержаться) Постараюсь разобраться с этим в ближайшее время. И надеюсь, не придется доканывать тупыми вопросами...
|
Stalker_AleX333, тупых вопросов в программировании не бывает, любое желание разобраться, а не просто собрать Франкенштейна из кусков чужого кода — похвально. Если что-то будет не очевидно, спрашивайте, мне или остальным форумчанам не трудно объяснить будет или указать на ресурс, где можно об этом узнать.
|
Цитата:
Цитата:
Ну, а если студенту требуется решение в определенной среде, то ... лично мое мнение - мы оказываем медвежью услугу, предлагая студентам готовые решения. Цитата:
Цитата:
Цитата:
|
Народ, а можно имена отсутствующих файлов из конфига выводить с новой строки?
![]() Так, читабельность не очень. Попробовал подергать delims, но это наверное не то, в данном случае. Код Anonymоus-а особо не трогал: Код:
:: Чтение конфиг-файла панели управления |
Stalker_AleX333, конечно можно. Внесите следующие изменения:
Код:
For %%? In (%$ControlPanelFilesList%) Do ( Код:
Echo *ОШИБКА! Следующие файлы, необходимые для корректной работы программы, не найдены: |
Anonymоus, я вот думаю, а может можно как-то упростить изменение параметров в конфиг-файлах? У меня ведь все строго заданно:
вроде того-же, UpdateInstalled=true > UpdateInstalled=false Может можно обойтись без фильтра комментариев и временных файлов? Открыли строго указанный файл и заменили строго указанное значение. Все, остальное пофигу... Вот как-то так (но с временным файлом, правда и как надо не работает): Код:
set AutoUpdateConfigTemp=%AutoUpdateConfig%.tmp |
Если честно, не вижу смысла в упрощении. Разве что на размере скрипта сэкономить? Так он всё равно в exe конвертируется.Для вашего случая может быть избыточно наличие тех же комментариев в конфиге, но можно ведь просто их не использовать?
Просто если вдруг в будущем понадобится добавить ещё что-то, в случае использования функции из моего примера никаких изменений вносить не понадобится, а ваш вариант со временем обрастёт кучей условий, когда скрипт панели управления будет прирастать функционалом. |
Stalker_AleX333,
Вариант без временных файлов
Код:
@Echo Off В конфиге прописываются имена_переменной=значение При изменении переменной из конфига в функции :Replace соответствующую переменную с префиксом @@Conf записывается измененная строка конфига При наличии изменённых строк конфиг перепишется Лишнее отображение информации можно убрать Путь к конфигу можно указать в аргументе батника. Либо жестко прописать внутри Пример конфига Код:
FControl="D:\CMD_Forum\Box_In\3 Box_In.txt" C:\kuku.exe "Z:\Box_In\Errors\исходный файл.TXT" "D:\тра ля ля.doc" |
Вот что дали (захвачу соседний код, чтобы нагляднее было):
Код:
:: Перемещение папок и\или файлов Anonymоus, я придержу ваш вариант на будущее, прикрутить то не проблема. Просто пока вышло, что его функционал избыточен. У меня и так уже 3676 строк. Читать эту портянку то еще занятие. Ну сам виноват, надо было остановиться, пока стало не поздно... |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Скрытый текст
Основной.bat
Код:
@echo off Код:
@echo off |
Цитата:
Цитата:
Скрытый текст
![]() В нём всё замечательно видно, будь то хоть 1000 строк, хоть 10000 строк. |
|
Я вот что-то сломал и не пойму что, но оно теперь не работает:
Код:
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: И надо было о переменных подумать заранее. В разных модулях, порой приходится объявлять одни и те же. Цитата:
Цитата:
Цитата:
![]() |
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Хотя, я где-то читал, что ! можно забить так: ^^^! А так, я давно бы перенес все переменные в шапку cmd-шника. И объем кода заметно уменьшился. |
Цитата:
|
Цитата:
И кстати, без PowerShell-а создать ярлык с атрибутами и указанным путем к отображаемой иконке возможно? |
Stalker_AleX333, Попробуйте сначала так:
Код:
@Echo Off Код:
@Echo Off Если у Вас длинный код, для читаемости и удобства написания можно оформить отдельные функционально обусловленные куски в виде процедур, при необходимости применяя SetLocal - EndLocal А переменные в знаках ! - это уже другая песТня |
Цитата:
|
Iska, как-то так? Но это ж все PowerShell, да?
Код:
Set WshShell = WScript.CreateObject("WScript.Shell") Код:
Option Explicit |
|
Цитата:
|
Stalker_AleX333, а почему бы тогда не создавать ярлык им же?
|
Iska, а как он "узнает", по какому пути находится необходимый для запуска ярлыком файл? Пользователь же указывает путь распаковки вручную и там вроде нет команд для его передачи.
|
Цитата:
Например, я имею такое содержимое в каталоге C:\Мои проекты\0242: Код:
C:\Мои проекты\0242 Упаковываем его в самораспаковывающийся архив с таким комментарием: Код:
;Расположенный ниже комментарий содержит команды SFX-сценария |
Время: 19:10. |
Время: 19:10.
© OSzone.net 2001-