Показать полную графическую версию : CMD-шник с внешним конфиг-файлом
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 строк. Читать эту портянку то еще занятие. Ну сам виноват, надо было остановиться, пока стало не поздно...
что в данном случае делют символы: < и >, >> »
<"%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
Ну и не очень нравиться прыжки туда сюда через 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 строк.
всё замечательно видно »
в 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)
в AkeiPad тоже вполне так: »
Хе-хе. Теперь я понял, почему заключают set'ы в кавычки ;) — там лишние пробелы в конце строк. И я бы ещё задал в настройках длину tab'ам не в 8 пробелов, а в 4.
Notepad++ наше фсе!11 »
Не в том дело. Я гляжу, что Вы вложенными отступами для наглядности фактически не пользуетесь.
И надо было о переменных подумать заранее. В разных модулях, порой приходится объявлять одни и те же. »
Ну и хрен с ним — setlocal/endlocal-то на что нам даны?!
Stalker_AleX333
30-01-2019, 20:53
Я гляжу, что Вы вложенными отступами для наглядности фактически не пользуетесь. »
Да как то не приучился.
Ну и хрен с ним — setlocal/endlocal-то на что нам даны?! »
А с ними не пашет вывод символов, вроде * : !
Хотя, я где-то читал, что ! можно забить так: ^^^!
А так, я давно бы перенес все переменные в шапку cmd-шника. И объем кода заметно уменьшился.
А с ними не пашет вывод символов, вроде * : ! »
Да ладно. На обработку символа ! влияет параметр 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
А переменные в знаках ! - это уже другая песТня
И кстати, без 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, как-то так? »
Близко.
Но это ж все PowerShell, да? »
Нет, WSH.
из SFX архива. »
Чем он создаётся?
Stalker_AleX333
30-01-2019, 23:38
Чем он создаётся? »
WinRAR-ом. С него запустить по окончании распаковки и удалить после выполнения.
Stalker_AleX333, а почему бы тогда не создавать ярлык им же?
Stalker_AleX333
31-01-2019, 00:51
Iska, а как он "узнает", по какому пути находится необходимый для запуска ярлыком файл? Пользователь же указывает путь распаковки вручную и там вроде нет команд для его передачи.
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC