PDA

Показать полную графическую версию : CMD-шник с внешним конфиг-файлом


Страниц : 1 [2]

Stalker_AleX333
30-01-2019, 00:03
Вот что дали (захвачу соседний код, чтобы нагляднее было):


:: Перемещение папок и\или файлов
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
что в данном случае делют символы: < и >, >> »
<"%AutoUpdateConfig%" - чтение из файла (в переменной), равносильно: for /f "usebackq delims=" %%a in ("%AutoUpdateConfig%") do ...
>>$ » - запись во временный файл $ с дозаписью, поэтому >>, равносильно: echo stroka>>$
не очень нравиться прыжки туда сюда через goto и exit »
ну это как кому, если правильно и наглядно организовано, то гораздо лучше наваленных строк
Я бы в один код все засунул »
это надо пояснить, код в данном случае один, что имелось ввиду?
У меня и так уже 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
Ну и не очень нравиться прыжки туда сюда через goto и exit. »
Не существует «прыжков через goto и exit». Либо goto-goto (простые переходы), либо call-exit /b (вызов квазипроцедуры). А goto и exit несовместимы в принципе. И в коде коллеги megaloman их нет. Есть пара именно квазипроцедур с вызовом по call и возвратом по exit /b, и один goto :eof.

У меня и так уже 3676 строк. Читать эту портянку то еще занятие. »
Вот для того и разбивают код на части и организуют те самые процедуры. Или, возможно, у кого-то просто неудачно выбранный редактор :). У меня такой:
https://i.imgur.com/b70xXbg.png
В нём всё замечательно видно, будь то хоть 1000 строк, хоть 10000 строк.

alpap
30-01-2019, 18:09
всё замечательно видно »
в AkeiPad тоже вполне так:

156280

Stalker_AleX333
30-01-2019, 18:39
Я вот что-то сломал и не пойму что, но оно теперь не работает:

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

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
)


А вообще, не представляю, как все оттестировать (не на кошках юзерах). Есть кто скучающий, упертый, перфикционист? Я отправил бы весь код в личку. Там наверняка можно многое улучшить.
И надо было о переменных подумать заранее. В разных модулях, порой приходится объявлять одни и те же.

вот поэтому и удобнее подпрограммы с наглядными переходами »

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

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

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

http://j-p-g.net/it/2019/01/30/0097045001548862293.jpg (http://j-p-g.net/if/2019/01/30/0097045001548862293.jpg.html)

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

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

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

Stalker_AleX333
30-01-2019, 20:53
Я гляжу, что Вы вложенными отступами для наглядности фактически не пользуетесь. »
Да как то не приучился.

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

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

Iska
30-01-2019, 21:06
А с ними не пашет вывод символов, вроде * : ! »
Да ладно. На обработку символа ! влияет параметр enabledelayedexpansion, но никак не сама команда setlocal.

Stalker_AleX333
30-01-2019, 21:26
Да ладно. На обработку символа ! влияет параметр enabledelayedexpansion, но никак не сама команда setlocal. »
Ну значит у меня уже крыша потихоньку едет, от этого всего.

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

megaloman
30-01-2019, 22:00
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
И кстати, без PowerShell-а создать ярлык с атрибутами и указанным путем к отображаемой иконке возможно? »
Возможно. Встроенными средствами — например, на WSH.

Stalker_AleX333
30-01-2019, 22:42
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
Iska, как-то так? »
Близко.

Но это ж все PowerShell, да? »
Нет, WSH.

из SFX архива. »
Чем он создаётся?

Stalker_AleX333
30-01-2019, 23:38
Чем он создаётся? »
WinRAR-ом. С него запустить по окончании распаковки и удалить после выполнения.

Iska
30-01-2019, 23:49
Stalker_AleX333, а почему бы тогда не создавать ярлык им же?

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

Iska
31-01-2019, 18:20
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 скомпонует с путём, выбранным для установки.




© OSzone.net 2001-2012