Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Скачивание с ftp, обработка файлов и обратная закгрузка

Ответить
Настройки темы
CMD/BAT - Скачивание с ftp, обработка файлов и обратная закгрузка
ul9 ul9 вне форума

Пользователь


Сообщения: 122
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: ul9
Дата: 19-07-2013
Здравствуйте.

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

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

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

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

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

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

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

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

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

Отправлено: 15:51, 19-07-2013

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Цитата ul9:
После скачивания нужно проверить файлы на целостность »
Что Вы под этим понимаете?

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

Отправлено: 21:00, 19-07-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

ul9 ul9 вне форума Автор темы

Пользователь


Сообщения: 122
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата 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"
Его бы модифицировать, чтобы он считал сначала количество совпадений, а потом предлагал либо выйти, либо продолжить. Если продолжить, то в конце операции писал бы количество замен.

Отправлено: 21:44, 19-07-2013 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

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

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

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

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

Отправлено: 22:21, 19-07-2013 | #4

ul9 ul9 вне форума Автор темы

Пользователь


Сообщения: 122
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата:
Цитата Iska:
если не умеете работать с командной строкой »
Я с программированием очень плохо знакома. Всё исключительно на помощи коллег и форумчан держится.
Цитата:
Цитата Iska:
Это не хорошо. Вы создали конфигурационный файл, сохранили и перетянули его на скрипт. »
Значит можно вызвать этот конфигурационный файл через батник, отредактировать его и потом без перетаскиваний запустить через call его.
Цитата:
Цитата Iska:
чтобы он считал сначала количество совпадений, »
Зачем? »
Я же писала, что в основном везде одинаковый текст, но где-то может встретиться лишняя запятая или другое окончание в слове. Из-за этого файл не будет обработан. И уйдёт обратно на фтп необработанным. Я заранее знаю, что файлов для обработки ровно 21 html. И если скрипт посчитает и напишет, что было найдено 21 совпадение, то я буду уверена, что и замена пройдёт во всех файлах.
Цитата:
Цитата Iska:
И будьте готовы к тому, что, например, «&», «<» и «>» (и т.п.) — это «&amp;», «&lt;» и «&gt;» »
Нет, это не так. Я работаю с этим скриптом и он обрабатывает все символы. «&», «<» и «>» - эти в том числе и ещё куча других спец.символов. Кодировка Ansi.

Последний раз редактировалось ul9, 19-07-2013 в 23:08.


Отправлено: 22:44, 19-07-2013 | #5


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

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

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

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

Отправлено: 23:16, 19-07-2013 | #6

ul9 ul9 вне форума Автор темы

Пользователь


Сообщения: 122
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
Не надо «вызывать его через батник». «Ручками» создаёте файл конфигурации и сохраняете. Вы понимаете, зачем вообще они нужны — файлы конфигурации?! Для повторного использования. То есть, Вы создаёте для каждого сервера отдельный файл один раз, затем используете его повторно многократно. »
Дело в том, что многократное использование мне не нужно. Необходимо разово пробежаться по всем фтп и внести корректировки в файлы.
Цитата Iska:
Давайте сделаем так: Вы упакуйте пару-тройку html-файлов в архив, присовокупите к ним файл с фразами для поиска и файл с фразами для замены соответственно. Затем отошлите полученный архив (или ссылку на него) мне в личку. Я посмотрю и обещаю подумать. »
Отлично, минут через 20 скину в лс.

Отправлено: 23:30, 19-07-2013 | #7


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 23:38, 19-07-2013 | #8

ul9 ul9 вне форума Автор темы

Пользователь


Сообщения: 122
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
А когда это потребуется сделать (тоже разово) — в очередной раз? »
Никогда. Но фтп очень много, порядка 200.
Цитата Iska:
Файлы на разных серверах одни и те же? »
Имена у файлов одни и те же, содержание разное, но искомые строчки одни и те же.
Цитата Iska:
Пути к ним (за исключением имён серверов) одинаковые? »
Одинаковые.
Цитата Iska:
Пары поиска/замены для одинаковых html-файлов на разных серверах одни и те же? »
Нужно сделать одни и те же замены в определённых файлах на всех фтп.

Отправлено: 23:46, 19-07-2013 | #9


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата ul9:
Никогда. »
Зуб даёте ?


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

Отправлено: 23:57, 19-07-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Скачивание с ftp, обработка файлов и обратная закгрузка

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Скачивание с FTP по списку из текстового файла Angel_Ok Скриптовые языки администрирования Windows 3 23-08-2011 22:32
CMD/BAT - Определение имени папки и ее скачивание по FTP volk1234 Скриптовые языки администрирования Windows 1 10-06-2011 16:19
CMD/BAT - [решено] скачивание файлов с FTP DeZMoN Скриптовые языки администрирования Windows 10 11-08-2010 11:53
CMD/BAT - [решено] Скачивание папок и подпапок с FTP Essential_mix Скриптовые языки администрирования Windows 1 16-01-2010 04:51
Скачивание файлов Artur Хочу все знать 8 16-02-2003 18:17




 
Переход