[CMD] bat-ник для поиска и удаления файлов и папок по части названия файла

oniava

Участник
Сообщения
97
Реакции
3
Здравствуйте форумчане.
CMD/BAT - Нужен bat-ник для поиска и удаления файлов и папок по части названия файла
Собственно тема начата здесь, но на этом форуме тишина.

Суть.
Есть папка ElsaWin_Base_01.2015 (до 40 Гб файл), в этой папке куча файлов с языковыми пакетами.

Нужно батником удалить все ненужные языки с файлами и оставить только нужные.
(Расширение файлов .cad)

Пока сделал так, но что то не нравится.
Код:
@echo off & title Oleg Naimushin
SetLocal EnableExtensions
chcp 866 >NUL

echo.
echo.
echo.            --- Скрипт для удаления лишних языков из базы ElsaWin ---
echo.
echo.
echo. - После работы скрипта, остануться необходимые языки это:
echo.
echo.   en-GB - английский (Великобритания),
echo.
echo.   en-US - английский (США),
echo.
echo.   de-DE - немецкий,
echo.
echo.   ru-RU - русский.
echo.
echo.
echo. - Нажмите любую клавишу чтобы продолжить работу ..

Pause >NUL

:: Где ищем
cd /d "%~dp0"

:: Что ищем
set mask="*cs-CZ* *da-DK* *el-GR* *es-ES* *fi-FI* *fr-CA* *fr-FR* *hr-HR* *hu-HU* *it-IT* *ja-JP* *ko-KR* *nl-NL* *pl-PL* *pt-PT* *ro-RO* *sk-SK* *sl-SI* *sv-SE* *th-TH* *tr-TR* *zh-CN* *lt-LT* *lv-LV* *mk-MK* *nb-NO* *pt-BR* *sr-YU* *uk-UA* *zh-CHS* *bg-BG* *et-EE* *zh-TW* *zh-TW*"

:: Что оставляем
:: en-GB, en-US, de-DE, ru-RU

2>NUL (for /f "delims=" %%A in ('"dir /b /a:-d "%mask%""') do (
set /a n+=1
))
if "%n%" LSS "1" echo. & echo. & echo. - Заданных файлов не найдено .. & echo. & echo. - Нажмите любую клавишу для выхода .. & Pause >NUL & goto :EOF
del /f /a /q /s "%mask%" 2>NUL 1>&2 > %userprofile%\Desktop\loglist.txt
for %%J in (".") do echo. & echo. - Удалено: %n% файлов & echo. & echo. - Из папки: %%~nJ
echo.
Pause
Pause >NUL
EndLocal
Exit /B

Может можно как то упростить код батника, усовешенствовать?
 
Последнее редактирование:
Здравствуйте!
Собственно тема начата здесь, но на этом форуме тишина.
Тишина - мягко сказано. Я бы сказал целый бум на несколько страниц )
(Расширение файлов .cad)
Может, всё таки .cab ?
Пока сделал так, но что то не нравится.
Что?
Может можно как то упростить код батника, усовешенствовать?
С какой целью?
Я бы так написал:

CMD/BATCH:
@Echo Off
SetLocal EnableExtensions

Set "BoxIn=%~dp0"
Set "Ext=*.cab"
Set "Exclude=*ru-RU* *en-GB* *en-US* *de-DE*"
Set "Log=%userprofile%\Desktop\%~nx0.log"

pushd "%BoxIn%" || (pause & exit /b)
del "%Log%" 2>NUL

set nS=0& set /a nF=0
FOR /f "delims=" %%f IN ('dir /b /a-d %Exclude%') DO set ""%%~nxf"=1"
FOR %%f IN ("%BoxIn%\%Ext%") DO if not Defined "%%~nxf" (
  del /f /a "%BoxIn%\%%~nxf" &&(>>"%Log%" echo Success: "%%~nxf"& set /a nS+=1) ||(>>"%Log%" FAILURE: "%%~nxf" & set /a nF+=1)
)
(echo TOTAL:
echo Success: %nS%
echo Failure: %nF%
popd) >> "%Log%"
type "%Log%"
pause
 
