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

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

 
Stalker_AleX333


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

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


Вот что дали (захвачу соседний код, чтобы нагляднее было):

Код: Выделить весь код
:: Перемещение папок и\или файлов
cls
xcopy %AutoUpdateMoveFoldersAndFiles% /e /y /c /i
rd /s /q %AutoUpdateMoveFoldersAndFilesForDelete%

:: Читаем конфиг-файл и тут же пишем его вызывая из write_autoupdate_config, так, вроде?
<"%AutoUpdateConfig%" (for /f "delims=" %%a in ('more') do @set "%%a"& call :write_autoupdate_config "%%a")
>nul move $ "%AutoUpdateConfig%"
goto autoupdate_end

:: Пишем изменившиеся значения
:write_autoupdate_config
 >>$ (<nul set /p="%~1"|>nul find "UpdateInstalled=" && (
   echo %UpdateInstalled%|>nul find "true" && (echo UpdateInstalled=false& echo:)
  ) || (
   echo %~1& echo:
  )
 )
exit /b

:autoupdate_end
color f2
@echo.
@echo  ╔══════════════════════════════════════════╗
@echo  ║ Панель управления Silver Raven mods pack ║
@echo  ║             РЕЖИМ ОБНОВЛЕНИЯ             ║
@echo  ╚══════════════════════════════════════════╝
@echo.
@echo.
@echo ■ Операции с файлами сборки успешно завершены.
@echo.
@echo.
@echo Для корректной работы сборки, рекомендуется заново скопировать отсортированный список загрузки модов и файлы настроек игры. Если у вас уже установлены какие-либо дополнительные плагины, потребуется провести их повторную сортировку вручную.
@echo.
@echo.
pause
goto main_menu
Только не могу понять что в данном случае делют символы: < и >, >>. Ну и не очень нравиться прыжки туда сюда через goto и exit. Я бы в один код все засунул. Мне так удобнее.

Anonymоus, я придержу ваш вариант на будущее, прикрутить то не проблема. Просто пока вышло, что его функционал избыточен. У меня и так уже 3676 строк. Читать эту портянку то еще занятие. Ну сам виноват, надо было остановиться, пока стало не поздно...

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



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

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


Ветеран


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

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


Цитата Stalker_AleX333:
что в данном случае делют символы: < и >, >> »
<"%AutoUpdateConfig%" - чтение из файла (в переменной), равносильно: for /f "usebackq delims=" %%a in ("%AutoUpdateConfig%") do ...
Цитата Stalker_AleX333:
>>$ »
- запись во временный файл $ с дозаписью, поэтому >>, равносильно: echo stroka>>$
Цитата Stalker_AleX333:
не очень нравиться прыжки туда сюда через goto и exit »
ну это как кому, если правильно и наглядно организовано, то гораздо лучше наваленных строк
Цитата Stalker_AleX333:
Я бы в один код все засунул »
это надо пояснить, код в данном случае один, что имелось ввиду?
Цитата Stalker_AleX333:
У меня и так уже 3676 строк »
вот поэтому и удобнее подпрограммы с наглядными переходами, а еще можно практиковать такой вариант. Выделяете папку под задачу и складываете в нее отдельные bat файлы с осмысленными названиями, а в коде основного bat обращаетесь по call не к подпрограмме, а к одному из bat в папке, выглядит примерно так:

Скрытый текст
Основной.bat
Код: Выделить весь код
@echo off
:: Код
:: Обращение к одному из Вспомогательных1.bat
call "Вспомогательный1.bat" "параметр1" "параметр2" ...
:: Вернулись из "Вспомогательного1.bat" с какими-то результатами (новыми переменными)
:: Код
:: Обращение к одному из Вспомогательных2.bat
call "Вспомогательный2.bat" "параметр1" "параметр2" ...
:: Вернулись из "Вспомогательного2.bat" с какими-то результатами (новыми переменными)
:: Код
exit
Вспомогательный1.bat (и также другие)
Код: Выделить весь код
@echo off
:: Код (Какие-то новые переменные)
:: Заканчивать Вспомогательные.bat обязательно по exit /b (exit /b 0 или 1 ...)
exit /b

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


