Поиск файлов и создание определенных папок

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Ответить
Slaider
Сообщения: 6
Зарегистрирован: Вт сен 29, 2009 14:30

Поиск файлов и создание определенных папок

Сообщение Slaider »

Поиск файлов и создание определенных папок с последующей сортировкой файлов.
Каждый день пополняется архив большим количеством файлов разнообразных форматов в основном .dwg .cdw .doc .xls .jpg итп
При загрузке на ПК посредством сервера и ява с каждым файлом создается сопутствующий файл с таким же именем но расширением .txt. описанием, вида:

Номер документа.:ххххххххх =====================================================
Version: хх
Language: ххх
Title: ххххххх
Document group: хххххххххххххх
Release No.:ххххххххххххххххх =====================================================

Если это возможно помогите создать скрипт который будет брать информацию с определенной строчки .txt по этой инф создовать папку и копировать в нее эти идентичные пары файлов. Заранее благодарен.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Slaider
ОК.
Какая конкретно строка? Что из неё брать?

Скрипт должен обрабатывать все файлы в конкретной папке или работать по выделенным файлам?
Нет, я не сплю. Я просто медленно моргаю.
Slaider
Сообщения: 6
Зарегистрирован: Вт сен 29, 2009 14:30

Сообщение Slaider »

Было бы здорово еслиб можно было бы настроить скрипт на строку или слово.
Например
Document group: 220
где скрипт берет имя создоваемой дирректории 220 после чего копирует в нее все пары файлов где Document group: 220.
Предполагаю в конкретной папке и хотябы одной подпапке. т.к файлы разбиты примерно по 100 шт в папке.

Понимаю что это очень сложно организовать потому почти не надеюсь на успех, но все же. Заранее благодарен.
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

Да, сложно организовать, потому что сложно понять, что тебе надо. Batya тебе задал конкретные вопросы, а ты на них не ответил, зато еще туману напустил.
1. Что за строка "Document group: 220"? Откуда она берется? Чем одна группа отличается от другой - только номером или всеми тремя ключевыми словами? Может ли быть ключевых слов не три? Сколько тогда? Откуда брать нужное?
2. Что значит "пары файлов"? Кто входит в пару?
3. Фраза "Предполагаю в конкретной папке и хотябы одной подпапке. т.к файлы разбиты примерно по 100 шт в папке" меня вообще заставила усомниться - со мной по-русски говорят или где?

Короче - грамотно ставь задачу, тогда и на решение можно надеяться.
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Вахмурка писал(а):3. Фраза "Предполагаю в конкретной папке и хотябы одной подпапке. т.к файлы разбиты примерно по 100 шт в папке" меня вообще заставила усомниться - со мной по-русски говорят или где?
:D У меня сначала мозг закипал, когда я пытался осмыслить сказанное Slaider, а на этой фразе вообще взорвался.

Slaider
Послушай, на этом форуме есть те, кто готов тебе помочь. Но именно "помочь" - это значит, что основная деятельность должна исходить от тебя. Под основной деятельностью я подразумеваю грамотную постановку задачи.
Как любят в подобных случаях говорить на этом форуме: Телепатов здесь нет.
Постарайся короткими предложениями с соблюдением норм русского языка объяснить свою задачу. Например, использование запятых - это не атавизм, это приём, который в письменном общении помогает правильно понимать собеседника.
Вообщем, извини за занудную лекцию.

Вопросы (ответь, пожалуйста, на все):
1. Приведи конкретный пример txt-файла.
2. Какая строчку из этого файла нам необходима для создания новой папки?
3. По какому критерию эту строчку можно однозначно идентифицировать?
4. В каком месте создавать новую папку?
5. Возможно ли, что у файлов ".dwg .cdw .doc .xls .jpg итп" одинаковые имена? Т.е., что txt-файл относится сразу к нескольким подобным файла?
6. В итоге файлы необходимо копировать или переносить?
7. И ещё раз: Скрипт должен обрабатывать все файлы в конкретной папке или работать по выделенным файлам?
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Slaider
Наконец-то готово:

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

'==========================================================================
' Копирование пар файлов в новую папку согласно информации из txt-файла

