View previous topic :: View next topic |
Author |
Message |
Slaider
Joined: 29 Sep 2009 Posts: 6
|
(Separately) Posted: Tue Sep 29, 2009 14:46 Post subject: Поиск файлов и создание определенных папок |
|
|
Поиск файлов и создание определенных папок с последующей сортировкой файлов.
Каждый день пополняется архив большим количеством файлов разнообразных форматов в основном .dwg .cdw .doc .xls .jpg итп
При загрузке на ПК посредством сервера и ява с каждым файлом создается сопутствующий файл с таким же именем но расширением .txt. описанием, вида:
Номер документа.:ххххххххх =====================================================
Version: хх
Language: ххх
Title: ххххххх
Document group: хххххххххххххх
Release No.:ххххххххххххххххх =====================================================
Если это возможно помогите создать скрипт который будет брать информацию с определенной строчки .txt по этой инф создовать папку и копировать в нее эти идентичные пары файлов. Заранее благодарен. |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Tue Sep 29, 2009 16:08 Post subject: |
|
|
Slaider
ОК.
Какая конкретно строка? Что из неё брать?
Скрипт должен обрабатывать все файлы в конкретной папке или работать по выделенным файлам? _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
Slaider
Joined: 29 Sep 2009 Posts: 6
|
(Separately) Posted: Tue Sep 29, 2009 20:44 Post subject: |
|
|
Было бы здорово еслиб можно было бы настроить скрипт на строку или слово.
Например
Document group: 220
где скрипт берет имя создоваемой дирректории 220 после чего копирует в нее все пары файлов где Document group: 220.
Предполагаю в конкретной папке и хотябы одной подпапке. т.к файлы разбиты примерно по 100 шт в папке.
Понимаю что это очень сложно организовать потому почти не надеюсь на успех, но все же. Заранее благодарен. |
|
Back to top |
|
|
Вахмурка
Joined: 27 Dec 2004 Posts: 2584 Location: Большая деревня Москва
|
(Separately) Posted: Tue Sep 29, 2009 22:05 Post subject: |
|
|
Да, сложно организовать, потому что сложно понять, что тебе надо. Batya тебе задал конкретные вопросы, а ты на них не ответил, зато еще туману напустил.
1. Что за строка "Document group: 220"? Откуда она берется? Чем одна группа отличается от другой - только номером или всеми тремя ключевыми словами? Может ли быть ключевых слов не три? Сколько тогда? Откуда брать нужное?
2. Что значит "пары файлов"? Кто входит в пару?
3. Фраза "Предполагаю в конкретной папке и хотябы одной подпапке. т.к файлы разбиты примерно по 100 шт в папке" меня вообще заставила усомниться - со мной по-русски говорят или где?
Короче - грамотно ставь задачу, тогда и на решение можно надеяться. _________________ Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон) |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Thu Oct 01, 2009 10:43 Post subject: |
|
|
Вахмурка wrote: | 3. Фраза "Предполагаю в конкретной папке и хотябы одной подпапке. т.к файлы разбиты примерно по 100 шт в папке" меня вообще заставила усомниться - со мной по-русски говорят или где? | У меня сначала мозг закипал, когда я пытался осмыслить сказанное Slaider, а на этой фразе вообще взорвался.
Slaider
Послушай, на этом форуме есть те, кто готов тебе помочь. Но именно "помочь" - это значит, что основная деятельность должна исходить от тебя. Под основной деятельностью я подразумеваю грамотную постановку задачи.
Как любят в подобных случаях говорить на этом форуме: Телепатов здесь нет.
Постарайся короткими предложениями с соблюдением норм русского языка объяснить свою задачу. Например, использование запятых - это не атавизм, это приём, который в письменном общении помогает правильно понимать собеседника.
Вообщем, извини за занудную лекцию.
Вопросы (ответь, пожалуйста, на все):
1. Приведи конкретный пример txt-файла.
2. Какая строчку из этого файла нам необходима для создания новой папки?
3. По какому критерию эту строчку можно однозначно идентифицировать?
4. В каком месте создавать новую папку?
5. Возможно ли, что у файлов ".dwg .cdw .doc .xls .jpg итп" одинаковые имена? Т.е., что txt-файл относится сразу к нескольким подобным файла?
6. В итоге файлы необходимо копировать или переносить?
7. И ещё раз: Скрипт должен обрабатывать все файлы в конкретной папке или работать по выделенным файлам? _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Tue Dec 29, 2009 18:37 Post subject: |
|
|
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 |
|
|
Slaider
Joined: 29 Sep 2009 Posts: 6
|
(Separately) Posted: Mon Mar 01, 2010 17:54 Post subject: |
|
|
Все работает просто отлично, огромное спасибо уже есть возможность манипулировать большим количеством файлов, но если можно добавить чтобы скрипт мог сканировать не только каталог который ему указан но и подкаталоги находящиеся в нем т.е например в параметрах задаем d:\1 d:\2 но если соответствующие файлы будут еще и в подкаталогах типа d:\1\a, d:\1\b, d:\1\g итд он их собирал тоже. Хотелось бы настраиваемую глубину сканирования, ну если не получиться ничего страшного и так уже довольно серьезно помогли. |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Mon Mar 01, 2010 21:08 Post subject: |
|
|
Slaider
Если, например, файл "ля-ля-ля.dwg" лежит в папке "d:\1\a", то файл "ля-ля-ля_описание.txt" лежит обязательно в этой же папке, или может лежать в других, например, "d:\1"? _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
Slaider
Joined: 29 Sep 2009 Posts: 6
|
(Separately) Posted: Tue Mar 02, 2010 09:27 Post subject: |
|
|
Batya wrote: | Slaider
Если, например, файл "ля-ля-ля.dwg" лежит в папке "d:\1\a", то файл "ля-ля-ля_описание.txt" лежит обязательно в этой же папке, или может лежать в других, например, "d:\1"? |
Да они в любом случае лежат парно, просто уже распределены по одному из признаков описания файла, вручную. |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Tue Mar 02, 2010 22:46 Post subject: |
|
|
Slaider wrote: | но если можно добавить чтобы скрипт мог сканировать не только каталог который ему указан но и подкаталоги находящиеся в нем |
Готово. _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
Slaider
Joined: 29 Sep 2009 Posts: 6
|
(Separately) Posted: Wed Mar 03, 2010 14:55 Post subject: |
|
|
Batya wrote: | Slaider wrote: | но если можно добавить чтобы скрипт мог сканировать не только каталог который ему указан но и подкаталоги находящиеся в нем |
Готово. |
Огромное , большое спасибо. Хотелось бы самому научиться делать подобные скрипты, или хотя бы поправлять для определенных целей. Был бы благодарен за информацию для развития.
PS По возможности прокомментировать подробно скрипт .... Повторю, по возможности я и так безмерно благодарен... |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Thu Mar 04, 2010 21:40 Post subject: |
|
|
Slaider wrote: | По возможности прокомментировать подробно скрипт |
Готово.
Slaider wrote: | Хотелось бы самому научиться делать подобные скрипты, или хотя бы поправлять для определенных целей. Был бы благодарен за информацию для развития. |
Интернет + help (ищи файл script56.chm). _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
Slaider
Joined: 29 Sep 2009 Posts: 6
|
(Separately) Posted: Fri Mar 05, 2010 09:04 Post subject: |
|
|
Batya wrote: | Slaider wrote: | По возможности прокомментировать подробно скрипт |
Готово.
Slaider wrote: | Хотелось бы самому научиться делать подобные скрипты, или хотя бы поправлять для определенных целей. Был бы благодарен за информацию для развития. |
Интернет + help (ищи файл script56.chm). |
В личку кинь свой телефон, копейку кину на счет. |
|
Back to top |
|
|
|
|
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
|