Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

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

 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Slaider



Joined: 29 Sep 2009
Posts: 6

Post (Separately) Posted: Tue Sep 29, 2009 14:46    Post subject: Поиск файлов и создание определенных папок Reply with quote

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

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

Если это возможно помогите создать скрипт который будет брать информацию с определенной строчки .txt по этой инф создовать папку и копировать в нее эти идентичные пары файлов. Заранее благодарен.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Tue Sep 29, 2009 16:08    Post subject: Reply with quote

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

Скрипт должен обрабатывать все файлы в конкретной папке или работать по выделенным файлам?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Slaider



Joined: 29 Sep 2009
Posts: 6

Post (Separately) Posted: Tue Sep 29, 2009 20:44    Post subject: Reply with quote

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

Понимаю что это очень сложно организовать потому почти не надеюсь на успех, но все же. Заранее благодарен.
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2584
Location: Большая деревня Москва

Post (Separately) Posted: Tue Sep 29, 2009 22:05    Post subject: Reply with quote

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

Короче - грамотно ставь задачу, тогда и на решение можно надеяться.
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Thu Oct 01, 2009 10:43    Post subject: Reply with quote

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

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

Вопросы (ответь, пожалуйста, на все):
1. Приведи конкретный пример txt-файла.
2. Какая строчку из этого файла нам необходима для создания новой папки?
3. По какому критерию эту строчку можно однозначно идентифицировать?
4. В каком месте создавать новую папку?
5. Возможно ли, что у файлов ".dwg .cdw .doc .xls .jpg итп" одинаковые имена? Т.е., что txt-файл относится сразу к нескольким подобным файла?
6. В итоге файлы необходимо копировать или переносить?
7. И ещё раз: Скрипт должен обрабатывать все файлы в конкретной папке или работать по выделенным файлам?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Tue Dec 29, 2009 18:37    Post subject: Reply with quote

Slaider
Наконец-то готово:
Code:
'==========================================================================
' Копирование пар файлов в новую папку согласно информации из 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

_________________
Нет, я не сплю. Я просто медленно моргаю.


Last edited by Batya on Thu Mar 04, 2010 21:37; edited 2 times in total
Back to top
View user's profile Send private message
Slaider



Joined: 29 Sep 2009
Posts: 6

Post (Separately) Posted: Mon Mar 01, 2010 17:54    Post subject: Reply with quote

Все работает просто отлично, огромное спасибо уже есть возможность манипулировать большим количеством файлов, но если можно добавить чтобы скрипт мог сканировать не только каталог который ему указан но и подкаталоги находящиеся в нем т.е например в параметрах задаем d:\1 d:\2 но если соответствующие файлы будут еще и в подкаталогах типа d:\1\a, d:\1\b, d:\1\g итд он их собирал тоже. Хотелось бы настраиваемую глубину сканирования, ну если не получиться ничего страшного и так уже довольно серьезно помогли.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Mon Mar 01, 2010 21:08    Post subject: Reply with quote

Slaider
Если, например, файл "ля-ля-ля.dwg" лежит в папке "d:\1\a", то файл "ля-ля-ля_описание.txt" лежит обязательно в этой же папке, или может лежать в других, например, "d:\1"?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Slaider



Joined: 29 Sep 2009
Posts: 6

Post (Separately) Posted: Tue Mar 02, 2010 09:27    Post subject: Reply with quote

Batya wrote:
Slaider
Если, например, файл "ля-ля-ля.dwg" лежит в папке "d:\1\a", то файл "ля-ля-ля_описание.txt" лежит обязательно в этой же папке, или может лежать в других, например, "d:\1"?


Да они в любом случае лежат парно, просто уже распределены по одному из признаков описания файла, вручную.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Tue Mar 02, 2010 22:46    Post subject: Reply with quote

Slaider wrote:
но если можно добавить чтобы скрипт мог сканировать не только каталог который ему указан но и подкаталоги находящиеся в нем

Готово.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Slaider



Joined: 29 Sep 2009
Posts: 6

Post (Separately) Posted: Wed Mar 03, 2010 14:55    Post subject: Reply with quote

Batya wrote:
Slaider wrote:
но если можно добавить чтобы скрипт мог сканировать не только каталог который ему указан но и подкаталоги находящиеся в нем

Готово.

Огромное , большое спасибо. Хотелось бы самому научиться делать подобные скрипты, или хотя бы поправлять для определенных целей. Был бы благодарен за информацию для развития.
PS По возможности прокомментировать подробно скрипт .... Повторю, по возможности я и так безмерно благодарен...
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Thu Mar 04, 2010 21:40    Post subject: Reply with quote

Slaider wrote:
По возможности прокомментировать подробно скрипт

Готово.

Slaider wrote:
Хотелось бы самому научиться делать подобные скрипты, или хотя бы поправлять для определенных целей. Был бы благодарен за информацию для развития.

Интернет + help (ищи файл script56.chm).
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Slaider



Joined: 29 Sep 2009
Posts: 6

Post (Separately) Posted: Fri Mar 05, 2010 09:04    Post subject: Reply with quote

Batya wrote:
Slaider wrote:
По возможности прокомментировать подробно скрипт

Готово.

Slaider wrote:
Хотелось бы самому научиться делать подобные скрипты, или хотя бы поправлять для определенных целей. Был бы благодарен за информацию для развития.

Интернет + help (ищи файл script56.chm).

В личку кинь свой телефон, копейку кину на счет.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group