' Параметры:
' {обрабатываемая папка} {целевая папка}
'
' Автор - Batya
'==========================================================================
'Включаем режим необходимости объявлять переменные
Option Explicit
'======== Изменяемые параметры ============================================
'Задаем константы
Const TXTExt    = "TXT" 'Расширение описательных файлов
Const SearchStr = "Document group:" 'Искомая строка
'==========================================================================
'Объявляем переменные
Dim FSO, WSH, Mess, Folder1, Folder2, Files, F, P, Text, S
'Выполняем процедуру формирования массива сообщений
SetMess
'Объявляем служебные объекты
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("WScript.Shell")

'Включаем режим ручной обработки ошибок
On Error Resume Next
'Выполняем процедуру проверки входых параметров. Затем проверяем ошибки.
CheckParam:CheckErr

'Объявляем массив рабочих файлов
Set Files = CreateObject("Scripting.Dictionary")
'Выполняем процедуру получения массива рабочих файлов. Затем проверяем ошибки.
GetFiles Folder1, TXTExt:CheckErr

'Для всех файлов в массиве рабочих файлов ...
For Each F In Files
  'Выполняем функцию получения парного файла. Затем проверяем ошибки.
  P = GetPair(F, TXTExt):CheckErr
  'Если парный файл найден ...
  If P <> "" Then
    'Читаем текст из парного файла. Затем проверяем ошибки.
    Text = GetText(P):CheckErr
    'Получаем необходимый текст из парного файла
    S = Trim(RegExpSearch(Text, "(" & SearchStr & ")(\s*)([^\n\r]+)", 3))
    'Если текст найден ...
    If S <> "" Then
      'Формируем путь папки для копирования пары файлов
      S = Folder2 & "\" & S
      'Если папки не существует, создаём её
      If Not FSO.FolderExists(S) Then CreateFolder S:CheckErr
      'Копируем рабочий файл. Затем проверяем ошибки.
      CopyFile F, S & "\":CheckErr
      'Копируем парный файл. Затем проверяем ошибки.
      CopyFile P, S & "\":CheckErr
    End If
  End If
'Переходим к следующему файлу
Next

'Выводим сообщение о завершении работы скрипта
MessBox Mess(5), 3

'Выходим без ошибки - код выхода - 0
Quit 0

'Функция разворачивает путь файла (раскрываем системные переменные). Параметры:
'  pPath - путь к файлу
Function GetPath(pPath)
  GetPath = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(pPath))
End Function

'Функция возвращает текстове содержимое файла. Параметры:
'  pPath - путь к файлу
Function GetText(pPath)
  GetText = FSO.OpenTextFile(pPath, 1, False).ReadAll
End Function

'Процедура создания папки.
'Вынесено в отдельную процедуру для изменения при необходимости способа создания
Sub CreateFolder(pPath)
  FSO.CreateFolder pPath
End Sub

'Процедура копирования файла
'Вынесено в отдельную процедуру для изменения при необходимости способа копирования
Sub CopyFile(pFilePath, pFolder)
  FSO.CopyFile pFilePath, pFolder
End Sub

'Процедура получения массива рабочих файлов. Параметры:
'  pPath - путь к папке с рабочими файлами;
'  pExt  - расширение парных файлов - пропускаем такие файлы
Sub GetFiles(pPath, pExt)
  'Объявляем переменные
  Dim lF
  'Для всех файлов в папке ...
  For Each lF In FSO.GetFolder(pPath).Files
    'Если расширение файла не совпадает с расширением для парных файлов,
    '  то добавляем этот файл к массиву рабочих файлов
    '(Сравниваем, приведя текст к одному регистру - верхнему)
    If UCase(FSO.GetExtensionName(lF)) <> UCase(pExt) Then Files.Add lF.Path, ""
  'Переходим к следующему файлу
  Next
  'Для всех вложенных папок ...
  For Each lF In FSO.GetFolder(pPath).SubFolders
    'Добавляем к массиву рабочих файлов файлы из вложенной папки
    GetFiles lF.Path, pExt
  'Переходим к следующей папке
  Next
End Sub

