копирование данных с помощью VBS

1. Анастасия Сталович (Новичок1с) 01.11.16 10:40 Сейчас в теме
Добрый день.

Помогите пожалуйста разобраться с функцией копирования файлов.

FileCopy-создаётся файл *.dt, FileCopyNew-постоянный путь
Function MyFileDT (ByVal FileCopy)
dim fso
	On Error Resume Next
	Set fso = WScript.CreateObject("Scripting.FileSystemObject")
		MyFileDT = (fso.FileExists(FileCopy)) 
    Set fso = Nothing
end Function

Function FileCopyFun (byval FileCopy , byval FileCopyNew)

		Dim objFSO
		Const OverwriteExisting = True
		On Error Resume Next
                Set objFSO = CreateObject("Scripting.FileSystemObject")
				objFSO.CopyFile FileCopy , FileCopyNew, OverwriteExisting
			Set objFSO = Nothing
'Запись в лог файл
		AppendToFile strLogFileName, "Что скопировали:      " & FileCopy 
		AppendToFile strLogFileName, "Куда скопировали:     " & FileCopyNew	
               AppendToFile strLogFileName, "Функция копирования сработала!!"
		
end Function
Показать


в другой процедуре вызываю эту функцию

FileCopyFun FileCopy82,FileCopyNew82

либо так

FileCopyFun BackUpFolder & "\" & BasesList(I).BaseBackUpFolderName & "\" & BasesList(I).BaseBackUpFileName & " " & Replace(cstr(now()), ":", ".") & ".dt" , "f:\BackUp1C\2016\"
(все переменные BackUpFolder, BasesList и другие- в лог. файле отлично сохраняются)

Данные из лог. файла
Что скопировали: f:\BackUp1C\2016\Камин\Камин 2.0.65.45 01.11.2016 9.37.06.dt
Куда скопировали: f:\BackUp1C\2016\
Функция копирования сработала!!

Когда из функции убираю On Error Resume Next
тогда возникает ошибка- не определены пути файлов.
К сожалению, копирование не происходит

Подскажите пожалуйста, как правильно передать параметры в функцию из другой процедуры и из-за чего возникает ошибка.

Благодарю за помощь.
Ответы
5. Валера Савельев (S.V.Y) 17 25.11.16 12:11 Сейчас в теме
(1) Лог пишет, это хорошо, а данные то копирует? Функция On Error Resume Next в случае ошибки продолжает работу со строки, которая идет после строки с ошибкой, а если ее убрать, то ошибка становится критичной и скрипт работать перестает. Т.е. ошибка в скрипте, или в передаваемых параметрах.
Мне кажется - Что скопировали: f:\BackUp1C\2016\Камин\Камин 2.0.65.45 01.11.2016 9.37.06.dt - тут какой-то корявый путь, тем более что в вызове & Replace(cstr(now()), ":", ".") & ".dt" идет замена фактических символов в пути файла. Может в этом проблема?
6. Роберт В е р т и н с к и й (v3rter) 25.11.16 12:53 Сейчас в теме
(5)
Replace(cstr(now()), ":", ".")
С одной стороны, здесь в текущей дате-времени заменяются недопустимые в имени файла двоеточия на допустимые точки. С другой стороны дата-время берется на момент исполнения команды, то есть за время выгрузки время меняется и происходит попытка скопировать файл уже с другим именем. То есть либо имя файла с датой временем надо где-то временно сохранять, либо делать выгрузку во временный файл с фиксированным именем (не забывая удалять предыдущий или после успешного копирования) а при копировании добавлять отметку. Возможно так:
FileCopyFun BackUpFolder & "\" & BasesList(I).BaseBackUpFolderName & "\" & BasesList(I).BaseBackUpFileName & ".dt" , "f:\BackUp1C\2016\"& BasesList(I).BaseBackUpFileName & " " & Replace(cstr(now()), ":", ".") & ".dt"

При этом надо будет убрать
& " " & Replace(cstr(now()), ":", ".")
из выгрузки dt.

