Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   CMD-шник с внешним конфиг-файлом (http://forum.oszone.net/showthread.php?t=338844)

Stalker_AleX333 21-01-2019 19:47 2853630

CMD-шник с внешним конфиг-файлом
 
Поскольку меня задолбало перед каждой из множества опцией конвертированного в 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 никто запускать не будет. Доп. извращений не нужно.

Busla 21-01-2019 20:30 2853633

Цитата:

Цитата Stalker_AleX333
На Win XP никто запускать не будет. »

так пишите тогда на Powershell
зачем вам exe?

Iska 21-01-2019 20:43 2853635

Цитата:

Цитата Stalker_AleX333
Доп. извращений не нужно. »

Куда уж:
Цитата:

Цитата Stalker_AleX333
конвертированного в exe cmd-шника, »

больше-то ;).

Stalker_AleX333 21-01-2019 21:46 2853651

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

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

Iska 21-01-2019 21:59 2853654

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

Stalker_AleX333 21-01-2019 22:17 2853659

Цитата:

Цитата Iska
Но где и когда аукнется сконвертированный в исполняемый файл пакетный файл — кто его знает. »

Эээ, тут я не очень понял, что имеется ввиду?

Цитата:

Цитата Iska
Наконец, что может помешать тем же самым шаловливым ручкам ровно тем же самым образом пошалить в файле конфигурации?! »

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

Iska 21-01-2019 22:35 2853662

Цитата:

Цитата Stalker_AleX333
Эээ, тут я не очень понял, что имеется ввиду? »

Их поведение не всегда предсказуемо.

Цитата:

Цитата Stalker_AleX333
Банальное не знание его местонахождения. »

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

Stalker_AleX333 21-01-2019 22:55 2853670

Цитата:

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

Кто знает. Откатить все назад я всегда могу.

Цитата:

Цитата Iska
Ну, если о местоположении файла конфигурации знает исполняемый файл, то найти его проблем не составит. »

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

Anonymоus 21-01-2019 23:39 2853678

Смотрю, здесь как и раньше, упорно советуют переходить на 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


Iska 22-01-2019 00:09 2853682

Цитата:

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

Он будет привязан к Python'у :).

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

Anonymоus 22-01-2019 00:16 2853683

Цитата:

Цитата Iska
Он будет привязан к Python'у . »

Ну... верно, с этим ничего не поделаешь, но на *nix системах он уже стоит, а для win платформы, если цель — не запустить у себя, а распространять скрипт на клиентские машины, можно и статический билд сделать со вшитым интерпретатором и библиотеками.
Цитата:

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

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

Iska 22-01-2019 00:59 2853688

Цитата:

Цитата Anonymоus
можно и статический билд сделать со вшитым интерпретатором и библиотеками. »

…и мы возвращаемся к тому, с чего начали — невозможность быстрой правки и использования кода ;).

Цитата:

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

Спасибо, ясно.

Stalker_AleX333 22-01-2019 01:44 2853692

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

Anonymоus 22-01-2019 01:59 2853694

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

YuS_2 22-01-2019 10:50 2853722

Цитата:

Цитата Anonymоus
Смотрю, здесь как и раньше, упорно советуют переходить на PowerShell, и только потом, неохотно и со скрипом помогают. »

Просто, надежно и быстро ... а cmd не обладает такими возможностями, как powershell... да и powershell, нынче, изкаропки командный шелл по умолчанию

Цитата:

Цитата Anonymоus
Оставшееся спишем на банальное "да без разницы на чём, лишь бы проблему решить". »

как правило, если надо ехать, то на шашечки внимание обращать не приходится :)
Ну, а если студенту требуется решение в определенной среде, то ... лично мое мнение - мы оказываем медвежью услугу, предлагая студентам готовые решения.

Цитата:

Цитата Anonymоus
Имхо, если человеку не хватает возможностей cmd, он уже сразу на Python перейдёт »

Это почему? Мне, например, за глаза хватает встроенных средств. Зачем тащить в систему сторонние разработки, если необходимые инструменты уже присутствуют в этой системе? :)

Цитата:

Цитата Anonymоus
для win платформы»

на win платформах powershell уже стоит

Цитата:

Цитата Anonymоus
на *nix системах »

для *nix - Powershell Core, однако...

Stalker_AleX333 23-01-2019 23:10 2854164

Народ, а можно имена отсутствующих файлов из конфига выводить с новой строки?



Так, читабельность не очень. Попробовал подергать 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 2854978

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 2855094

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 2855206

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

megaloman 29-01-2019 22:20 2855234

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


Stalker_AleX333 30-01-2019 00:03 2855256

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

Код:

:: Перемещение папок и\или файлов
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 строк. Читать эту портянку то еще занятие. Ну сам виноват, надо было остановиться, пока стало не поздно...

alpap 30-01-2019 01:44 2855270

Цитата:

Цитата 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


Iska 30-01-2019 03:36 2855273

Цитата:

Цитата Stalker_AleX333
Ну и не очень нравиться прыжки туда сюда через goto и exit. »

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

Цитата:

Цитата Stalker_AleX333
У меня и так уже 3676 строк. Читать эту портянку то еще занятие. »

Вот для того и разбивают код на части и организуют те самые процедуры. Или, возможно, у кого-то просто неудачно выбранный редактор :). У меня такой:
Скрытый текст

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

alpap 30-01-2019 18:09 2855415

Цитата:

Цитата Iska
всё замечательно видно »

в AkeiPad тоже вполне так:
Скрытый текст

Stalker_AleX333 30-01-2019 18:39 2855417

Я вот что-то сломал и не пойму что, но оно теперь не работает:
Код:

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Проверка доступности файлов панели управления
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

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 (правда я не пользуюсь темными темами оформления, как большинство, не привык. может, многое теряю)