'Функция получения пары для файла. Параметры:
'  pPath - путь к файлу;
'  pExt  - расширение парного файла
Function GetPair(pPath, pExt)
  'Объявляем переменные
  Dim lF, lPF, lPath
  'Получаем имя родительской папки
  lPF   = FSO.GetParentFolderName(pPath)
  'Начало пути, которое должно быть у парного файла -
  '  путь родительской папки + имя файла без расширения
  lPath = lPF & "\" & FSO.GetBaseName(pPath)
  'Для всех файлов в родительской папке ...
  For Each lF In FSO.GetFolder(lPF).Files
    'Если расширение файла совпадает с расширением для парных файлов ...
    '(Сравниваем, приведя текст к одному регистру - верхнему)
    If UCase(FSO.GetExtensionName(lF.Path)) = UCase(pExt) Then
      'Если начало пути для парного файла = началу пути рассматриваемого файла ...
      If UCase(lPath) = UCase(Left(lF.Path, Len(lPath))) Then
        'значит пару нашли
        GetPair = lF.Path
        'Выходим из функции
        Exit Function
      End If
    End If
  'Переходим к следующему файлу
  Next
End Function

'Функция поиска с помощью регулярных выражений. Параметры:
'  pText - текст, в котором ищем;
'  pFind - искомое выражение;
'  pNum  - номер возвращаемого элемента найденного
Function RegExpSearch(pText, pFind, pNum)
  'Объявляем переменные
  Dim regEx, Matches
  'Объявляем объект рег. выражений
  Set regEx        = New RegExp
  'Задаём выражение для поиска
  regEx.Pattern    = pFind
  'Указываем игнорирование регистра символов
  regEx.IgnoreCase = True
  'Указываем поиск единственного искомого
  regEx.Global     = False
  'Выполняем поиск в тексте
  Set Matches      = regEx.Execute(pText)
  'Если что-либо найдено, возвращаем из найденного необходимую часть
  If Matches.Count > 0 Then RegExpSearch = Matches(0).Submatches(pNum - 1)
End Function

'Процедура проверки входных параметров
Sub CheckParam
  'Работаем с объектом WScript
  With WScript
    'Если параметров нет, генерим ошибку
    If .Arguments.Count = 0 Then Err.Raise vbObjectError + 1, "", Mess(1)
    'Если параметров меньше 2, генерим ошибку
    If .Arguments.Count < 2 Then Err.Raise vbObjectError + 2, "", Mess(2)
    'Первый параметр (индекс 0) - обрабатываемая папка
    Folder1 = GetPath(.Arguments(0))
    'Второй параметр (индекс 1) - целевая папка
    Folder2 = GetPath(.Arguments(1))
  End With
  'Если обрабатываемая папка не существует, генерим ошибку
  If Not FSO.FolderExists(Folder1) Then Err.Raise vbObjectError + 3, "", Mess(3)
  'Если целевая папка не существует, генерим ошибку
  If Not FSO.FolderExists(Folder2) Then Err.Raise vbObjectError + 4, "", Mess(4)
End Sub

'Процедура задания массива сообщений
Sub SetMess
  'Объявляем ассоциированный массив
  Set Mess = CreateObject("Scripting.Dictionary")
  'Работаем с объектом Mess
  With Mess
    'Задаем сообщения
    .Add -1, "Возникла ошибка № "
    .Add  0, "Копирование пар файлов"
    .Add  1, "Не указаны параметры!"
    .Add  2, "Указаны не все параметры!"
    .Add  3, "Указанная обрабатываемая папка не существует!"
    .Add  4, "Указанная целевая папка не существует!"
    .Add  5, "Операция завершена"
  End With
End Sub

'Функция вывода сообщения. Параметры:
'  pMess - текст сообщения;
'  pMode - режим сообщения
Function MessBox(pMess, pMode)
  'Объявляем переменные
  Dim lIcon
  'Иконка и кнопки зависят от режима
  Select Case pMode
    Case 1 lIcon = vbCritical    + vbOKOnly
    Case 2 lIcon = vbExclamation + vbOKOnly
    Case 3 lIcon = vbInformation + vbOKOnly
  End Select
  'Вызываем системный диалог с заданным заголовком
  MessBox = MsgBox(pMess, lIcon, Mess(0))
