Страница 3 из 4

Добавлено: Сб июл 09, 2016 18:19
Hjkma
Здравствуйте. По работе со скриптом появилась пара вопросов.
1) Возможно ли расширить лимит знаков в поле параметров в настройках панели инструментов? Ныне этот лимит ограничен в 2048 символов, а этого мне теперь уже недостаточно. А если никак, то возможно ли чтобы скрипт работал с масками по списку в текстовом документе? Или например отредактировать скрипт и прямо в тексте скрипта вставить нужные маски?
2) Появилась теперь нужда узнать, какие маски часто встречаются в названиях находимых файлов и какие редко встречаются, то есть нужно определить какие маски наиболее "результативные", а какие - менее. Если этот скрипт определяет кол-ство файлов в таких-то папках, находимых по маскам, и сортирует в списке эти самые папки по кол-ству находимых файлов в них, то возможно ли отредактировать скрипт, чтобы он делал почти то же самое, но вместо названия папок скрипт теперь бы определял "рейтинг масок", где в списке наверху будут маски, по которым файлы наиболее находятся, а внизу будут идти маски, файлы по которым меньше всех находятся?

Спасибо.

Добавлено: Сб июл 09, 2016 19:13
Flasher
1) Первую половину можно писать в поле "Команда:" с ;" на конце, а второе поле начинать с ".
2) Возможно. Только нужно прояснить, найденные по маске файлы касаются всех структуры или каждой его папки в отдельности, как и сейчас?

Добавлено: Сб июл 09, 2016 20:15
Hjkma
Flasher
1) Ну получится втиснуть в лучшем случае масок на около 4000+ знаков. А мне нужно гораздо больше. Если я правильно понял о чем речь.
2)
Возможно. Только нужно прояснить, найденные по маске файлы касаются всех структуры или каждой его папки в отдельности, как и сейчас?
Не совсем понятно. Если речь о том, что в папках есть файлы, которые дублируются в других папках, то они такие есть, но в малых количествах.

Добавлено: Сб июл 09, 2016 20:24
Flasher
Hjkma
1) Ясно. Тогда переносим параметр в код: под шапкой пишем

Код: Выделить всё

Filt = "<маски>"
, а в 24 строке Filt вместо WScript.Arguments(0).
2. И чего с ними делать? Плюсовать - нет? Не ясен замысел. Как называются папки, содержащие файлы, знать не надо, а число файлов неизвестно в каких папках - надо? КПД тут в чём?

Добавлено: Сб июл 09, 2016 20:42
Hjkma
Flasher
1) Спасибо. Еще нужно узнать, как маски правильно разделяются, а то у меня выдало ошибку
Строка: 8. Символ: 26. Ошибка: Предполагается наличие окончания инструкции
2) Ну я ведь объяснил, мне нужно узнать самые "результативные" маски. То есть сколько файлов находятся по каким маскам. Если к примеру, маска "ресторан" находит 112 файлов, то хотелось бы, чтобы в списке это было показано как "ресторан" - 112 файлов. Также как в оригинальном скрипте, только вместо папок в выводимом списке - скрипт в этом списке сортирует сами маски.

апд.
Сами дублирующие файлы - можно плюсовать, проблем нет.

Добавлено: Сб июл 09, 2016 20:59
Flasher
Hjkma
1) Дело не в разделении. Пример 8 строки в студию.
2) Объясняю. Если бы дубликаты по маске имелись только в одиночных каталогах, то можно было бы имена папок оставить. Ежели нет, то колонка для имён папок, разумеется, будет лишней (хотя папки вполне можно перечислять через запятую).

Добавлено: Сб июл 09, 2016 21:06
Hjkma
1)
Filt = "*Melissa Clarke*";"*Mel Clarke*";"*Clarke*";"*Lucy Pinder*";"*Pinder*";"*Holly Peers*";"*Peers*";"*Lucy Vixen*";"*Lucy Collet*";"*lucy v*";
Это не все маски, тут только 8 строка
2) Ну имена папок оставлять не обязательно, достаточно только имена масок и кол-ство находимых при них файлов.

Добавлено: Сб июл 09, 2016 21:28
Flasher
1) Ну, здрасьте. А зачем внутренние кавычки? В шапке пример имеет только наружные. И ; на конце там совсем ни к чему.

Код: Выделить всё

Filt = "*Melissa Clarke*;*Mel Clarke*;*Clarke*;*Lucy Pinder*;*Pinder*;*Holly Peers*;*Peers*;*Lucy Vixen*;*Lucy Collet*;*lucy v*"
Для того, чтобы было удобно редактировать, можно писать в несколько строк. Пример (в качестве разделителя для нового скрипта возьмём "|"):

Код: Выделить всё

Filt = "name.txt|name 1.txt|name 1*.txt|name *1.*|" &_
"2.txt|name2.txt|name 2.txt|name *2.txt|name 2*.*|" &_
"3.txt|name 3.*|name3.txt|name 4.txt|name *4*.txt"
B в Sub-процедуре для новых условий меняем

Код: Выделить всё

  Items.Filter 73920, WScript.Arguments(0)
  If Items.Count Then
    Dict.AddNew : Dict("Name") = FSO.GetFileName(Fold)
    Dict("Count") = Items.Count
  End If : Items.Filter 73888, "*"
на

Код: Выделить всё

  For Each F in Split(Filt, "|")
    Items.Filter 73920, F
    If Items.Count Then
      Dict.AddNew : Dict("Name") = F
      Dict("Count") = Items.Count
    End If
  Next : Items.Filter 73888, "*"
Сам пока не тестировал. Хотя нет, тут кое-что ещё нужно. Сейчас...

