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

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

Ответить
Настройки темы
CMD/BAT - [решено] Поиск по отрицательной маске *.* / not= dll

Аватара для semiono

Ветеран


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

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


Как?
Условия - рекурсивно, в текущем каталоге или же в указанном, если возможен батник с передачей условия в него...
а найти надо все файлы кроме заданного типа - любого.
хорошо бы батник такой чтоб не редактировать каждый раз, а передавать в него условия поиска? типа батник как утилита.

# ifind.cmd --not pdf (например)

-------
Полезное сообщение


Отправлено: 15:50, 15-07-2009

 


Moderator


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

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


semiono, как-то так?
Код: Выделить весь код
@Echo Off
SetLocal EnableExtensions

Set LstTmp="%Temp%\ifind_lst.tmp"
Dir /A-D /B "%~2%~1" >%LstTmp%
Dir /A-D /B "%~2" | FindStr /L /X /V /G:%LstTmp%
Батник принимает два параметра: 1-й - маска, второй - папка (со слешом в конце). Второй параметр необязателен (без него использует текущую папку).

Примеры:
Код: Выделить весь код
ifind.cmd *.pdf E:\10\
ifind.cmd *.pdf
Если нужно искать в подкаталогах, добавить опцию /S в командах Dir.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:36, 15-07-2009 | #2



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

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


Старожил


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

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


Сабж показался интересным и решил "убить" время...

значить логика работы:
iFind.bat [MODE] [MASK MASK...] [MODE] [MASK MASK...]

Пакетник распознает следующие команды: + и - (по умолчанию включен режим +), вдобавок в момент запуска удаления списка файлов iFind.lst не происходит, т.е. при следующих запусках работа над списком продолжается.

Все остальное считается маской для поиска. В зависимости от текущего режима результат поиска либо добавляется либо удаляется из файла списка iFind.lst (в тек. каталоге). При добавлении файлов в список могус случаться повторы, например файл file03.mov годится и для маски *0?.* и для *.mov. Такие повторы убираются автоматом (лишние полтора полчаса на отладку )

пример:
iFind *.jpg *.gif *.png - _*.* + _*.png
В список сначала отправляются все картинки (по умолчанию режим добавления), потом режим переключается на удаление и от туда удаляются все файлы, начинающиеся с подчеркивания, но потом режим снова переключается на добавление и обратно возвращаются png-картинки, начинающиеся с подчеркивания.

Код: Выделить весь код
@echo off
set ListMode=Add
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion

:Loop
if "%1"=="" Exit
set cmd=%1
shift
echo proc: %ListMode%: %cmd%
if "%cmd%"=="+" (set ListMode=Add) else if "%cmd%"=="-" (set ListMode=Sub) else Goto List_%ListMode%
echo       Set ListMode to "%ListMode%"
Goto Loop

:List_Add
if exist iFind.tmp del /f iFind.tmp
dir /s /b /on /a-d %cmd%>>iFind.lst
sort iFind.lst /O iFind.tmp
del /f iFind.lst
set prev=
for /F "delims=" %%L in (iFind.tmp) do if not "%%L"=="!prev!" (
EndLocal
echo %%L>>iFind.lst
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion
set prev=%%L
)
del /f iFind.tmp
Goto Loop

:List_Sub
if exist iFind.tmp del /f iFind.tmp
dir /s /b /on /a-d %cmd%>iFind.tmp
for /F "delims=" %%L in (iFind.tmp) do (
for /F "skip=2 delims=" %%T in ('Find /V "%%L" iFind.lst') do echo %%T>>iFind.tmp2
del /f iFind.lst
ren iFind.tmp2 iFind.lst
)
del /f iFind.tmp
Goto Loop

-------
Как сказало Дерево Дровосеку: "я - пень".

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

Отправлено: 19:53, 15-07-2009 | #3


Googler


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

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


Цитата Petya V4sechkin:
Батник принимает два параметра: 1-й - маска, второй - папка »
аналогичная функциональность одной строчкой:
Код: Выделить весь код
DIR /B/A:-D "%~2"|FindStr /IVE "%~1"
пример использования:
Код: Выделить весь код
xDIR.cmd ".exe .dll .ocx" %windir%\system32
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:41, 16-07-2009 | #4



Moderator


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

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


Цитата amel27:
аналогичная функциональность одной строчкой:
Ну, я хотел сделать именно с произвольной маской, а не только расширением ;)
Хотя автору может быть достаточно и твоего варианта.
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:46, 16-07-2009 | #5


Аватара для semiono

Ветеран


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

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


Цитата NiOl:
Сабж показался интересным и решил "убить" время... »
+1 так и бывает. Рождаются полезные весчи!

NiOl, получается функция кэшируется в список
а в памяти нельзя?

у меня какие-то глюки были, и консоль упала как буд-то бы от переполнения...

-------
Полезное сообщение


Последний раз редактировалось semiono, 16-07-2009 в 17:45.


Отправлено: 17:30, 16-07-2009 | #6


Аватара для semiono

Ветеран


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

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


amel27, можешь добавить хелп к твоему скрипту?
например if xDir --help или --h тогда то-сё... == {xDIR.cmd ".exe .dll .ocx" %windir%\system32}
и будет уже готовый инструмент! останеться только лицензию придумать ))) GPL

-------
Полезное сообщение


Отправлено: 17:48, 16-07-2009 | #7


Googler


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

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


Цитата semiono:
можешь добавить хелп к твоему скрипту »
Код: Выделить весь код
If %~1==--help Echo то-сё
З.Ы. не такой навороченый скрипт, чтобы снабжать хелпом...
ИМХО лучше текстовик приложить (xDir.hlp), чем громоздить лишний код
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:36, 17-07-2009 | #8


Старожил


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

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


Цитата semiono:
NiOl, получается функция кэшируется в список
а в памяти нельзя?
у меня какие-то глюки были, и консоль упала как буд-то бы от переполнения... »
Честно говоря я даже не представляю, как это сделать - весь список в переменную не засунуть - у меня при проверке создавались файлы больше 100к, а стандартный размер переменной 4к, кажется можно расширить до 64к, но контролировать, какого рамера сейчас переменная - очень медленный процесс. Я пару раз попытался засесть со "свежими" идеями, типа хранения списка файлов и структуры каталога чуть ли не в виде 2х раздельных БД, разбиение переменной на нумерованную серию, но... не потянул.

-------
Как сказало Дерево Дровосеку: "я - пень".


Отправлено: 15:20, 21-07-2009 | #9



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Удалить папки по маске run0ut Скриптовые языки администрирования Windows 9 21-03-2017 01:27
CMD/BAT - [решено] Перемещение и удаление файлов по условию и маске VitHAK Скриптовые языки администрирования Windows 14 23-12-2013 08:57
CMD/BAT - [решено] Копирование файлов по маске за вчерашний день dvassilyev Скриптовые языки администрирования Windows 8 19-10-2011 19:36
CMD/BAT - [решено] Перемещение (удаление) директорий по маске ven00m Скриптовые языки администрирования Windows 17 15-11-2009 10:24
CMD/BAT - [решено] Backup дерева папок по маске newb1e Скриптовые языки администрирования Windows 4 27-07-2009 17:28




 
Переход