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

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

Bruce Wayne 07-04-2012 19:16 1895267

Параллельный отбор
 
Доброе время суток!

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

Foreigner 07-04-2012 19:35 1895271

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 1895275

Код:

del /f /q /s /a *.bak *.old *.tmp

Bruce Wayne 07-04-2012 21:11 1895312

Foreigner, спасибо большое!) Ваш вариант вполне устраивает,

Код:

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

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

kiripanda 07-04-2012 21:38 1895323

Цитата:

Цитата Bruce Wayne
Я хотел бы, чтобы батник проверял все пути только один раз, удаляя все указанные расширения. »

Замените /q на /p и убедитесь, что так оно и есть.
А метод Foreigner наоборот, запускает по отдельному поиску на каждое расширение.

Bruce Wayne 07-04-2012 21:49 1895327

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

Foreigner 07-04-2012 21:54 1895333

Цитата:

Цитата Bruce Wayne
но раздражает огромное количество окон »

start с ключом /b
Код:

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

kiripanda 07-04-2012 22:04 1895344

Цитата:

Цитата Bruce Wayne
батник проверяет каждую папку заново по каждому из указанных расширений, затем переходит к следующей папке, тоже проверяет её от начала и до конца ровно столько раз, сколько указано типов файлов т. д. до тех пор, пока не будут проверены все папки. Мне же нужно, чтобы каждая папка проверялась один раз на наличие всех указанных расширений сразу. »

Гм. А как ищет
Код:

dir /b *.bak *.old *.tmp
каждое расширение по отдельности или все сразу?

Bruce Wayne 07-04-2012 22:17 1895353

kiripanda, не знаю, всё слишком быстро) Но, походу, по очереди)

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

Foreigner 07-04-2012 22:23 1895359

Цитата:

Цитата kiripanda
каждое расширение по отдельности или все сразу? »

Надо все сразу. По времени запуск в отдельном процессе явно быстрей
Код:


> 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 1895380

Цитата:

Цитата Foreigner
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 1895386

Foreigner, kiripanda, моё почтение! Спасибо вам за помощь!) Тема закрыта.

Foreigner 07-04-2012 23:35 1895387

Цитата:

Цитата kiripanda
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 1895400

и всё равно что-то здесь не так
Код:

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 сек и одно почти за секунду


Время: 22:51.

Время: 22:51.
© OSzone.net 2001-