Ветеран


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

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


Цитата Stalker_AleX333:
Ну и не очень нравиться прыжки туда сюда через goto и exit. »
Не существует «прыжков через goto и exit». Либо goto-goto (простые переходы), либо call-exit /b (вызов квазипроцедуры). А goto и exit несовместимы в принципе. И в коде коллеги megaloman их нет. Есть пара именно квазипроцедур с вызовом по call и возвратом по exit /b, и один goto :eof.

Цитата Stalker_AleX333:
У меня и так уже 3676 строк. Читать эту портянку то еще занятие. »
Вот для того и разбивают код на части и организуют те самые процедуры. Или, возможно, у кого-то просто неудачно выбранный редактор . У меня такой:
Скрытый текст

В нём всё замечательно видно, будь то хоть 1000 строк, хоть 10000 строк.
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:36, 30-01-2019 | #23


Ветеран


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

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


Цитата Iska:
всё замечательно видно »
в AkeiPad тоже вполне так:
Скрытый текст

Последний раз редактировалось alpap, 05-04-2019 в 22:57.


Отправлено: 18:09, 30-01-2019 | #24

Stalker_AleX333


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

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


Я вот что-то сломал и не пойму что, но оно теперь не работает:
Код: Выделить весь код
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Проверка доступности файлов панели управления
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

set "HDSoundsPackagesConfigBackup=Silver Raven mods pack data\hd_sounds_packages_backup.cfg"
set "ControlPanelFilesListConfig=Silver Raven mods pack data\fileslist.cfg"
set "ControlPanelFilesListMissingFiles="

:: Проверяем наличие конфиг-файла hd_sounds_packages_backup.cfg от прошлой установки и устанавливаем его как основной
if exist "%HDSoundsPackagesConfigBackup%" (
del /f /q "Silver Raven mods pack data\hd_sounds_packages.cfg"
ren "%HDSoundsPackagesConfigBackup%" hd_sounds_packages.cfg
)

if not exist "%ControlPanelFilesListConfig%" (
cls
color fc
 echo.
 echo  ╔══════════════════════════════════════════╗
 echo  ║ Панель управления Silver Raven mods pack ║
 echo  ╚══════════════════════════════════════════╝
 echo.
 echo.
 echo *ОШИБКА! Файл конфигурации fileslist.cfg, необходимый для корректной работы программы, не найден.
 echo Извлеките его из установочных архивов со сборкой в папку Silver Raven mods pack data вручную и перезапустите панель управления. Убедитесь, что антивирусное ПО не блокирует ее работу.
 echo.
 echo.
pause
exit
)

:: Чтение конфиг-файла fileslist.cfg
setlocal EnableDelayedExpansion
for /f "tokens=1,2* delims==" %%A in ("%ControlPanelFilesListConfig%") do set "$%%A=%%B"

:: Проверка наличия всех файлов для панели управления в Silver Raven mods pack data
for %%? in (%$ControlPanelFilesListConfig%) do (
	if not exist "%%~?" set ControlPanelFilesListMissingFiles=!ControlPanelFilesListMissingFiles!, "%%~?"
)
setlocal DisableDelayedExpansion

if defined ControlPanelFilesListMissingFiles (
color fc
 echo.
 echo  ╔══════════════════════════════════════════╗
 echo  ║ Панель управления Silver Raven mods pack ║
 echo  ╚══════════════════════════════════════════╝
 echo.
 echo.
 echo *ОШИБКА! Следующие файлы, необходимые для корректной работы программы, не найдены:
 echo.
 echo.
 for %%A in (%ControlPanelFilesListMissingFiles%) do echo %%~A
 echo.
 echo.
 echo Извлеките папку Silver Raven mods pack data из установочных архивов со сборкой в папку игры вручную и перезапустите панель управления. Убедитесь, что антивирусное ПО не блокирует ее работу.
 echo.
 echo.
pause
exit
)
А вообще, не представляю, как все оттестировать (не на кошках юзерах). Есть кто скучающий, упертый, перфикционист? Я отправил бы весь код в личку. Там наверняка можно многое улучшить.
И надо было о переменных подумать заранее. В разных модулях, порой приходится объявлять одни и те же.