Добавлено: Сб июл 09, 2016 22:06
Hjkma
Flasher
Благодарю. Поменял маски на
Filt = "*Melissa Clarke*;*Mel Clarke*;*Clarke*;*Lucy Pinder*"
и сработал оригинальный скрипт. А разделитель "|" у меня не сработал, нету ни сообщений об ошибке, нету ничего. Оформлял в виде:
"*Melissa Clarke*|*Mel Clarke*|*Clarke*|*Lucy Pinder*"
Наверное в чем-то ошибся?
И в связи с этим проверить работоспособность новых условий не могу, если вношу изменения и у масок стоит разделитель "|", то совершенно ничего не происходит, а если стоит разделитель ";", то появляется ошибка
Строка: 24 Символ: 3 Ошибка: Неопознанная ошибка
А строка 24 у меня такая
Set Items = ShAp.NameSpace(Fold).Items

Добавлено: Вс июл 10, 2016 00:59
Flasher
Мне пришлось отлучиться.
24 строка ранее указывалась относительно исходника. Поэтому вариант "у меня" не рассматривается. Новый разделитель касается нового задания (об этом же чётко написано!). [cut="Вот так будет выглядеть скрипт:"]

Код: Выделить всё

'==============================================================================
' Создать список отсортированных по числу файлов в структуре активного каталога
' Условие: путь запуска - пустой

Option Explicit : Dim Filt, FSO, Dict, ShAp, RecS, Dir, K, File
'=========================== Маски файлов через "|" ===========================
Filt = "1?.*|*name*|name?.txt|name 1.txt|name 1*.txt|name *1.*|" &_
"*2*|2.txt|name2.txt|name 2.txt|name *2.txt|name 2*.*|name 2?.*" &_
"*3*.txt|name 3.*|name3.txt|name 4.txt|name *4*.txt|*5*|*5*.txt"
'==============================================================================
Set FSO  = CreateObject("Scripting.FileSystemObject")
Set Dict = CreateObject("Scripting.Dictionary")
Set ShAp = CreateObject("Shell.Application")
Set RecS = CreateObject("ADODB.Recordset")
RecS.Fields.Append "Name", 200, 255
RecS.Fields.Append "Count", 139, 22
Dir = FSO.GetAbsolutePathName("")
Filt = Split(Filt,"|"): FFolder Dir
If Dict.Count Then
  RecS.Open
  For Each K in Dict.Keys
    RecS.AddNew : RecS("Name") = K : RecS("Count") = Dict(K)
  Next : RecS.Sort = "Count DESC"  : Set Dict = Nothing
  File = FSO.GetFileName(Dir) & ".csv"
  FSO.CreateTextFile(File, 1, 1).Write RecS.GetString
  ShAp.ControlPanelItem File : RecS.Close
End If

Sub FFolder(Fold)
  Dim Items, F, Cnt
  Set Items = ShAp.NameSpace(Fold).Items
  For Each F in Filt
    Items.Filter 73920, F : Cnt = Items.Count
    If Cnt Then
      If Not Dict.Exists(F) Then Dict.Add F, Cnt _
      Else Dict.Item(F) = Dict.Item(F) + Cnt
    End If
  Next : Items.Filter 73888, "*"
  For Each F in Items : FFolder F : Next
End Sub
[/cut]

Добавлено: Вс июл 10, 2016 01:52
Hjkma
Flasher
Опять что-то пошло не так. Выскакивает окно ошибки
Строка: 27 Символ: 30 Ошибка: В коллекции не удается найти элемент, соответствующий требуемому имени или порядковому номеру
Вот эта строка, на которую скрипт ругается
Num = Dict.Item(F) : RecS(Num) = CLng(RecS(Num)) + Items.Count
Пробовал так и эдак вставлять маски, все равно та же ошибка. Даже попробовал скопировать код скрипта как есть, не меняя в нем ничего и создал в одном папке текстовый файл "name 1.txt", все равно вызывается то же окно ошибки. Ну ладно, пойду спать, может завтра день будет мудренее.

Добавлено: Вс июл 10, 2016 02:08
Flasher
Hjkma
Видел ошибку. Дело не в масках. У себя вроде исправил, но что-то счётчик криво подсчитывает. Немного покумекаю.

Add: Прежняя затея оказалась опрометчивой, сделал в 2 прохода.

Добавлено: Вс июл 10, 2016 13:35
Hjkma
Flasher
Все работает. Правда что-то оно долго считает - на папку с 55+ тыс. файлов с заданными масками на 20 тыс. знаков скрипт затратил 1 час. А впереди еще папка с 300 тысяч. файлов... Ну ничего, главное работоспособность. :) Спасибо за вашу помощь, очень ценю ваше время и силы, которые вы затрачиваете на добровольную помощь. Долгих вам лет, хорошего здоровья и удачи во всех делах! Вы хороший человек.

Добавлено: Вс июл 10, 2016 15:46
Flasher
Hjkma
Долго, т.к. каждая папка дёргается 2000+ раз при таком числе масок. Я немножко ускорил, но не думаю, что это существенно облегчит процесс. Другим вариантом может стать пофайловый перебор с вхождениями вместо масок, тогда дёргания будут однократными, но вот уже коллекция будет дёргаться вдвое больше числа файлов. Возможно, при таком числе вхождений это может значительно повысить скорость.
Спасибо за добрые слова!Изображение

Добавлено: Ср июл 13, 2016 20:46
Hjkma
Flasher
Новый исправленный скрипт у меня выдает ошибку:
Строка: 17 Символ: 14 Ошибка: Предполагается наличие 'Then'
Маски задал ровно те же самые, при которых работает предыдущий вариант скрипта, путь запуска задан пустой, но вызывается только эта ошибка.
Строка 17, на что ругается скрипт, вот эта
If Dict.Count