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

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

Ответить
Настройки темы
CMD/BAT - [решено] удалить файлы по маске *_i.ext

Старожил


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

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


Здравствуйте!
помогите удалить файлы
пользователем задается например i1=2 i2=3
маска в виде "_i.Extension"
и батник должен удалить все файлы в папке с хвостиком от 2 до 3

Отправлено: 19:13, 03-01-2015

 

Старожил


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

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


а что в cmd/bat нет команды поиска справа налево или обрезка строки?
я вчера на vba за 15 минут это сделал. там же делов на две строчки.
обрезать имя файла справа до точки и сверить последний символ в имени с i
если совпадает, то удалить файл
можно даже без проверки на наличие "_" во втором символе с конца имени файла

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

аналогично и для второй темы, в которой портянки тоже огромные такие

Скрытый текст

key = Left(FileName, (InStrRev(FileName, ".")) - 2) & i & "." 'имя до расширения
ext = Right(FileName, Len(FileName) - InStrRev(FileName, ".")) 'расширение

итого на строке Fil eNa me_0.extension
выдает
key = Fil eNa me_i.
ext = extension
потом сверяется по key & ext и обрабатывается файл

только вот cmd/bat я не так хорошо знаю, хотя особенного тут совсем нет ничего же

либо поиск справа налево точки в имени файла либо обрезка имени файла по одному символу пока этим символом не будет точка
а дальше находим крайний символ и по нему сверяем. как сделать хотя бы так топорно?

Последний раз редактировалось shadowbat, 04-01-2015 в 15:05.


Отправлено: 14:44, 04-01-2015 | #11



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

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


Ветеран


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

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


Цитата shadowbat:
а что в cmd/bat нет команды поиска справа налево »
Вообще. Ни справа налево, ни слева направо.

Цитата shadowbat:
или обрезка строки? »
Нет. Есть выделение подстроки и замена подстроки. «set /?» в помощь.

Цитата shadowbat:
я вчера на vba за 15 минут это сделал. там же делов на две строчки. »
Значит, Вам понравится Windows PowerShell, который пришёл на смену пакетным файлам и скриптам Windows Script Host. «Там же делов» на одну строчку. Дерзайте.

Не забудьте только предварительно составить полный и корректный алгоритм, чтобы после очередной итерации внезапно не «вылезало» очередное позабытое требование.

Отправлено: 15:05, 04-01-2015 | #12


Старожил


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

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


Цитата:
Ни справа налево, ни слева направо.
да, тогда сложнее конечно.
Цитата:
Значит, Вам понравится Windows PowerShell
вопрос же не в том, что нравится или не нравится.
нужно было сделать обычный "простенький" батник, чтобы обычные другие люди могли удалить все файлы с ненужными хвостиками
а тут оказывается это никак не сделать, если в имени файла есть повторяющиеся символы
может их можно как то посчитать? например считает количество _ и ищет файлы по маске *_*_*_i.* (например если в файле три подчеркивания)
или заменить все _ на ! кроме последнего. тогда маска _i.* будет приводить всегда в одно и то же место в имени файла, потому что символ _ будет только один


получается четко такую задачу на cmd/bat не сделать и лучше делать это на vbs?

я правильно понимаю, что если подобную задачу делать на cmd/bat, то нужно:
1. либо мириться с тем, что в имени файла должен быть один ключевой символ
2. либо в данном конкретном случае если указать маску *_[0-9].ext , где ext = например перебор txt, png, jpg - то будет сверяться именно та цифра перед расширением ?
ведь если есть имя файла Fi_1.le_0.txt , то маска *_[0-9].ext выявит одно конкретное место, несмотря на два символа _ ?

если вторая идея верная, то как можно добавить цикл перебора маски _[0-9].txt, _[0-9].jpg, _[0-9].png ?

Последний раз редактировалось shadowbat, 04-01-2015 в 15:58.


Отправлено: 15:11, 04-01-2015 | #13


Ветеран


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

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


shadowbat, чтобы сделать любое: что пакетный файл, что скрипт WSH, або PowerShell — нужно с точностью описать алгоритм. Или хотя бы точное ТЗ. Желательно целиком и сразу. У Вас этого нет.

В большинстве случаев на маски вообще не рекомендую закладываться, поскольку можно очень хорошо «попасть». Один вариант Вы уже сами видели. Другой — при наличии в маске латиницы, а в перечне файлов — кириллицы.

Цитата shadowbat:
получается четко такую задачу на cmd/bat не сделать »
Попробуйте так:
Скрытый текст
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set /a iStart = 2
set /a iFinish = 3

