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

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

Stalker_AleX333 10-04-2020 20:29 2916686

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

Код:

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 2916743

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

alpap 11-04-2020 14:57 2916777

Цитата:

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

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 2917317

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 2917336

Цитата:

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

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

Stalker_AleX333 16-04-2020 11:48 2917398

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 2917500

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 2917530

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

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


Время: 17:17.

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