End Function

'Процедура проверки наличия ошибки
Sub CheckErr
  'Есть ли ошибка?
  If Err.Number <> 0 Then
    'Выводим сообщение об ошибке
    MessBox Mess(-1) & Err.Number & ":" & vbNewLine & Err.Description, 1
    'Завершаем скрипт с кодом ошибки
    Quit Err.Number
  End If
End Sub

'Процедура выхода. Параметры:
'  pQuitCode - код выхода (ошибки)
Sub Quit(pQuitCode)
  'Снимаем объявление объектов
  Set Files = Nothing
  Set Mess  = Nothing
  Set WSH   = Nothing
  Set FSO   = Nothing
  'Выходим, указав код выхода
  WScript.Quit pQuitCode
End Sub
Последний раз редактировалось Batya Чт мар 04, 2010 20:37, всего редактировалось 2 раза.
Нет, я не сплю. Я просто медленно моргаю.
Slaider
Сообщения: 6
Зарегистрирован: Вт сен 29, 2009 14:30

Сообщение Slaider »

Все работает просто отлично, огромное спасибо уже есть возможность манипулировать большим количеством файлов, но если можно добавить чтобы скрипт мог сканировать не только каталог который ему указан но и подкаталоги находящиеся в нем т.е например в параметрах задаем d:\1 d:\2 но если соответствующие файлы будут еще и в подкаталогах типа d:\1\a, d:\1\b, d:\1\g итд он их собирал тоже. Хотелось бы настраиваемую глубину сканирования, ну если не получиться ничего страшного и так уже довольно серьезно помогли.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Slaider
Если, например, файл "ля-ля-ля.dwg" лежит в папке "d:\1\a", то файл "ля-ля-ля_описание.txt" лежит обязательно в этой же папке, или может лежать в других, например, "d:\1"?
Нет, я не сплю. Я просто медленно моргаю.
Slaider
Сообщения: 6
Зарегистрирован: Вт сен 29, 2009 14:30

Сообщение Slaider »

Batya писал(а):Slaider
Если, например, файл "ля-ля-ля.dwg" лежит в папке "d:\1\a", то файл "ля-ля-ля_описание.txt" лежит обязательно в этой же папке, или может лежать в других, например, "d:\1"?
Да они в любом случае лежат парно, просто уже распределены по одному из признаков описания файла, вручную.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Slaider писал(а):но если можно добавить чтобы скрипт мог сканировать не только каталог который ему указан но и подкаталоги находящиеся в нем
Готово.
Нет, я не сплю. Я просто медленно моргаю.
Slaider
Сообщения: 6
Зарегистрирован: Вт сен 29, 2009 14:30

Сообщение Slaider »

Batya писал(а):
Slaider писал(а):но если можно добавить чтобы скрипт мог сканировать не только каталог который ему указан но и подкаталоги находящиеся в нем
Готово.
Огромное , большое спасибо. Хотелось бы самому научиться делать подобные скрипты, или хотя бы поправлять для определенных целей. Был бы благодарен за информацию для развития.
PS По возможности прокомментировать подробно скрипт .... Повторю, по возможности я и так безмерно благодарен...
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Slaider писал(а):По возможности прокомментировать подробно скрипт
Готово.
Slaider писал(а):Хотелось бы самому научиться делать подобные скрипты, или хотя бы поправлять для определенных целей. Был бы благодарен за информацию для развития.
Интернет + help (ищи файл script56.chm).
Нет, я не сплю. Я просто медленно моргаю.
Slaider
Сообщения: 6
Зарегистрирован: Вт сен 29, 2009 14:30

Сообщение Slaider »

Batya писал(а):
Slaider писал(а):По возможности прокомментировать подробно скрипт
Готово.
Slaider писал(а):Хотелось бы самому научиться делать подобные скрипты, или хотя бы поправлять для определенных целей. Был бы благодарен за информацию для развития.
Интернет + help (ищи файл script56.chm).
В личку кинь свой телефон, копейку кину на счет.
Ответить