Dim objFSO, objFolder, objShell, strDirectory
strDirectory = "n:\MY_SETTINGS\"
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists(strDirectory) Then
Set objFolder = objFSO.GetFolder(strDirectory)
Else
Set objFolder = objFSO.CreateFolder(strDirectory)
End If
'***********************************************
' Создание объектов оболочки и файловой системы
Set oShell = CreateObject("wscript.shell")
Set oFSO = CreateObject("Scripting.Filesystemobject")
Set WSNetwork = CreateObject("WScript.Network")
LogFolder = "C:\LOG\" ' место расположения лог-файла
StartFolder = "n:\MY_SETTINGS\" ' откуда копируем
aEndFolder = array("g:\My Flash 32 system\WPI\Install\MY_SETTINGS\", "g:\MY_SETTINGS\") ' куда копируем
'***********************************************
' обнуление и описание счетчиков, используемых в скрипте
num_EndFolder = 0 '- общее число папок, места назначения для копируемых данных
num_EndFolder_0 = 0 '- не доступное кол-во папок из num_EndFolder
num_files = 0 '- общее число обработанных файлов
num_files_copy = 0 '- из них скопировано с заменой на новую версию
err_files_copy = 0 '- из них не скопировано в результате ошибки при работе с num_files_copy
num_files_new = 0 '- из них скопировано новых файлов
err_files_new = 0 '- из них не скопировано в результате ошибки при работе с num_files_new
num_SubFolder = 0 '- обработано папок и подпапок
num_SubFolder_copy = 0 '- из них скопировано новых папок и подпапок
err_SubFolder = 0 '- из них не скопировано в результате ошибки при работе с num_SubFolder
'***********************************************
' Создание лог-файла
' Задаем имя лога
sLogName = "CheckOps"
' Заменяем в имени все знаки на подчеркивания
sLogName = Replace(sLogName, ".", ".")
sLogName = Replace(sLogName, ":", ".")
sLogName = LogFolder & sLogName
' Создаем файл
Set oLogFile = oFSO.CreateTextFile(sLogName & ".log",true)
oLogFile.WriteLine "========== Script Information ==========" & vbCrLf
oLogFile.WriteLine "script name: Fail_Copying"
oLogFile.WriteLine "version: 1.0"
oLogFile.WriteLine "date: 10.08.12"
oLogFile.WriteLine "autor: MasterLin"
oLogFile.WriteLine "site: http://www.masterlin.ru" & vbCrLf
oLogFile.WriteLine "========== Запуск скрипта ==========" & vbCrLf
'***********************************************
Set oEndFolder = CreateObject("Scripting.FileSystemObject")
' Цикл для перебора папок "куда копируем"
For i=0 to UBound (aEndFolder)
' Счетчик кол-ва папок для копируемых данных
num_EndFolder=num_EndFolder+1
' Проверяем доступность папки, в которую хотим произвести копирование
If oEndFolder.FolderExists ( aEndFolder(i) ) Then
' Записываем результат в лог
oLogFile.Writeline "Папка " & "'" & aEndFolder(i) & "'" & " доступна для работы" & vbCrLf
CopyFolder StartFolder,aEndFolder(i)
' Счетчик доступных для копирования папок
' удолил :)
else
' Записываем результат в лог
oLogFile.Writeline
oLogFile.Writeline "Папка " & "'" & aEndFolder(i) & "'" & " в настоящий момент не доступна. Работа с ней прекращена." & vbCrLf
' Дублируем сообщение, выводом предупреждения на экран
WScript.Echo "Папка " & "'" & aEndFolder(i) & "'" & " в настоящий момент не доступна. Работа с ней прекращена."
' Счетчик недоступных для копирования папок
num_EndFolder_0=num_EndFolder_0+1
End if
Next
oLogFile.WriteLine "========== Отчет о копировании ==========" & vbCrLf
oLogFile.WriteLine "Было задано " & num_EndFolder & " папок, для копирования в них данных."
oLogFile.WriteLine "Часть папок оказалась не доступна - " & num_EndFolder_0 & " шт. (см.логи выше)"
oLogFile.WriteLine "Скриптом было обработано - " & num_files & " файлов."
oLogFile.WriteLine "Из них скопировано с заменой - " & num_files_copy & " шт., не скопировано в результате ошибки - " & err_files_copy & " шт."
oLogFile.WriteLine "Из них скопировано новых файлов - " & num_files_new & " шт., не скопировано в результате ошибки - " & err_files_new & " шт."
oLogFile.WriteLine "Скриптом было обработано - " & num_SubFolder & " подпапок."
oLogFile.WriteLine "Из них скопировано новых подпапок - " & num_SubFolder_copy & " шт., не скопировано в результате ошибки - " & err_SubFolder & " шт."
oLogFile.WriteLine
Sub CopyFolder(sCopyFolder,sEndCopyFolder)
' Создание объекта Folder
Set oFolder = oFSO.GetFolder(sCopyFolder)
Set oEndCopyFolder = oFSO.GetFolder(sEndCopyFolder)
' Получение коллекции файлов
Set colFiles = oFolder.Files
' Обработка каждого файла из коллекции
For each oFile in colFiles
oLogFile.Writeline "Дата создания копируемого файла:"
oLogFile.Writeline oFile & vbTab & oFile.DateCreated
' Счетчик числа проверяемых файлов
num_files=num_files+1
' Проверяем существует уже такой файл в папке, если его нет, то копируем.
' Если есть, то проверяем его актуальность и заменяем более новым, если он устарел.
If oFSO.FileExists(oFSO.BuildPath(oEndCopyFolder, oFile.Name)) Then
' Записываем результат в лог
oLogFile.Writeline "Такой файл уже существует в папке " & oEndCopyFolder
' Проверяем насколько это свежая копия файла, для этого сравниваем даты создания двух файлов
oLogFile.Writeline "Проверяем актуальность копии:"
' Выгружаем полный путь к проверяемому файлу
sFileEnd = oFSO.BuildPath(oEndCopyFolder, oFile.Name)
' Создаем объект File, для работы с этим файлом
Set oFileEnd = oFSO.GetFile(sFileEnd)
' Сравниваем даты изменения файлов
If oFileEnd.DateLastModified < oFile.DateLastModified Then
' Проверяемый файл оказался устаревшим, поэтому заменяем его более новым
oLogFile.Writeline "Копия файла устарела, заменяем его новым. **********" & vbCrLf
oFSO.CopyFile oFile, sEndCopyFolder & oFile.Name, True
' Проверка на наличие ошибок
if err.Number <> 0 then
' Запись сообщения об ошибке в лог
oLogFile.Writeline "-----> Error # " & CStr(Err.Number) & " " & Err.Description
' Очистка ошибки
Err.Clear
' Счетчик ошибок при замене файлов
err_files_copy=err_files_copy+1
else
' Счетчик файлов, которые были заменены на новые
num_files_copy=num_files_copy+1
End if
else
' В этом случае копия прошла проверку, просто продолжаем работу скрипта далее
oLogFile.Writeline "Копия актуальна. Продолжаем работу." & vbCrLf
End if
else
' Записываем результат в лог
oLogFile.Writeline "Этот файл отсутствует в папке " & oEndCopyFolder & " Давайка его скопируем." & vbCrLf
oFSO.CopyFile oFile, sEndCopyFolder & oFile.Name, True
' Проверка на наличие ошибок
if err.Number <> 0 then
' Запись сообщения об ошибке в лог
oLogFile.Writeline "-----> Error # " & CStr(Err.Number) & " " & Err.Description
' Очистка ошибки
Err.Clear
' Счетчик ошибок при копировании новых файлов
err_files_new=err_files_copy+1
else
' Счетчик новых скопированных файлов
num_files_new=num_files_copy+1
End if
End if
Next
' Проверяем все папки и подпапки
oLogFile.Writeline "Обрабатываем и копируем все подпапки из папки " & oEndCopyFolder & vbCrLf
' Получение коллекции подпапок
Set colSubFolders = oFolder.SubFolders
' Обработка каждой подпапки
For Each oSubFolder In colSubFolders
oLogFile.Writeline "Проверяем подпапку " & oSubFolder
' Счетчик обработанных папок и подпапок
num_SubFolder=num_SubFolder+1
' Проверяем существует уже такая подпапка в папке, если ее нет, то копируем.
' Если есть, то переходим к проверке файлов в подпапке.
If oFSO.FolderExists(oFSO.BuildPath(oEndCopyFolder, oFSO.GetBaseName(oSubFolder.Path))) Then
' Записываем результат в лог
oLogFile.Writeline "Такая подпапка уже существует в папке " & oEndCopyFolder
oLogFile.Writeline "Проверяем все файлы в этой подпапке: "
' Выгружаем полный путь к проверяемоой подпапке
sSubFolderEnd = oFSO.BuildPath(oEndCopyFolder, oFSO.GetBaseName(oSubFolder.Path)) & "\"
' Производим рекурсивный вызов процедуры копирования файлов - программа вызывает сама себя
CopyFolder oSubFolder, sSubFolderEnd
' oLogFile.Writeline
else
' Записываем результат в лог
oLogFile.Writeline "Эта подпапка отсутствует в папке " & oEndCopyFolder & " Давайка ее скопируем." & vbCrLf
oFSO.CopyFolder oSubFolder, sEndCopyFolder, True
' Проверка на наличие ошибок
if err.Number <> 0 then
' Запись сообщения об ошибке в лог
oLogFile.Writeline "-----> Error # " & CStr(Err.Number) & " " & Err.Description
' Очистка ошибки
Err.Clear
' Счетчик ошибок при копировании новых папок и подпапок
err_SubFolder=err_SubFolder+1
else
' Счетчик новых скопированных папок и подпапок
num_SubFolder_copy=num_SubFolder_copy+1
End if
End if
Next
End Sub