Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Проверка наличия файлов по списку и вызов контекстного действия

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


Сообщения: n/a

Профиль | Цитировать


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

Код: Выделить весь код
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 умеет проверять списком ? Или точное имя или с маской ? или *
З.Ы. проверяемые файлы могут быть как из первого, второго, или обоих списков сразу. А действия нужны каждый раз разные. Наверное нихрена не понятно, но я дополню, если потребуется.

Отправлено: 20:29, 10-04-2020

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6626
Благодарности: 1528

Профиль | Отправить PM | Цитировать


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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:43, 11-04-2020 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


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

Последний раз редактировалось alpap, 06-04-2021 в 18:01.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:57, 11-04-2020 | #3

Stalker_AleX333


Сообщения: n/a

Профиль | Цитировать


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

Отправлено: 20:13, 11-04-2020 | #4

Stalker_AleX333


Сообщения: n/a

Профиль | Цитировать


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"

Последний раз редактировалось Stalker_AleX333, 16-04-2020 в 00:42.


Отправлено: 22:28, 15-04-2020 | #5


Старожил


Сообщения: 352
Благодарности: 193

Профиль | Отправить PM | Цитировать


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

Отправлено: 01:09, 16-04-2020 | #6

Stalker_AleX333


Сообщения: n/a

Профиль | Цитировать


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

Код: Выделить весь код
for %%F in (%HDSoundsPackagesENG&RUSLocalization%) do (if exist "Data\%%~F" call :option_2_hd_sounds_packages_change_localization)
Но это для одного списка, а как включить сюда разные действия для каждого из них?

Отправлено: 11:48, 16-04-2020 | #7


Старожил


Сообщения: 352
Благодарности: 193

Профиль | Отправить PM | Цитировать


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

Отправлено: 18:43, 16-04-2020 | #8

Stalker_AleX333


Сообщения: n/a

Профиль | Цитировать


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

Отправлено: 20:59, 16-04-2020 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Проверка наличия файлов по списку и вызов контекстного действия

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - Проверка наличия файлов Svnkill Скриптовые языки администрирования Windows 9 17-02-2018 22:40
Любой язык - [решено] Проверка наличия файлов перед запуском приложения Armsinglom Скриптовые языки администрирования Windows 2 15-07-2017 13:50
VBS/WSH/JS - [решено] Проверка наличия и запуск нескольких файлов id342181564@vk Скриптовые языки администрирования Windows 8 03-04-2017 21:17
CMD/BAT - проверка наличия файлов neprotiv Скриптовые языки администрирования Windows 0 04-04-2013 22:09
VBS/WSH/JS - [решено] Проверка наличия файлов в папке lesha73 Скриптовые языки администрирования Windows 2 17-01-2012 16:45




 
Переход