Войти

Показать полную графическую версию : [решено] Параллельный отбор


Bruce Wayne
07-04-2012, 19:16
Доброе время суток!

Помогите, пожалуйста, решить вот такую проблему: мой батник удаляет временные файлы по расширениям *.tmp, *.old и т. д., их там много. Мне нужно как-то сделать поиск "параллельным", чтобы не начинать поиск каждый раз сначала. То есть, я хочу, чтобы при поиске файлов просматривались сразу все перечисленные расширения, а не по очереди. Существует ли такая возможность? А то уже надоело ждать по 40 минут, пока всё очистится - слишком много файлов и папок просматривается. Заранее спасибо!

Foreigner
07-04-2012, 19:35
Bruce Wayne,
Можно запустить сразу несколько копий батника. Например, батник получает аргумент в виде расширения файла:

del /s /a \*.%1

То тогда можно этот батник вызвать так:

C:\> for %i in (old tmp temp) do start 1.cmd %i


Или в самом батнике запускать новый экземпляр cmd.exe:

for %%i in (tmp temp old) do start cmd /c "del /s /a \*.%%i"

kiripanda
07-04-2012, 19:42
del /f /q /s /a *.bak *.old *.tmp

Bruce Wayne
07-04-2012, 21:11
Foreigner, спасибо большое!) Ваш вариант вполне устраивает,

for %%i in (tmp temp old) do start cmd /c "del /s /a \*.%%i"
но раздражает огромное количество окон, открывающихся в процессе выполнения. Нельзя ли их как-нибудь скрыть? Я пробовал с помощью утилит, но не получилось. Возможно, я не туда ставил команду утилиты, а именно перед "cmd" в вышеуказанном коде.

kiripanda, спасибо Вам за помощь!) Только Вы, видимо не совсем так меня поняли. Да, получилась одна строчка, но каждый тип файлов батник ищет по новой, т. е. он сначала проверяет все пути на наличие расширения, указанного первым, затем снова проверяет те же самые пути на наличие типа файлов, указанного вторым и т. д. Я хотел бы, чтобы батник проверял все пути только один раз, удаляя все указанные расширения. Метод Foreigner хорош тем, что батник выполняется многократно и одновременно, что создаёт эффект того, что мне и нужно.

kiripanda
07-04-2012, 21:38
Я хотел бы, чтобы батник проверял все пути только один раз, удаляя все указанные расширения. »Замените /q на /p и убедитесь, что так оно и есть.
А метод Foreigner наоборот, запускает по отдельному поиску на каждое расширение.

Bruce Wayne
07-04-2012, 21:49
kiripanda, блин, извиняюсь, теперь я не так выразился: я имел в виду, что батник проверяет каждую папку заново по каждому из указанных расширений, затем переходит к следующей папке, тоже проверяет её от начала и до конца ровно столько раз, сколько указано типов файлов т. д. до тех пор, пока не будут проверены все папки. Мне же нужно, чтобы каждая папка проверялась один раз на наличие всех указанных расширений сразу.

Foreigner
07-04-2012, 21:54
но раздражает огромное количество окон »
start с ключом /b

... do start /b cmd /c "...

kiripanda
07-04-2012, 22:04
батник проверяет каждую папку заново по каждому из указанных расширений, затем переходит к следующей папке, тоже проверяет её от начала и до конца ровно столько раз, сколько указано типов файлов т. д. до тех пор, пока не будут проверены все папки. Мне же нужно, чтобы каждая папка проверялась один раз на наличие всех указанных расширений сразу. »Гм. А как ищет
dir /b *.bak *.old *.tmp
каждое расширение по отдельности или все сразу?

Bruce Wayne
07-04-2012, 22:17
kiripanda, не знаю, всё слишком быстро) Но, походу, по очереди)

Foreigner, огромное спасибо!) Думаю, проблема решена, но хочу выслушать ещё варианты, если они будут - пока не стану закрывать тему.

Foreigner
07-04-2012, 22:23
каждое расширение по отдельности или все сразу? »
Надо все сразу. По времени запуск в отдельном процессе явно быстрей

> cmd /v:on
Microsoft Windows [Version 6.1.7601]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

> echo !time! && 1>nul dir /b /s \*.tmp \*.old \*.temp && echo !time!
22:13:52,65
22:13:57,56


> cmd /v:on
Microsoft Windows [Version 6.1.7601]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

> (
Продолжить? echo !time!
Продолжить? for %i in (old tmp temp) do start /b cmd /c "1>nul dir /b /s \*.%i"
Продолжить? echo !time!
Продолжить? )
22:21:01,52

> start /b cmd /c "1>nul dir /b /s \*.old"

> start /b cmd /c "1>nul dir /b /s \*.tmp"

> start /b cmd /c "1>nul dir /b /s \*.temp"
22:21:01,55

kiripanda
07-04-2012, 23:08
22:21:01,52
...
22:21:01,55 »
такая бешеная скорость получается потому, что не учитывается время работы дочерних процессов
C:\>(
Продолжить? echo !time!
Продолжить? for %i in (old tmp temp) do start /b /wait cmd /c "1>nul dir /b /s \*.%i"
Продолжить? echo !time!
Продолжить? )
23:01:50.56

C:\>start /b /wait cmd /c "1>nul dir /b /s \*.old"

C:\>start /b /wait cmd /c "1>nul dir /b /s \*.tmp"

C:\>start /b /wait cmd /c "1>nul dir /b /s \*.temp"
Файл не найден
23:01:55.25

C:\>echo !time! && 1>nul dir /b /s \*.old \*.tmp \*.temp && echo !time!
23:02:41.32
23:02:44.32

Bruce Wayne
07-04-2012, 23:30
Foreigner, kiripanda, моё почтение! Спасибо вам за помощь!) Тема закрыта.

Foreigner
07-04-2012, 23:35
start /b /wait »
Так тоже не правильно, получается последовательное выполнение. Наверное так верней, выводится окончание каждого dir'а:

> echo !time! && for %i in (tmp temp old) do start /b cmd /c "1>nul dir /b /s \*.%i && echo !time!"
23:28:02,80

> start /b cmd /c "1>nul dir /b /s \*.tmp && echo !time!"

> start /b cmd /c "1>nul dir /b /s \*.temp && echo !time!"

> start /b cmd /c "1>nul dir /b /s \*.old && echo !time!"

> 23:28:02,82
23:28:02,81
23:28:02,82

kiripanda
07-04-2012, 23:52
и всё равно что-то здесь не так
w:\>echo !time! && for %i in (tmp temp old) do start /b cmd /c "1>nul dir /b /s \*.%i && echo !time!"
23:48:24.04

w:\>start /b cmd /c "1>nul dir /b /s \*.tmp && echo !time!"

w:\>start /b cmd /c "1>nul dir /b /s \*.temp && echo !time!"

w:\>start /b cmd /c "1>nul dir /b /s \*.old && echo !time!"

w:\>23:48:24.04
23:48:24.04
23:48:24.04
echo !time! && 1>nul dir /b /s \*.tmp && echo !time!
23:48:52.68
23:48:53.32

3 расш. за 00.00 сек и одно почти за секунду




© OSzone.net 2001-2012