Кстати, если выгружаете в .dt (формат, не гарантирующий 100% возможности восстановления из него базы), то чем не устраивает Effector Saver редакции free ?
2. Fallen Santa (fallen_santa) 02.11.16 10:07 Сейчас в теме
Вам для чего? Резервное копирование баз?
3. Анастасия Сталович (Новичок1с) 02.11.16 10:36 Сейчас в теме
Сейчас делаются копии архивов другим скриптом, мне хотелось бы созданный dt файл (скрипт из интернета, работает) сразу же этим же скриптом копировать на другой компьютер.
4. Fallen Santa (fallen_santa) 02.11.16 12:07 Сейчас в теме
Как вариант, я вот так когда-то делал (Сам скрипт не мой):


BackupAll Array("\\server\accounting\", "\\server\builder\")

Sub BackupAll(MyArray)
	mDate=cstr(DatePart("yyyy", Now)) + "-" + Right("00" & cstr(DatePart("m", Now)), 2) + "-" + Right("00" & cstr(DatePart("d", Now)), 2)
	mTime=""
	mPath="d:\backups_1c\"
	mType="zip"

	response=MsgBox("Создать бэкап всех баз данных?", 3)
	If response=2 Then exit sub
	If MsgBox("Добавить текущее время к имени файла?", 4 + 256) = 6 Then mTime="_" + Right("00" & cstr(DatePart("h", Now)), 2) + "-" +Right("00" & cstr(DatePart("n", Now)), 2)

	Set folders = CreateObject("Scripting.Dictionary")
	For each folder in MyArray
		folders.Add folder, false
	Next

	If response=6 Then
		For each folder in folders
			folders(folder)=True
		Next
	elseIf response=7 Then
		For each folder in folders
			response1 = MsgBox("Создать бэкап ''" + folder + "'' ?", 3)
			If response1=2 Then exit sub
			If response1=6 Then folders(folder)=True
		Next
	end If

	For each folder in folders
		If folders(folder)=True Then CreateArchive mPath, replace(folder, "\", "_"), mDate + mTime,  mType, folder
	Next
End Sub

Sub CreateArchive(mPath, mName, mDate, mType, pathData)
	pathArhive=mPath & mName & mDate & "." & mType
	
	'Создание архива
	Set WshShell = CreateObject("WScript.Shell")
	Set oExec = WshShell.Exec("C:\Program Files\WinRAR_old\WinRAR.exe u -af" + mType + " -ep1 -r -y -dh " + pathArhive + " " + pathData)
	Do While oExec.Status = 0
     WScript.Sleep 100
	Loop
	
	'Удаление старых архивов для текущей папки
	Set objFSO = CreateObject("Scripting.FileSystemObject")
	Set objFolder = objFSO.GetFolder(".")
	Set colFiles = objFolder.Files
	For Each objFile in colFiles
		If DateDIff("D", objFile.DateLastModIfied, Now) > 30 Then ' проверка файлов на старость
			If len(objFile.Name)>len(mName) Then
				If left(objFile.Name, len(mName))=mName Then 
					Log (objFile.Name)
					objFile.Attributes = 0
					objFile.Delete
				End If
			End If
		End If
	Next
End Sub

'функция для создания log-файла. он создается рядом со скриптом, имя - дата запуска скрипта.
Function Log(strLineToLog)
	Const ForReading = 1, ForWriting = 2
	Dim fso, f, FileLog

	Set fso = CreateObject("Scripting.FileSystemObject")
	FileLog = Left(WScript.ScriptName,(Len(WScript.ScriptName)-4)) & "_" & DatePart("yyyy",Date) & "_" & DatePart("m",Date) & "_" & DatePart("d",Date) & "." & "log"
	Set f = fso.OpenTextFile(FileLog, 8, True)
	f.Write strLineToLog & vbCrLf
	f.Close
End Function
Показать


Скрипт берет файлы из указанной шары, пакует их раром (добавляя данные о времени/дате) и кладёт в нужное место. Поправить пути и можно пользоваться.
7. Дмитрий Иванов (DarkDaemon) 28.12.16 13:52 Сейчас в теме
А почему не хотите рассмотреть копирование через BAT-файл?
8. Роберт В е р т и н с к и й (v3rter) 29.12.16 14:16 Сейчас в теме
Кстати, навесить на файл дату-время и скопировать можно большинством архиваторов с опцией "без сжатия" или с минимальным сжатием.
Оставьте свое сообщение