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

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

ul9 19-07-2013 15:51 2187283

Скачивание с ftp, обработка файлов и обратная закгрузка
 
Здравствуйте.

Вновь решила прибегнуть к помощи форумчан.
Напишу сразу, язык исполнения не имеет значения.

Обрисую картину вкратце:
Есть фтп, на него нужно подключиться, скачать определённые файлы, найти в них заданный текст (конкретная строка HTML). Сделать в файлах замену по образцу и закачать обратно на фтп.

Понимаю, что задача не из простых, поэтому готова отблагодарить материально. :yes:

Если вас ещё не отпугнуло начало, то я продолжу и опишу всё это подробно:

1. Подключаемся к фтп.
Нужно универсальное решение. Т.к. фтп каждый раз разное и всё время редактировать в исходнике user, pass не вариант. Поэтому я вижу такое решение. Запускаю исполнение, появляется пустой текстовый файл. В первой строчке я ввожу фтп адрес, во второй логин, в третьей пароль - нажимаю сохранить и эта информация обрабатывается и происходит подключение.

2. Скачивание файлов.
На каждом фтп структура папок стандартная, но есть лишние файлы, которые нам не нужны. Поэтому нужно скачивать конкретные файлы, которые, например, можно брать из заготовленного списка и поочередно выкачивать. Но, нужно учесть, что при скачивании файлов на компьютер должна сохраниться структура папок с файлами внутри. Скачивание файлов происходит в определённую папку. Назовём её Temp. После скачивания нужно проверить файлы на целостность, конечно необязательно, но бывает так, что фтп не всегда отдаёт файлы. После проверки на наличие всех файлов в папке, мы приступаем к следующему шагу.

3. Обработка файлов.
У нас есть два файла: в одном (файл Search) - что надо найти; во втором (файл Destination) - на что заменить. В этих файлах код html с множеством символов. Так вот, перед началом обработки необходимо проверить наши скаченные файлы в папке Temp на наличие тех самых строк из файла Search. Достаточно вывести количество файлов, в которых были найдены эти строки. Так как всегда количество файлов одинаково. Например: "Заданный текст встречается в 15 файлах". Но текст может встречаться в разных вариациях (лишняя запятая, другое окончание у слова). И текст может не находить. Поэтому скрипт, после поиска в файлах, должен запросить разрешение на работу. Если нажимаю нет, то скрипт завершается и открывает файл Search для редактирования поисковой фразы. Если да, то работа продолжается.
Мы проверили файлы на наличие нужной строки и можем приступить к обработке файлов. Вносим изменения во все файлы в папке Temp и подпапки. Из файла Search ищем, из файла Destination заменяем. И в конце указываем количество файлов, в которых была произведена замена. Например: "Замена произведена в 15 файлах".
Папка Temp содержит в себе скаченные подпапки и файлы с именами на транслите. Поэтому поиск и замену нужно производить и в подпапках в том числе.

4. Закачивание обратно на фтп.
Здесь всё просто. Наши обработанные файлы закачиваем обратно на тот же фтп. Заменяя исходные файлы на фтп и сохраняя структуру папок. После закачивания, нужно отписаться, что все файлы были переданы успешно.

На этом всё.
Прошу прощения за мой "французский".
Спасибо, что дочитали до конца.
Очень рассчитываю на вашу помощь, ограничена во времени. :)

Iska 19-07-2013 21:00 2187540

Цитата:

Цитата ul9
1. Подключаемся к фтп.
Нужно универсальное решение. Т.к. фтп каждый раз разное и всё время редактировать в исходнике user, pass не вариант. Поэтому я вижу такое решение. Запускаю исполнение, появляется пустой текстовый файл. В первой строчке я ввожу фтп адрес, во второй логин, в третьей пароль - нажимаю сохранить и эта информация обрабатывается и происходит подключение. »

Универсальное решение — использование командной строки, в которой будут указываться потребные параметры, либо имя конфигурационного файла, содержащего потребные параметры. Но никак не то, что Вы описали.

Цитата:

Цитата ul9
После скачивания нужно проверить файлы на целостность »

Что Вы под этим понимаете?

P.S. Поиск и замена в html-файлах — задача никак не для пакетных файлов.

ul9 19-07-2013 21:44 2187571

Цитата:

Цитата Iska
либо имя конфигурационного файла, содержащего потребные параметры »

Это было бы хорошо. Запустил скрипт, он открыл конфигурацию, ты внёс свои правки, сохранил, закрыл файл и продолжилась обработка.
Цитата:

