none
Скрипт копирования файлов. Непонятно почему берет аттрибут не того объекта. RRS feed

  • Вопрос

  • Set filesys = CreateObject("Scripting.FileSystemObject")
    Set objFolder = filesys.GetFolder("\\Server01\e\")
    
    DIM Fl, DtN
    Datefolder = Year(date) & Right("0" & Month(date), 2) & Right("0" & Day(date), 2)
    
    DtN = filesys.BuildPath("\\R30\d\", Datefolder)
    If Not filesys.FolderExists(DtN) Then filesys.CreateFolder(DtN)
    DtNfull = filesys.BuildPath(DtN, "playblast")
    If Not filesys.FolderExists(DtNfull) Then filesys.CreateFolder(DtNfull)
    
    For Each File in objFolder.Files
    If LCase(filesys.GetExtensionName(File)) = "mov" OR _
    LCase(filesys.GetExtensionName(File)) = "avi" AND _
    DateDiff("D", File.DateLastModified, Now) < 1 THEN
    filesys.CopyFile File, DtNfull & "\" & File.Name
    End If
    Next
    ShowSubFolders(objFolder)
    
    Sub ShowSubFolders(objFolder)
      Set colFolders = objFolder.SubFolders
      For Each objSubFolder In colFolders
        Set colFiles = objSubFolder.Files
        For Each File In colFiles
          If LCase(filesys.GetExtensionName(File)) = "mov" OR _
          LCase(filesys.GetExtensionName(File)) = "avi" AND _
          DateDiff("D", File.DateLastModified, Now) < 1 THEN
          filesys.CopyFile File, DtNfull & "\" & File.Name
          End If
        Next
        ShowSubFolders(objSubFolder)
      Next
    End Sub
    

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

    Но почему то корректно он работает только с корневой папкой, из подпапок он почему то берет все файлы, независимо от даты их изменения. Я так подозреваю это происходит потому, что дату изменения он сравнивает с датой изменения подпапки в которой находится файл....

    Если кто может укажите пожалуйста где я ошибся?

     

    13 декабря 2011 г. 21:24

Ответы

  • Может быть вам проще использовать утилиту robocopy.exe ?
    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    • Помечено в качестве ответа KazunEditor 14 декабря 2011 г. 11:13
    14 декабря 2011 г. 4:33
    Модератор
  • Разобрался. Нужно было вот так

     

    robocopy \\Server01\e\ \\R30\d\ /S /MAXAGE:3 *.mov

    • Помечено в качестве ответа KazunEditor 14 декабря 2011 г. 11:13
    14 декабря 2011 г. 10:53
  • Василий Киселев, похоже, дело в том, что вы не учли разницу в приоритетах логических операций.
    Условие должно выглядеть так:
    If (LCase(filesys.GetExtensionName(File)) = "mov" OR _
          LCase(filesys.GetExtensionName(File)) = "avi") AND _
          DateDiff("D", File.DateLastModified, Now) < 1 THEN

    А я сам вообще разделил бы это условие на два:
    If LCase(filesys.GetExtensionName(File)) = "mov" OR _
          LCase(filesys.GetExtensionName(File)) = "avi" THEN
        If DateDiff("D", File.DateLastModified, Now) < 1 THEN

    Так и проще с анализом логики, и алгоритмически целесообразнее.

    • Изменено DmitriiV 14 декабря 2011 г. 11:36
    • Помечено в качестве ответа KazunEditor 14 декабря 2011 г. 12:05
    14 декабря 2011 г. 11:35

Все ответы

  • Может быть вам проще использовать утилиту robocopy.exe ?
    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    • Помечено в качестве ответа KazunEditor 14 декабря 2011 г. 11:13
    14 декабря 2011 г. 4:33
    Модератор
  • Может быть. Только я пока не нашел простого способа сделать, с помощью этой утилиты, поиск по всем вложенным подкаталогам, файлов с расширением mov и avi.

    Команда  robocopy \\Server01\e\*.mov \\R30\d\ /S /MAXAGE:3 , выдает ошибку

    "ОШИБКА: Недопустимый параметр #1 : "\\Server01\e\*.mov""....


    14 декабря 2011 г. 10:48
  • Разобрался. Нужно было вот так

     

    robocopy \\Server01\e\ \\R30\d\ /S /MAXAGE:3 *.mov

    • Помечено в качестве ответа KazunEditor 14 декабря 2011 г. 11:13
    14 декабря 2011 г. 10:53
  • Василий Киселев, похоже, дело в том, что вы не учли разницу в приоритетах логических операций.
    Условие должно выглядеть так:
    If (LCase(filesys.GetExtensionName(File)) = "mov" OR _
          LCase(filesys.GetExtensionName(File)) = "avi") AND _
          DateDiff("D", File.DateLastModified, Now) < 1 THEN

    А я сам вообще разделил бы это условие на два:
    If LCase(filesys.GetExtensionName(File)) = "mov" OR _
          LCase(filesys.GetExtensionName(File)) = "avi" THEN
        If DateDiff("D", File.DateLastModified, Now) < 1 THEN

    Так и проще с анализом логики, и алгоритмически целесообразнее.

    • Изменено DmitriiV 14 декабря 2011 г. 11:36
    • Помечено в качестве ответа KazunEditor 14 декабря 2011 г. 12:05
    14 декабря 2011 г. 11:35
  • Всем спасибо за ответы. Если вдруг кому пригодится на будущее, то robocopy работает гораздо быстрее чем скрипт, так что лучше использовать именно ее.
    15 декабря 2011 г. 11:29