CMD/BAT - Проверка наличия файлов по списку и вызов контекстного действия

Ответить
Аватара пользователя
DJ Mogarych

CMD/BAT - Проверка наличия файлов по списку и вызов контекстного действия

Сообщение DJ Mogarych »

Народ, не пойму, правильно ли я сформировал список, проверяемый при запуске этого куска кода:





Код:

Код: Выделить всё

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[/i] в cmd умеет проверять списком ? Или точное имя или с маской ? или *

З.Ы. проверяемые файлы могут быть как из первого, второго, или обоих списков сразу. А действия нужны каждый раз разные. Наверное нихрена не понятно, но я дополню, если потребуется.
Аватара пользователя
DJ Mogarych

Re: CMD/BAT - Проверка наличия файлов по списку и вызов контекстного действия

Сообщение DJ Mogarych »

Вы бы описали задачу словами - что нужно, и приложили иерархию тестовых файлов (можно просто пустые txt) в zip.

Разбираться в чужом коде (который, к тому же, не работает), удовольствие, поверьте, сильно ниже среднего.
Аватара пользователя
alpap

Re: CMD/BAT - Проверка наличия файлов по списку и вызов контекстного действия

Сообщение alpap »

Цитата Stalker_AleX333:



if exist в cmd умеет
CMD/BAT - Проверка наличия файлов по списку и вызов контекстного действия




а проверить самому не судьба?



Код:

Код: Выделить всё

@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
Аватара пользователя
iglezz

Re: CMD/BAT - Проверка наличия файлов по списку и вызов контекстного действия

Сообщение iglezz »

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
Аватара пользователя
iglezz

Re: CMD/BAT - Проверка наличия файлов по списку и вызов контекстного действия

Сообщение iglezz »

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

Re: CMD/BAT - Проверка наличия файлов по списку и вызов контекстного действия

Сообщение iglezz »

Цитата Stalker_AleX333:



А вот такая конструкция, для удаления всего, кроме файлов из списка UninstallExclusionFiles, ведет себя прекрасно:
CMD/BAT - Проверка наличия файлов по списку и вызов контекстного действия




А что мешает использовать эту конструкцию вместо попытки впихнуть список файлов туда, где он не ожидается?
Аватара пользователя
iglezz

Re: CMD/BAT - Проверка наличия файлов по списку и вызов контекстного действия

Сообщение iglezz »

iglezz, пока допер только до этого:





Код:

Код: Выделить всё

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

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

Re: CMD/BAT - Проверка наличия файлов по списку и вызов контекстного действия

Сообщение iglezz »

Stalker_AleX333,


Например так

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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%









Кроме того

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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, ...

Порог входа в скриптинг на батниках низкий, но потом, по мере усложнения батника, повылазят особенности этого архаичного интерпретатора, с которыми придётся сражаться вместо написания полезного кода
Аватара пользователя
Guest

Re: CMD/BAT - Проверка наличия файлов по списку и вызов контекстного действия

Сообщение Guest »

Вот, нашел подходящий код и мне помогли "направить" его в нужное русло:



Код:

Код: Выделить всё

:: Проверяем наличие 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[/i], который он не учитывает. Не хотелось бы его отдельно проверять. Как засунуть в один кусок?
Ответить

Вернуться в «Скриптовые языки администрирования Windows»