Цитата Iska
Что Вы под этим понимаете? »

Я имела в виду проверку, все ли файлы скачались из списка.
Цитата:

Цитата Iska
P.S. Поиск и замена в html-файлах — задача никак не для пакетных файлов. »

А как же это?
Кажется это ваш код, если не ошибаюсь. И он отлично работает. Из одного файла берёт что ищем, из другого чем заменяем. И обрабатывает всю папку с подпапками.
Код:

Option Explicit

Const ForReading  = 1
Const ForWriting  = 2


Dim objArgs
Dim objFSO
Dim objFile

Dim strWhatFind
Dim strReplaceBy

Dim strContent


Set objArgs = WScript.Arguments.Named

If objArgs.Count = 4 Then
        Set objFSO  = WScript.CreateObject("Scripting.FileSystemObject")
       
        If objArgs.Exists("FolderForScan") Then
                If objArgs.Exists("FileExtension") Then
                        If objArgs.Exists("FileWhatFind") Then
                                If objArgs.Exists("FileReplaceBy") Then
                                        If objFSO.FolderExists(objArgs.Item("FolderForScan")) Then
                                                If objFSO.FileExists(objArgs.Item("FileWhatFind")) Then
                                                        If objFSO.FileExists(objArgs.Item("FileReplaceBy")) Then
                                                                If objFSO.GetFile(objArgs.Item("FileWhatFind")).Size > 0 Then
                                                                        With objFSO.OpenTextFile(objArgs.Item("FileWhatFind"), ForReading)
                                                                                strWhatFind = .ReadAll()
                                                                                .Close
                                                                        End With
                                                                       
                                                                        If objFSO.GetFile(objArgs.Item("FileReplaceBy")).Size > 0 Then
                                                                                With objFSO.OpenTextFile(objArgs.Item("FileReplaceBy"), ForReading)
                                                                                        strReplaceBy = .ReadAll()
                                                                                        .Close
                                                                                End With
                                                                        Else
                                                                                strReplaceBy = ""
                                                                        End If
                                                                       
                                                                        WScript.Echo "Folder for scan: " & objArgs.Item("FolderForScan")
                                                                        WScript.Echo "File extension:  " & objArgs.Item("FileExtension")
                                                                        WScript.Echo "File what find:  " & objArgs.Item("FileWhatFind")
                                                                        WScript.Echo "File replace by: " & objArgs.Item("FileReplaceBy")
                                                                        WScript.Echo
                                                                       
                                                                        ScanSubFolders objFSO.GetFolder(objArgs.Item("FolderForScan"))
                                                                Else
                                                                        WScript.Echo "File [" & objArgs.Item("FileWhatFind") & "] is zero length"
                                                                End If
                                                        Else
                                                                WScript.Echo "File [" & objArgs.Item("FileWhatFind") & "] not found"
                                                        End If
                                                Else
                                                        WScript.Echo "File [" & objArgs.Item("FileWhatFind") & "] not found"
                                                End If
                                        Else
                                                WScript.Echo "Folder [" & objArgs.Item("FolderForScan") & "] not found"
                                        End If
                                Else
                                        WScript.Echo "Not found argument <FileReplaceBy>"
                                        Call Usage
                                End If
                        Else
                                WScript.Echo "Not found argument <FileWhatFind>"
                                Call Usage
                        End If
                Else
                        WScript.Echo "Not found argument <FileExtension>"
                        Call Usage
                End If
        Else
                WScript.Echo "Not found argument <FolderForScan>"
                Call Usage
        End If
       
        Set objFSO = Nothing
Else
        Call Usage
End If

Set objArgs = Nothing

WScript.Quit
'=============================================================================

'=============================================================================
Sub ScanSubFolders(objFolder)
        Dim objSubFolder
        Dim objFile
       
        WScript.Echo "[" & objFolder.Path & "]"
       
        For Each objFile In objFolder.Files
                If UCase(objFSO.GetExtensionName(objFile.Name)) = UCase(objArgs.Item("FileExtension")) Then
                        WScript.Echo "  " & objFile.Name
                       
                        If objFile.Size > 0 Then
                                With objFSO.OpenTextFile(objFile.Path, ForReading)
                                        strContent = .ReadAll()
                                        .Close
                                End With
                               
                                If InStr(1, strContent, strWhatFind, vbTextCompare) > 0 Then
                                        WScript.Echo "    Fragment for replace found"
                                       
                                        With objFSO.OpenTextFile(objFile.Path, ForWriting)
                                                .Write Replace(strContent, strWhatFind, strReplaceBy)
                                                .Close
                                        End With
                                End If
                        End If
                End If
        Next
       
        WScript.Echo
       
        For Each objSubFolder In objFolder.SubFolders
                ScanSubFolders objSubFolder
        Next