Цитата alpap:
вот поэтому и удобнее подпрограммы с наглядными переходами »
Да кто ж спорит то, конечно удобнее. Но напоминаю, у меня это компилируется в exe-шник. Не плодить же, сгенерированные им cmd-шники в подпапках.

Цитата alpap:
это надо пояснить, код в данном случае один, что имелось ввиду? »
В первом куске, мы читаем конфиг-файл, затем через call переходим во второй и там уже пишем. Вот это все я хотел объединить, без переходов.

Цитата Iska:
Или, возможно, у кого-то просто неудачно выбранный редактор»
Notepad++ наше фсе!11 (правда я не пользуюсь темными темами оформления, как большинство, не привык. может, многое теряю)


Отправлено: 18:39, 30-01-2019 | #25


Ветеран


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

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


Цитата alpap:
в AkeiPad тоже вполне так: »
Хе-хе. Теперь я понял, почему заключают set'ы в кавычки — там лишние пробелы в конце строк. И я бы ещё задал в настройках длину tab'ам не в 8 пробелов, а в 4.

Цитата Stalker_AleX333:
Notepad++ наше фсе!11 »
Не в том дело. Я гляжу, что Вы вложенными отступами для наглядности фактически не пользуетесь.


Цитата Stalker_AleX333:
И надо было о переменных подумать заранее. В разных модулях, порой приходится объявлять одни и те же. »
Ну и хрен с ним — setlocal/endlocal-то на что нам даны?!

Отправлено: 19:13, 30-01-2019 | #26

Stalker_AleX333


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

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


Цитата Iska:
Я гляжу, что Вы вложенными отступами для наглядности фактически не пользуетесь. »
Да как то не приучился.

Цитата Iska:
Ну и хрен с ним — setlocal/endlocal-то на что нам даны?! »
А с ними не пашет вывод символов, вроде * : !
Хотя, я где-то читал, что ! можно забить так: ^^^!

А так, я давно бы перенес все переменные в шапку cmd-шника. И объем кода заметно уменьшился.

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


Ветеран


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

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


Цитата Stalker_AleX333:
А с ними не пашет вывод символов, вроде * : ! »
Да ладно. На обработку символа ! влияет параметр enabledelayedexpansion, но никак не сама команда setlocal.

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

Stalker_AleX333


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

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


Цитата Iska:
Да ладно. На обработку символа ! влияет параметр enabledelayedexpansion, но никак не сама команда setlocal. »
Ну значит у меня уже крыша потихоньку едет, от этого всего.

И кстати, без PowerShell-а создать ярлык с атрибутами и указанным путем к отображаемой иконке возможно?

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


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


Ветеран


Contributor


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

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


Stalker_AleX333, Попробуйте сначала так:
Код: Выделить весь код
@Echo Off
cls
	Set "A=Main"
	Echo %A%
	Call :Kuku
	Echo %A%
Pause
Exit /B

:Kuku
	Set "A=kuku"
	Echo %A%
Exit /B
Потом вот так
Код: Выделить весь код
@Echo Off
cls
	Set "A=Main"
	Echo %A%
	Call :Kuku
	Echo %A%
Pause
Exit /B

:Kuku
SetLocal
	Set "A=kuku"
	Echo %A%
EndLocal
Exit /B
Пара SetLocal - EndLocal позволяет "экранироваить" область видимости переменных. Переменные с одинаковыми именами в одной части программы не будут изменяться в другой части, то есть, внутри подпрограммы Вы можете объявлять переменные без боязни их переопределить в других частях программы.
Если у Вас длинный код, для читаемости и удобства написания можно оформить отдельные функционально обусловленные куски в виде процедур, при необходимости применяя SetLocal - EndLocal
А переменные в знаках ! - это уже другая песТня

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


Последний раз редактировалось megaloman, 30-01-2019 в 22:14.

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

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



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




 
Переход