Войти

Показать полную графическую версию : Проверка наличия файлов по списку и вызов контекстного действия


Stalker_AleX333
10-04-2020, 20:29
Народ, не пойму, правильно ли я сформировал список, проверяемый при запуске этого куска кода:


set "HDSoundsPackagesENGLocalization="Data\Unofficial HD Audio Project - ENG0.bsa" "Data\Unofficial HD Audio Project - ENG1.bsa" "Data\Unofficial HD Audio Project - ENG2.bsa" "Data\Unofficial HD Audio Project - ENG3.bsa" "Data\Unofficial HD Audio Project - ENG4.bsa""

set "HDSoundsPackagesRUSLocalization="Data\Unofficial HD Audio Project - RUS0.bsa" "Data\Unofficial HD Audio Project - RUS1.bsa" "Data\Unofficial HD Audio Project - RUS2.bsa" "Data\Unofficial HD Audio Project - RUS3.bsa" "Data\Unofficial HD Audio Project - RUS4.bsa""

set "HDSoundsPackagesENG&RUSLocalization="Data\Unofficial HD Audio Project - ENG0.bsa" "Data\Unofficial HD Audio Project - ENG1.bsa" "Data\Unofficial HD Audio Project - ENG2.bsa" "Data\Unofficial HD Audio Project - ENG3.bsa" "Data\Unofficial HD Audio Project - ENG4.bsa" "Data\Unofficial HD Audio Project - RUS0.bsa" "Data\Unofficial HD Audio Project - RUS1.bsa" "Data\Unofficial HD Audio Project - RUS2.bsa" "Data\Unofficial HD Audio Project - RUS3.bsa" "Data\Unofficial HD Audio Project - RUS4.bsa""


cls
:: Это слишком убого. Фу бяка.
:: Если установлены HD пакеты русско и англоязычной локализации - переходим в меню выбора языка озвучания
if exist "%HDSoundsPackagesENG&RUSLocalization%" call :option_2_hd_sounds_packages_change_lang_localization

:: Проверяем наличие HD пакетов англоязычной локализации
if not exist "%HDSoundsPackagesENGLocalization%" (

:: Проверяем наличие HD пакетов русскоязычной локализации
if not exist "%HDSoundsPackagesRUSLocalization%" call :option_2_install_hd_sounds_packages_error
if exist "%HDSoundsPackagesRUSLocalization%" call :option_2_install_hd_sounds_packages_rus
)
if exist "%HDSoundsPackagesENGLocalization%" call :option_2_install_hd_sounds_packages_eng

:: Ошибка - выводимая при отсутствии HD пакетов локализации и музыки в папке с игрой
:option_2_install_hd_sounds_packages_error
cls
color fc
@echo.
@echo *ОШИБКА! HD пакеты локализации не обнаружены в папке с игрой!
@echo.
pause
goto :option_2_hd_sounds_packages_menu
)


Потому как, это "чудо" всегда возвращает мне отрицательный результат. Вообще, я не знаю, if exist в cmd умеет проверять списком ? Или точное имя или с маской ? или *
З.Ы. проверяемые файлы могут быть как из первого, второго, или обоих списков сразу. А действия нужны каждый раз разные. Наверное нихрена не понятно, но я дополню, если потребуется.

DJ Mogarych
11-04-2020, 11:43
Вы бы описали задачу словами - что нужно, и приложили иерархию тестовых файлов (можно просто пустые txt) в zip.
Разбираться в чужом коде (который, к тому же, не работает), удовольствие, поверьте, сильно ниже среднего.

alpap
11-04-2020, 14:57
if exist в cmd умеет »
а проверить самому не судьба?

@echo off
if exist q* echo ok
for %%a in (q*) do if exist %%a echo %%a
if exist *.txt echo ok
for %%a in (*.txt) do if exist %%a echo %%a
pause

160985

Stalker_AleX333
11-04-2020, 20:13
DJ Mogarych, ок, попытаюсь.
У нас имеется два набора файлов (озвучка для игры, упакованная в архивы формата .bsa. Идентичны в названиях и количестве, за исключением окончания ENG\RUS). В первом наборе\пакете - русскоязычная локализация. Во втором - англоязычная. Юзер скачивает и устанавливает себе желаемый пакет (или оба, если хочет менять локализацию "на ходу"), запускаемый батник проверяет какие архивы доступны и на основе этого предлагает выбрать желаемый для подключения (записать те или иные параметры в файлах конфигурации игры).

Алгоритм:
Какой пакет есть?
Русский - call :option_2_install_hd_sounds_packages_rus
Английский - call :option_2_install_hd_sounds_packages_eng
Есть и то и другое? - call :option_2_install_hd_sounds_packages_eng&rus
Ничего не нашли? - call :option_2_install_hd_sounds_packages_error

Stalker_AleX333
15-04-2020, 22:28
upd.
Разобрался. Поиск по списку функционирует, но встала проблема с пробелами в именах файлов. В таком виде он не работает. Не знаю как еще экранировать список.

Как пример, так не работает:

set "SoundsPackagesList="Data\pack 1.bsa" "Data\pack 2.bsa" "Data\pack N.bsa""