Здравствуйте Dragokas.
Тишина - мягко сказано. Я бы сказал целый бум на несколько страниц )
Это только недавно началось и то закончить не можем)
Может, всё таки .cab ?
Сори ошибся.
Дело в том, что Файлы в папке могут быть разного вида, примерно:
saz.N.sv-SE.2CA.cab
slp.V.sv-SE#graphics.cab
slp.V.nl-NL.cab
help..et-EE.cab
hs2.N.fi-FI.cab
saz.V.es-ES.7P5.cab
saz..da-DK.2EE.5P3.cab
saz.saz.da-DK.2EE.5P3.cab.da-DK.2EE.5P3.cab
saz.saz..da-DK.2EE.5P3.cab.da-DK.2EE.5P3.cab
saz.da-DK.cab
и т.д.

Перед языковыми символами, что спереди что сзади символов может быть ЧТО УГОДНО!

{лабуда всякая}et-EE{лабуда всякая}.cab

Я даже не знаю что именно, это как сервер мне пришлет...
Поэтому, нужно исходить примерно так:
Ведем поиск файлов в которых в имени присутствуют символы:
Код:
Set "Exclude=*ru-RU* *en-GB* *en-US* *de-DE*"
Другие файлы с (другими) подобными символами, удаляем.
НО! Должны в то же время остаться все подпапки (если присутствуют) и файлы в которых вообще нет подобных символов, примерно:
control#51.xml
delConfigItem.js
elfi.cab
slp.V.#graphics.17.cab
 
Последнее редактирование:
saz.N.sv-SE.2CA.cab
slp.V.sv-SE#graphics.cab

Они такие разные... Кроме такой вот маски больше ничего общего не вижу: *.??-*.cab

Замените тогда в моём скрипте заголовочную переменную на:
Код:
Set "Ext=*.??-*.cab"
 
Сейчас Ваш опробовал, по логу удалил то что надо было оставить:

(только маленький кусочек из большого)
Success: "wi.N.#graphics.4.cab"
Success: "wi.N.#graphics.6.cab"
Success: "wi.N.cab"
Success: "wi.V.#graphics.14.cab"
Success: "wi.V.#graphics.20.cab"
Success: "wi.V.#graphics.32.cab"
Success: "wi.V.#graphics.40.cab"
Success: "wi.V.#graphics.42.cab"
Success: "wi.V.#graphics.45.cab"
Success: "wi.V.#graphics.50.cab"
Success: "wi.V.#graphics.52.cab"
Success: "wi.V.#graphics.53.cab"
Success: "wi.V.#graphics.56.cab"
Success: "wi.V.#graphics.63.cab"
Success: "wi.V.#graphics.9.cab"
Success: "wi.V.cab"
и т.д.
Пробую заменить.
 
Dragokas, будьте добры, объясните условие выполнения:
- найдено и удалено столько то файлов.

- ?
Опробовал часть файлов после, замены кода, вроде скрипт отработал четко.
Сейчас архив докачаю, опробую на полной папке с данными.
 
Dragokas, будьте добры, объясните условие выполнения:
Условие выполнения команды: безусловное :)

Инкремент значения переменной в зависимости от кода возврата команды del.
 
Здравствуйте Dragokas.
CMD/BATCH:
@Echo Off
SetLocal EnableExtensions

Set "BoxIn=%~dp0"
Set "Ext=*.??-*.cab"
Set "Exclude=*ru-RU* *en-GB* *en-US* *de-DE*"
Set "Log=%userprofile%\Desktop\%~nx0.log"

pushd "%BoxIn%" || (pause & exit /b)
del "%Log%" 2>NUL

set nS=0& set /a nF=0
FOR /f "delims=" %%f IN ('dir /b /a-d %Exclude%') DO set ""%%~nxf"=1"
FOR %%f IN ("%BoxIn%\%Ext%") DO if not Defined "%%~nxf" (
  del /f /a "%BoxIn%\%%~nxf" &&(>>"%Log%" echo Success: "%%~nxf"& set /a nS+=1) ||(>>"%Log%" FAILURE: "%%~nxf" & set /a nF+=1)
)
(echo TOTAL:
echo Success: %nS%
echo Failure: %nF%
popd) >> "%Log%"
type "%Log%"
pause

Подскажите, а как подсчитать все файлы и папи, в папке с которой работаем, той в которую закидываем скрипт.
Код:
Set Cnt=0
For %%I In (*) Do Set /A Cnt += 1
Echo %Cnt%
Сделал так, но почему то считает на одну папку меньше:Dntknw:
 
Последнее редактирование модератором:
CMD/BATCH:
<nul set /p x=Всего файлов: & dir /b /a-d | find /c /v ""
<nul set /p x=Всего папок: & dir /b /ad | find /c /v ""
добавить ключ /s, если нужно рекурсивно с подкаталогами.
 
Назад
Сверху Снизу