Iska 30-01-2019 19:13 2855426

Цитата:

Цитата alpap
в AkeiPad тоже вполне так: »

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

Цитата:

Цитата Stalker_AleX333
Notepad++ наше фсе!11 »

Не в том дело. Я гляжу, что Вы вложенными отступами для наглядности фактически не пользуетесь.


Цитата:

Цитата Stalker_AleX333
И надо было о переменных подумать заранее. В разных модулях, порой приходится объявлять одни и те же. »

Ну и хрен с ним — setlocal/endlocal-то на что нам даны?!

Stalker_AleX333 30-01-2019 20:53 2855439

Цитата:

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

Да как то не приучился.

Цитата:

Цитата Iska
Ну и хрен с ним — setlocal/endlocal-то на что нам даны?! »

А с ними не пашет вывод символов, вроде * : !
Хотя, я где-то читал, что ! можно забить так: ^^^!

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

Iska 30-01-2019 21:06 2855440

Цитата:

Цитата Stalker_AleX333
А с ними не пашет вывод символов, вроде * : ! »

Да ладно. На обработку символа ! влияет параметр enabledelayedexpansion, но никак не сама команда setlocal.

Stalker_AleX333 30-01-2019 21:26 2855448

Цитата:

Цитата Iska
Да ладно. На обработку символа ! влияет параметр enabledelayedexpansion, но никак не сама команда setlocal. »

Ну значит у меня уже крыша потихоньку едет, от этого всего.

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

megaloman 30-01-2019 22:00 2855457

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
А переменные в знаках ! - это уже другая песТня

Iska 30-01-2019 22:32 2855466

Цитата:

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

Возможно. Встроенными средствами — например, на WSH.

Stalker_AleX333 30-01-2019 22:42 2855473

Iska, как-то так? Но это ж все PowerShell, да?

Код:

Set WshShell = WScript.CreateObject("WScript.Shell")

Set oShellLink = WshShell.CreateShortcut("%userprofile%\Рабочий стол\The Elder Scrolls V Skyrim - Special Edition.lnk")

oShellLink.TargetPath = %GameFolder%\skse64.exe

oShellLink.WindowStyle = 7

oShellLink.IconLocation = "%GameFolder%\Silver Raven mods pack data\Silver Raven mods pack ico.ico"

oShellLink.Description = "Запустить The Elder Scrolls V Skyrim - Special Edition"
oShellLink.Save

или так
Код:

Option Explicit

With WScript.CreateObject("WScript.Shell").CreateShortcut(WScript.CreateObject("Shell.Application").NameSpace("shell:desktop").self.Path & "\The Elder Scrolls V Skyrim - Special Edition.lnk")
        .TargetPath  = "%GameFolder%\skse64.exe"
        .WindowStyle  = 7
        .IconLocation = "%GameFolder%\Silver Raven mods pack data\Silver Raven mods pack ico.ico"
        .Description  = "Запустить The Elder Scrolls V Skyrim - Special Edition"
        .Save
End With

WScript.Quit 0

Надо забить переменную GameFolder, ибо - у каждого пользователя она своя. И вызывать все это дело из SFX архива.

Iska 30-01-2019 23:21 2855482

Цитата:

Цитата Stalker_AleX333
Iska, как-то так? »

Близко.

Цитата:

Цитата Stalker_AleX333
Но это ж все PowerShell, да? »

Нет, WSH.

Цитата:

Цитата Stalker_AleX333
из SFX архива. »

Чем он создаётся?

Stalker_AleX333 30-01-2019 23:38 2855483

Цитата:

Цитата Iska
Чем он создаётся? »

WinRAR-ом. С него запустить по окончании распаковки и удалить после выполнения.

Iska 30-01-2019 23:49 2855486

Stalker_AleX333, а почему бы тогда не создавать ярлык им же?

Stalker_AleX333 31-01-2019 00:51 2855491

Iska, а как он "узнает", по какому пути находится необходимый для запуска ярлыком файл? Пользователь же указывает путь распаковки вручную и там вроде нет команд для его передачи.

Iska 31-01-2019 18:20 2855605

Цитата:

Цитата Stalker_AleX333
Iska, а как он "узнает", по какому пути находится необходимый для запуска ярлыком файл? Пользователь же указывает путь распаковки вручную и там вроде нет команд для его передачи. »

Stalker_AleX333, Вы танцуете от того пути, который будет задан пользователем для установки.

Например, я имею такое содержимое в каталоге C:\Мои проекты\0242:
Код:

C:\Мои проекты\0242
└───My Programm
        My Programm.exe

— каталог «My Programm» и исполняемый файл «My Programm.exe» (в качестве которого выступает обычный Блокнот) в нём.

Упаковываем его в самораспаковывающийся архив с таким комментарием:
Код:

;Расположенный ниже комментарий содержит команды SFX-сценария

Path=My Company Name
SavePath
Title=My Programm
Text
{
My Programm installation!
}
Shortcut=P, "My Programm\My Programm.exe", "My Programm", "My Programm Description", "My Programm.lnk"

В результате чего при установке содержимое архива, а именно — каталог «My Programm» с содержащимся в нём файлом будет извлечён либо в умолчальный каталог «%ProgramFiles%\My Company Name», либо в указанный пользователем каталог. И ярлык будет создан именно на тот путь, куда будет извлечён исполняемый файл. Обратите внимание — мы указываем для ярлыка относительный путь («My Programm\My Programm.exe»), который затем WinRAR скомпонует с путём, выбранным для установки.


Время: 08:27.

Время: 08:27.
© OSzone.net 2001-