if exist "%SoundsPackagesList%" echo ok


И так тоже:

set "%SoundsPackagesList%="pack 1.bsa" "pack 2.bsa" "pack N.bsa""

cd Data\
if exist "%SoundsPackagesList%" echo ok
cd ..


А вот такая конструкция, для удаления всего, кроме файлов из списка UninstallExclusionFiles, ведет себя прекрасно:

for %%F in ("%UninstallExclusionFiles%") do if exist "Data\%%~F" attrib +r "Data\%%~F"
>nul del "Data\*.*" /q
for %%F in (%UninstallExclusionFiles%) do if exist "Data\%%~F" attrib -r "Data\%%~F"
for /f "usebackq delims=" %%D in (`2^>nul dir "Data\" /b /a:d`) do rd /s /q "Data\%%D"

iglezz
16-04-2020, 01:09
А вот такая конструкция, для удаления всего, кроме файлов из списка UninstallExclusionFiles, ведет себя прекрасно: »
А что мешает использовать эту конструкцию вместо попытки впихнуть список файлов туда, где он не ожидается?

Stalker_AleX333
16-04-2020, 11:48
iglezz, пока допер только до этого:

for %%F in (%HDSoundsPackagesENG&RUSLocalization%) do (if exist "Data\%%~F" call :option_2_hd_sounds_packages_change_localization)

Но это для одного списка, а как включить сюда разные действия для каждого из них?

iglezz
16-04-2020, 18:43
Stalker_AleX333, set "list="file1" "file2" "file3""

pushd "C:\path\to\files"
call :checkExistAll %list%
if errorlevel 1 (echo error) else (echo ok)

call :checkExistAny %list%
if errorlevel 1 (echo error) else (echo ok)

pause
exit /b

:: checkExistAll возвращает 0, если все файлы существуют, иначе 1
:checkExistAll
set exitcode=0
for %%f in (%*) do if not exist "%%f" set exitcode=1
exit /b %exitcode%

:: checkExistAnyвозвращает 0, если хотя бы один файл из списка существует, иначе 1
:checkExistAny
set exitcode=1
for %%f in (%*) do if exist "%%f" set exitcode=0
exit /b %exitcode%
set "HDSoundsPackagesENG&RUSLocalization="Data\Unofficial HD Audio Project - ENG0.bsa" "Data\Unofficial HD Audio Project - ENG1.bsa" "Data\Unofficial HD Audio Project - ENG2.bsa" "Data\Unofficial HD Audio Project - ENG3.bsa" "Data\Unofficial HD Audio Project - ENG4.bsa" "Data\Unofficial HD Audio Project - RUS0.bsa" "Data\Unofficial HD Audio Project - RUS1.bsa" "Data\Unofficial HD Audio Project - RUS2.bsa" "Data\Unofficial HD Audio Project - RUS3.bsa" "Data\Unofficial HD Audio Project - RUS4.bsa""
в данном случае можно сократить до
set "HDSoundsPackagesENG&RUSLocalization=%HDSoundsPackagesENGLocalization% %HDSoundsPackagesRUSLocalization%"

Лучше, пока ещё не поздно, сваливать в сторону PoSh, WSH, Inno, NSIS, ...
Порог входа в скриптинг на батниках низкий, но потом, по мере усложнения батника, повылазят особенности этого архаичного интерпретатора, с которыми придётся сражаться вместо написания полезного кода

Stalker_AleX333
16-04-2020, 20:59
Вот, нашел подходящий код и мне помогли "направить" его в нужное русло:

:: Проверяем наличие HD пакетов англоязычной локализации
for %%F in (%HDSoundsPackagesENGLocalization%) do (if exist "Data\%%~F" set /a HDSoundsPackagesENG+=1)

:: Проверяем наличие HD пакетов русскоязычной локализации
for %%F in (%HDSoundsPackagesRUSLocalization%) do (if exist "Data\%%~F" set /a HDSoundsPackagesRUS+=1)

if %HDSoundsPackagesENG% equ 5 (
if %HDSoundsPackagesRUS% equ 5 (
call :option_2_hd_sounds_packages_change_localization
) else (
call :option_2_install_hd_sounds_packages_eng
)
) else (
if %HDSoundsPackagesRUS% equ 5 (
call :option_2_install_hd_sounds_packages_rus
) else (

:: Ошибка - выводимая при отсутствии HD пакетов локализации и музыки в папке с игрой
cls
color fc
@echo.
@echo.
@echo *ОШИБКА! HD пакеты локализации не обнаружены в папке с игрой!
@echo.
@echo.
@echo Используйте предыдущее меню для их загрузки.
@echo Если вы уверены в корректности установки, свяжитесь с автором сборки и предоставьте информацию о всей последовательности действий.
@echo.
@echo.
pause
goto :option_2_hd_sounds_packages_menu


Правда, там в списке файлов присутствует Unofficial HD Audio Project - Music.bsa, который он не учитывает. Не хотелось бы его отдельно проверять. Как засунуть в один кусок?




© OSzone.net 2001-2012