for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d "*.*"`) do (
	set sName=%%~ni
	set sExt=%%~xi
	
	for /l %%j in (%iStart%, 1, %iFinish%) do for /f "usebackq delims=" %%k in (
		`echo !sName!^|findstr.exe "^.*_%%j$"`
	) do echo del "%%~k!sExt!"
)

endlocal
exit /b 0

Update: Ах, да, совсем забыл написать — для реального удаления уберите «echo».

Последний раз редактировалось Iska, 04-01-2015 в 17:25. Причина: Дополнение

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

Отправлено: 17:10, 04-01-2015 | #14


Старожил


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

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


Цитата:
Или хотя бы точное ТЗ. Желательно целиком и сразу. У Вас этого нет.
ТЗ не менялось на протяжении всей темы. была дана маска "_i.Extension"
да, я не написал "с учетом если в имени файла есть символы "_", пробелы, кириллица, иероглифы"
этого уточнения не было, потому что я и сам не знал, что с обработкой строк в cmd есть некоторые проблемы и нельзя, чтобы дублировался знак "_" в имени в данном случае
может быть ТЗ не было описано достаточно понятно в первом сообщении


Цитата:
Попробуйте так:
спасибо! , всё удаляется верно согласно хвостику (и с пробелами в имени файла, и с кириллицей и с иероглифами и с несколькими "_")

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


Отправлено: 17:57, 04-01-2015 | #15


Ветеран


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

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


Цитата Iska:
В большинстве случаев на маски вообще не рекомендую закладываться, поскольку можно очень хорошо «попасть». Один вариант Вы уже сами видели. Другой — при наличии в маске латиницы, а в перечне файлов — кириллицы. »

shadowbat, Вы, наверное, не поняли, в каком смысле здесь упомянута кириллица? Дело в том, что команды командной строки ("dir", "del", "copy", "move", "findstr", "find", "if", "for" и т. д., то есть те команды, которые синтаксически могут использовать подстановочные знаки) при работе с масками пользуются короткими именами, то есть стандартом "8.3", являющимся наследием "досовских" времён. Создание коротких имён по умолчанию включено на всех дисках во всех ОС, кроме Windows 8 и 8.1, в которых оно включено только для системного диска и подключаемых внешних жёстких дисков. Кириллические символы не могут присутсвовать в коротких именах, поэтому они заменяются на латинские. При совпадении какой-либо маски на латинице с частью коротких имён файлов или папок, имеющих "в миру" кириллические имена, происходит их обработка командой как подходящих под маску.

Но от этого могут "пострадать" не только файлы и папки с кириллическими именами, но и любые файлы и папки, чьё имя длиннее 8-ми, а расширение длиннее 3-х символов. Выполните команду
Код: Выделить весь код
dir /b "%TEMP%\*~*"
,
и Вы увидите чуть ли не всё содержимое папки "Temp", поскольку тильда присутсвует во всех коротких именах, не совпадающих с обычным именем.

Особым "цинизмом" отличается команда
Код: Выделить весь код
del *.htm *.doc *.jpe
,
которая удалит как файлы с объявленными расширениями, так и файлы с расширениями ".html", ".docx", ".jpeg" и т. п., так как их короткие имена будут оканчиватся также объявленными в маске расширениями.
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:45, 05-01-2015 | #16


Ветеран


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

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


Цитата Georgio:
Дело в том, что команды командной строки ("dir", "del", "copy", "move", "findstr", "find", "if", "for" и т. д., то есть те команды, которые синтаксически могут использовать подстановочные знаки) при работе с масками пользуются короткими именами, то есть стандартом "8.3", являющимся наследием "досовских" времён. »
Не совсем так. Всё дело в WinAPI. FindFirstFile/FindNextFile обрабатывают и длинные, и короткие имена. Приложения лишь пользуются результатами вызовов.

Цитата Georgio:
Но от этого могут "пострадать" не только файлы и папки с кириллическими именами, но и любые файлы и папки, чьё имя длиннее 8-ми, а расширение длиннее 3-х символов. »
Угу. Просто с кириллицей нагляднее .


Цитата Georgio:
Особым "цинизмом" отличается команда … которая удалит как файлы с объявленными расширениями, так и файлы с расширениями ".html", ".docx", ".jpeg" и т. п., так как их короткие имена будут оканчиватся также объявленными в маске расширениями. »
Сюда же относится и интересный вопрос «Почему в мою маску «*.???» попадают файлы с более длинным расширением, которые я хотел отделить?» .

Последний раз редактировалось Iska, 05-01-2015 в 08:17.

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

Отправлено: 08:11, 05-01-2015 | #17



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Удалить папки по маске run0ut Скриптовые языки администрирования Windows 9 21-03-2017 01:27
CMD/BAT - удалить файлы по маске из каталога Gablik Скриптовые языки администрирования Windows 15 04-09-2012 16:23
.NET - Скачать файлы с ftp по маске. Sadhacker Программирование и базы данных 1 20-07-2012 21:23
Как удалить разделы в реестре по маске? TempUser AutoIt 0 14-05-2011 15:49
Удалить файлы в папке по маске Nealles Программирование и базы данных 4 10-09-2003 23:11




 
Переход