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

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

shadowbat 03-01-2015 19:13 2451430

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

yurfed 03-01-2015 21:13 2451463

shadowbat, не совсем понятно что вам нужно.
Что такое i1=2 i2=3?
Какая операционка?
От имени администратора
del \путь к папке\*_*.txt
del \путь к папке\*_*.jpg
и так далее. Зачем огород городить. Всё легко и просто через bat, cmd.
Или так
del \путь к папке\file*_*.txt

shadowbat 03-01-2015 21:23 2451468

i1=2 i2=3 - задается в начале бат файла два значения. например одно значение "2", второе значение "3"
бат удаляет все файлы по маске *_i.extension, где i в цикле сменяется с "2" до "3" с шагом 1
например есть сто разных имён с хвостиками от _0 до _5 (в сумме 600 разных файлов). нужно удалить все файлы с хвостиками от 2 до 3, чтобы остались хвостики 0,1,4,5, неважно какое там расширение (в сумме из 600 останется 400 файлов)
похожий пример и показан на картинке в первом сообщении, в котором удаляются все файлы с хвостиками от "_2" до "_3"

операционка Windows...
del \путь к папке\*_*.txt слишком топорно перебирать все существующие расширения вручную
так можно дойти до
del \путь к папке\*_2.txt
del \путь к папке\*_2.jpg
del \путь к папке\*_2.doc
del \путь к папке\*_3.txt
del \путь к папке\*_3.jpg
del \путь к папке\*_3.doc
и еще сто похожих строк

yurfed 03-01-2015 21:52 2451474

Цитата:

Цитата shadowbat
слишком топорно перебирать все существующие расширения вручную »

А звёздочку уже отменили *
Цитата:

Цитата shadowbat
так можно дойти до »

А так в батник запихнуть две строчки не судьба?
Цитата:

del \путь к папке\*_2.*
del \путь к папке\*_3.*

Georgio 03-01-2015 21:57 2451477

Код:

@echo off& setlocal enableextensions

set /a i1=2,i2=3
set "mask=_i.*"

for /l %%i in (%i1% 1 %i2%) do cmd /v:on /c del "*!mask:i=%%i!"

endlocal& exit /b


shadowbat 03-01-2015 21:57 2451478

Цитата:

А так в батник запихнуть две строчки не судьба?
а если нужно удалить файлы с хвостиками от "2" до "30", то 29 строчек вписывать?
можно и вручную через поиск в експлорере ввести "_2." и удалить мышкой. зачем тогда тему создавать?

Georgio
спасибо огромное, все работает!

shadowbat 03-01-2015 22:31 2451502

а можно как то изменить, чтобы удалял не по маске *_i.*, а по маске *_i.extension ?

чтобы не удалял файлы типа file_1.file_0.jpg (если в i от 1 до 3, то он не должен этот файл удалять, а он удаляет)
то есть если такая маска попадется случайно в середине имени файла

Georgio 04-01-2015 05:21 2451602

Код:

@echo off& setlocal enableextensions

set /a i1=2,i2=3
set "mask=_i.*"

for /l %%i in (%i1% 1 %i2%) do (
 for /f "delims=" %%j in ('
  cmd /v:on /c dir /a-d/b "*!mask:i=%%i!"^| findstr /rc:"%mask:i.=[0-9][0-9]*\.[^\.][^\.]%$"
 ') do del "%%j"
 )
 

endlocal& exit /b


shadowbat 04-01-2015 08:20 2451617

спасибо
может я что то не так делаю или объясняю, но удалился файл, у которого в середине есть _2., хотя в конце _0

shadowbat 04-01-2015 10:53 2451645

можно упростить и делать проверку просто на последний символ в имени файла
если он равен от 2 до 3 с шагом 1, то удалять файл
например если есть File1.jpg File2.txt File3.jpg, то удалить файлы File2.txt и File3.jpg
так наверное будет проще?

shadowbat 04-01-2015 14:44 2451750

а что в 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 я не так хорошо знаю, хотя особенного тут совсем нет ничего же

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

Iska 04-01-2015 15:05 2451760

Цитата:

Цитата shadowbat
а что в cmd/bat нет команды поиска справа налево »

Вообще. Ни справа налево, ни слева направо.

Цитата:

Цитата shadowbat
или обрезка строки? »

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

Цитата:

Цитата shadowbat
я вчера на vba за 15 минут это сделал. там же делов на две строчки. »

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

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

shadowbat 04-01-2015 15:11 2451763

Цитата:

Ни справа налево, ни слева направо.
да, тогда сложнее конечно.
Цитата:

Значит, Вам понравится 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 ?

Iska 04-01-2015 17:10 2451832

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

shadowbat 04-01-2015 17:57 2451867

Цитата:

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


Цитата:

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

Georgio 05-01-2015 07:45 2452090

Цитата:

Цитата 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" и т. п., так как их короткие имена будут оканчиватся также объявленными в маске расширениями.

Iska 05-01-2015 08:11 2452097

Цитата:

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

Не совсем так. Всё дело в WinAPI. FindFirstFile/FindNextFile обрабатывают и длинные, и короткие имена. Приложения лишь пользуются результатами вызовов.

Цитата:

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

Угу. Просто с кириллицей нагляднее ;).


Цитата:

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

Сюда же относится и интересный вопрос «Почему в мою маску «*.???» попадают файлы с более длинным расширением, которые я хотел отделить?» ;).


Время: 16:56.

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