End Sub
'=============================================================================

'=============================================================================
Sub Usage()
        WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " " & _
                "/FolderForScan:<folder> " & _
                "/FileExtension:<extension> " & _
                "/FileWhatFind:<file> " & _
                "/FileReplaceBy:<file>"
End Sub
'=============================================================================

Вызывается
Код:

cscript.exe //nologo replace.vbs /FolderForScan:"%UserProfile%\work" /FileExtension:"html" /FileWhatFind:"text\utf_s.txt" /FileReplaceBy:"text\utf_r.txt"
Его бы модифицировать, чтобы он считал сначала количество совпадений, а потом предлагал либо выйти, либо продолжить. Если продолжить, то в конце операции писал бы количество замен.

Iska 19-07-2013 22:21 2187592

Цитата:

Цитата ul9
Запустил скрипт, он открыл конфигурацию, ты внёс свои правки, сохранил, закрыл файл и продолжилась обработка. »

Это не хорошо. Вы создали конфигурационный файл, сохранили и перетянули его на скрипт (если не умеете работать с командной строкой).

Цитата:

Цитата ul9
Я имела в виду проверку, все ли файлы скачались из списка. »

Ну, об этом сообщит ненулевой код возврата используемого менеджера загрузки. Во всяком случае, так ведут себя приличные утилиты.

Цитата:

Цитата ul9
А как же это?
Кажется это ваш код, если не ошибаюсь. И он отлично работает. Из одного файла берёт что ищем, из другого чем заменяем. И обрабатывает всю папку с подпапками. »

1. Судя по внешнему виду — да, возможно,что и мой.
2. Работает. Но с текстовыми файлами в ANSI-кодировке. Что до html в какой-нибудь экзотичной кодировке — только теоретически. И будьте готовы к тому, что, например, «&», «<» и «>» (и т.п.) — это «&amp;», «&lt;» и «&gt;». Как при поиске, так и при замене. И не забудьте про всё ту же кодировку.

Цитата:

Цитата ul9
чтобы он считал сначала количество совпадений, »

Зачем?

Цитата:

Цитата ul9
Если продолжить, то в конце операции писал бы количество замен. »

Зачем?

ul9 19-07-2013 22:44 2187604

Цитата:

Цитата Iska:
если не умеете работать с командной строкой »
Я с программированием очень плохо знакома. Всё исключительно на помощи коллег и форумчан держится. :)
Цитата:

Цитата Iska:
Это не хорошо. Вы создали конфигурационный файл, сохранили и перетянули его на скрипт. »
Значит можно вызвать этот конфигурационный файл через батник, отредактировать его и потом без перетаскиваний запустить через call его.
Цитата:

Цитата Iska:
чтобы он считал сначала количество совпадений, »
Зачем? »
Я же писала, что в основном везде одинаковый текст, но где-то может встретиться лишняя запятая или другое окончание в слове. Из-за этого файл не будет обработан. И уйдёт обратно на фтп необработанным. Я заранее знаю, что файлов для обработки ровно 21 html. И если скрипт посчитает и напишет, что было найдено 21 совпадение, то я буду уверена, что и замена пройдёт во всех файлах.
Цитата:

Цитата Iska:
И будьте готовы к тому, что, например, «&», «<» и «>» (и т.п.) — это «&amp;», «&lt;» и «&gt;» »
Нет, это не так. Я работаю с этим скриптом и он обрабатывает все символы. «&», «<» и «>» - эти в том числе и ещё куча других спец.символов. Кодировка Ansi.

Iska 19-07-2013 23:16 2187621

Цитата:

Цитата ul9
Значит можно вызвать этот конфигурационный файл через батник, отредактировать его и потом без перетаскиваний запустить через call его. »

Не надо «вызывать его через батник». «Ручками» создаёте файл конфигурации и сохраняете. Вы понимаете, зачем вообще они нужны — файлы конфигурации?! Для повторного использования. То есть, Вы создаёте для каждого сервера отдельный файл один раз, затем используете его повторно многократно.

Цитата:

Цитата ul9
Я заранее знаю, что файлов для обработки ровно 21 html. И если скрипт посчитает и напишет, что было найдено 21 совпадение, то я буду уверена, что и замена пройдёт во всех файлах. »

Ясно.

Цитата:

Цитата ul9
Нет, это не так.»

Нет, это так: Мнемоники в HTML — Википедия, полный текущий рекомендованный список ищите на W3C.

Давайте сделаем так: Вы упакуйте пару-тройку html-файлов в архив, присовокупите к ним файл с фразами для поиска и файл с фразами для замены соответственно. Затем отошлите полученный архив (или ссылку на него) мне в личку. Я посмотрю и обещаю подумать.

ul9 19-07-2013 23:30 2187624

Цитата:

Цитата Iska
Не надо «вызывать его через батник». «Ручками» создаёте файл конфигурации и сохраняете. Вы понимаете, зачем вообще они нужны — файлы конфигурации?! Для повторного использования. То есть, Вы создаёте для каждого сервера отдельный файл один раз, затем используете его повторно многократно. »

Дело в том, что многократное использование мне не нужно. Необходимо разово пробежаться по всем фтп и внести корректировки в файлы.
Цитата:

Цитата Iska
Давайте сделаем так: Вы упакуйте пару-тройку html-файлов в архив, присовокупите к ним файл с фразами для поиска и файл с фразами для замены соответственно. Затем отошлите полученный архив (или ссылку на него) мне в личку. Я посмотрю и обещаю подумать. »

Отлично, минут через 20 скину в лс.

Iska 19-07-2013 23:38 2187629

Цитата:

Цитата ul9
Дело в том, что многократное использование мне не нужно. Необходимо разово пробежаться по всем фтп и внести корректировки в файлы. »

А когда это потребуется сделать (тоже разово) — в очередной раз?

Файлы на разных серверах одни и те же? Пути к ним (за исключением имён серверов) одинаковые? Пары поиска/замены для одинаковых html-файлов на разных серверах одни и те же?

ul9 19-07-2013 23:46 2187633

Цитата:

Цитата Iska
А когда это потребуется сделать (тоже разово) — в очередной раз? »

Никогда. Но фтп очень много, порядка 200.
Цитата:

Цитата Iska
Файлы на разных серверах одни и те же? »

Имена у файлов одни и те же, содержание разное, но искомые строчки одни и те же.
Цитата:

Цитата Iska
Пути к ним (за исключением имён серверов) одинаковые? »

Одинаковые.
Цитата:

Цитата Iska
Пары поиска/замены для одинаковых html-файлов на разных серверах одни и те же? »

Нужно сделать одни и те же замены в определённых файлах на всех фтп.

Iska 19-07-2013 23:57 2187638

Цитата:

Цитата ul9
Никогда. »

Зуб даёте ;)?


С остальным пока, в принципе, ясно. То есть, у нас, фактически, перечень серверов (имя сервера+/-порта, логин+пароль), перечень относительных путей файлов (единый для всех серверов) и набор пар фраз для каждого относительного пути файла, так?

ul9 20-07-2013 00:06 2187642

Цитата:

Цитата Iska:
Зуб даёте ? »
Нет :) Но если нужно будет, я опять пройдусь руками внося в конфиг данные для подключения.
Цитата:

Цитата Iska:
у нас, фактически, перечень серверов (имя сервера+/-порта, логин+пароль), перечень относительных путей файлов (единый для всех серверов) »
Да.
Цитата:

Цитата Iska:
и набор пар фраз для каждого относительного пути файла, так? »
Нет. Это мы скачиваем по списку, а обрабатываем (заменяем текст) уже все скаченные файлы в папке и подпапке, а не по списку.

ul9 20-07-2013 00:25 2187650

Отправила ЛС.

Iska 20-07-2013 02:18 2187666

Получил. Думаю.

ul9 21-07-2013 14:50 2188168

Цитата:

Цитата Iska
Получил. Думаю. »

Как продвигаются мыслительные процессы? :)

ul9 24-07-2013 15:32 2189808

Ребята, неужели никто не может помочь?
Очень нужна ваша помощь.

sunnykey 24-07-2013 16:16 2189834

Цитата:

Цитата ul9
Ребята, неужели никто не может помочь?
Очень нужна ваша помощь. »

Ждите выходных, когда у большинства будет свободное время;)
Скинь мне копию архива в личку


Время: 08:37.

Время: 08:37.
© OSzone.net 2001-