1 (изменено: TAluberT, 2016-06-03 18:30:50)

Тема: VBS: Копировани файлов без перезаписи

Добрый день.

Начал изучать vbs c простой задачи:

Подключить сетевой диск, от определённого пользователя.
  Скопировать на него несколько файлов, перезаписывать не нужно.
   Отключить сетевой диск.

Проблема в следующем
Эта редиска копирует вновь созданные файлы, но только какие ему нравятся, критерий понять не могу.

Если поставить перезапись, то все файлы копируются.


On Error Resume Next
Set objWshNetwork = CreateObject( "WScript.Network" )
Set objShell = CreateObject("Shell.Application")
objWshNetwork.MapNetworkDrive "n:","\\111.116.113.115\\Журналы событий", "true","networkuser","XXX" 
    If Err.Number Then
      WScript.echo "Копирование прошло с ошибками. Сообщите об этом администратору."& " " & Err.Number & " - "  & Err.Description
   else
Dim fso, FolderName2, FolderName1 

Set fso = CreateObject("Scripting.FileSystemObject")
FolderName1 = "C:\Users\*.*"   
FolderName2 ="N:\goto"

fso.CopyFile FolderName1, FolderName2, 0
    If Err.Number Then
     If Err.Number <> 58 Then
      WScript.echo "Копирование прошло с ошибками. Сообщите об этом администратору."& " " & Err.Number & " - "  & Err.Description
     End if
    End if
  End if
WScript.Sleep 60000*0.2
objWshNetwork.RemoveNetworkDrive "n:", true, true  

.

2

Re: VBS: Копировани файлов без перезаписи

Критерием может быть запрет на скрытые/системные файлы.
Скрипт можно сократить:

Set objWshNetwork = CreateObject("WScript.Network")
On Error Resume Next
objWshNetwork.MapNetworkDrive "n:","\\111.116.113.115\\Журналы событий", "true","networkuser","XXX" 
If Err.Number Then
	WScript.echo "Копирование прошло с ошибками. Сообщите об этом администратору."& " " & Err.Number & " - "  & Err.Description
Else
	CreateObject("Scripting.FileSystemObject").CopyFile "C:\Users\*.*", "N:\goto\", 0
    If Err.Number <> 0 And Err.Number <> 58 Then _
    WScript.echo "Копирование прошло с ошибками. Сообщите об этом администратору." & " " & Err.Number & " - "  & Err.Description
End If
objWshNetwork.RemoveNetworkDrive "n:", True, True

Чтобы избежать проблемы можно попробовать CopyHere.

3 (изменено: TAluberT, 2016-06-06 12:50:29)

Re: VBS: Копировани файлов без перезаписи

Flasher пишет:

Критерием может быть запрет на скрытые/системные файлы.

В том-то и дело, что нет.
Для экспиремента. Взял большой файл и насоздавал кучу маленьких, правой кнопкой мыши.
Если папка назначения пуста, скрипт копирует все, если нет то он пропускает файлы начинающиеся со слова "Новый" или "Рисунок" и при этом копирует Многие другие, например начинающиеся со слова "Архив"

Если в папке назначения после прогона скрипта  удалить файл с "Архив" он его при повторном запуске скрипта тоже заново не копирует.
Что-то я делаю не так...

4

Re: VBS: Копировани файлов без перезаписи

По логике он должен пропускать файлы, которые уже есть в папке, а также те, у которых нет расширений.

5 (изменено: TAluberT, 2016-06-07 20:53:02)

Re: VBS: Копировани файлов без перезаписи

Flasher

Нашёл способ копировать пофайлово.
Даже сделал вариант с  CopyHere


Вот он.




Set objWshNetwork = CreateObject("WScript.Network")
Set objShell = CreateObject("Shell.Application")
On Error Resume Next
objWshNetwork.RemoveNetworkDrive "n:", True, True
Err.Clear()

objWshNetwork.MapNetworkDrive "n:","\\132.316.313.315\sare", "true","networkuser","fgdfgdsM" 
If Err.Number Then
	WScript.echo "Сетевой диск не подключился. Сообщите об этом администратору." & " " & Err.Number & " - "  & Err.Description
Else
Set fso = CreateObject("Scripting.FileSystemObject")
Dim fso, FolderNet, FolderLocal 
FolderLocal = "C:\Users\"   
FolderNet ="n:\goto"

Set LogFile = FSO.OpenTextFile("C:\Distr\copy.log", 8, True)
LogFile.WriteLine " "
LogFile.WriteLine Now & " --- Начало процесса копирования ---"

If Not FSO.FolderExists(FolderLocal) Then
    LogFile.WriteLine Now & " ------ Папка: '" & FolderLocal & "' - не существует"
'    WScript.echo "Папка: " & " " & FolderLocal & " : не существует"

If Not FSO.FolderExists(FolderNet) Then
    LogFile.WriteLine Now & " ------ Папка: '" & FolderNet & "' - не существует"
'    WScript.echo "Папка: " & " " & FolderNet & " : не существует"
LogFile.Close
WScript.Quit
End If
End If

Set objFolder = fso.GetFolder(FolderLocal)
Set objColFiles = objFolder.Files

For Each file In objColFiles

LogFile.WriteLine Now & " ===== Файл: " &"'" & file.Name & "' - " & round(file.Size/1024,2) & "КБ" &  " Начало обработки."
   objShell.NameSpace(FolderNet).CopyHere FolderLocal & "\" & file.Name
     If Err.Number <> 0 And Err.Number <> 58 Then
      LogFile.WriteLine Now & " ------ Копирование прошло с ошибками. " & Err.Number & " - "  & Err.Description
      WScript.echo "Копирование прошло с ошибками. Сообщите об этом администратору." & " " & Err.Number & " - "  & Err.Description
     else
      LogFile.WriteLine Now & " ======Файл: " &"'" & file.Name &"'" & " Скопирован или существует."
    End If

Next


objWshNetwork.RemoveNetworkDrive "n:", True, True
LogFile.WriteLine Now & " --- Конец процесса копирования ---"
LogFile.Close
End if








Но всплыли опять грабли
Файл в папке назначения создаётся сразу и размером как и исходный файл.
Если например прервалась связь, остаётся битый файл. Размером и именем не отличающийся от оригинала.

И с CopyHere не понял как не заменять имеющиеся файлы вообще.

Стратегически, как я думаю, нужно копать в сторону предварительной проверки наличия и сравнения файлов. И копировать только то чего не хватает.

6

Re: VBS: Копировани файлов без перезаписи

Стратегически мысль верная, т.к. в методе такой опции нет, поэтому придётся проверять по

If Not FSO.FileExists(FSO.BuildPath(FolderNet, file.name))

Если бы задача стояла иначе, то можно было бы копировать без цикла по *.* (опция - 128) или .Items).
Насчёт прерванной связи не в курсе, под рукой нет сетевого.