none
VBS.Помогите написать скрипт копирования файлов с созданием лога копирования. RRS feed

  • Вопрос

  •  

    Добрый день.

     

    Прошу помочь с написанием скрипта.

    Нужно скопировать данные с диска с сохранением всей иерархии папок и файлов, в определенную папку на другой диск. Желательно, чтобы при этом создалось 2 лог-файла: один - со списком успешно скопированых файлов, а второй - со списком файлов, которые не удалось скопировать. Если можно, то с отображением процесса копирования на экране.

     

    Если нет желания писать скрипт, то напишите, пожалуйста, ссылку на похожее решение.

     

    Заранее спасибо, всем откликнувшимся.

    11 января 2008 г. 9:06

Ответы

  • Ну как-то вот так наверное :

     

    vxcopy.wsf

    <job>
        <runtime>
            <description>
                        XCopy on VBScript
            </description>
            <named
                name = "SRC"
                helpstring = "Source directory (/S also possible)"
                type = "string"
                required = "true"    
            />
            <named
                name = "DST"
                helpstring = "Destination directory (/D also possible)"
                type = "string"
                required = "true"
            />
            <named
                name = "Good"
                helpstring = "file for cood copied files (/G)(default - strout)"
                type = "string"
                required = "false"    
            />
            <named
                name = "Bad"
                helpstring = "file for BAD copied files (/B) (default - strerr)"
                type = "string"
                required = "false"    
            />
            <example>
          Example: vxcopy.wsf /S:"c:\debug" /D:"c:\release"
            </example>
        </runtime>
    <script language="VBScript">

    On Error Resume Next

     

    Const ForReading = 1, ForWriting = 2

     

    Set oFso = CreateObject("Scripting.FileSystemObject")

     

       if WScript.Arguments.Named.Item("SRC") <> "" then
          SDir = WScript.Arguments.Named.Item("SRC")
       Elseif WScript.Arguments.Named.Item("S") <> "" then
          SDir = WScript.Arguments.Named.Item("S")
       Else
          Wscript.Echo "Source directory must be set."
          Wscript.Echo "----------------------------"
          WScript.Arguments.ShowUsage
          WScript.Quit (1)
       end if

     

       if WScript.Arguments.Named.Item("DST") <> "" then
          DDir = WScript.Arguments.Named.Item("DST")
       Elseif WScript.Arguments.Named.Item("D") <> "" then
          DDir = WScript.Arguments.Named.Item("D")
       Else
          Wscript.Echo "Destination directory must be set."
          Wscript.Echo "----------------------------"
          WScript.Arguments.ShowUsage
          WScript.Quit (2)
       end if


       if WScript.Arguments.Named.Item("Good") <> "" then
          FileName = WScript.Arguments.Named.Item("Good")
       elseif WScript.Arguments.Named.Item("G") <> "" then
          FileName = WScript.Arguments.Named.Item("G")      
       Else
          FileName = ""
       end if

     

       if FileName <> "" Then
          Set  GoodFile = oFso.OpenTextFile(FileName, ForWriting, True)
          if Err Then
              Wscript.Echo "Error open Good file = " & FileName
              Wscript.Echo "----------------------------"
              WScript.Quit (3)
          end if
       Else
          Set GoodFile = Wscript.StdOut
       end if  

         
       if WScript.Arguments.Named.Item("Bad") <> "" then
          FileName = WScript.Arguments.Named.Item("Bad")
       elseif WScript.Arguments.Named.Item("B") <> "" then
          FileName = WScript.Arguments.Named.Item("B")
       Else
          FileName = ""
       end if

     

       if FileName <> "" Then
          Set  BadFile = oFso.OpenTextFile(FileName, ForWriting, True)
          if Err Then
              Wscript.Echo "Error open Badfile = " & FileName
              Wscript.Echo "----------------------------"
              WScript.Quit (3)
          end if
       Else
          Set BadFile = Wscript.StdErr
       end if  
         
       if NOT oFso.FolderExists(SDir) Then
          Wscript.Echo "Error open source directory" & sDir
          Wscript.Echo "----------------------------"
          WScript.Quit (3)
       Else
          CopyDir SDir, DDir
       end if


    Sub CopyDir ( ByVal Src, ByVal Dst )

     

        If NOT oFSO.FolderExists(Dst) Then

     

           Set Folder = oFSO.CreateFolder(Dst)

     

           if Err Then
              Err.Clear
              BadFile.Write "Create Folder - " & Dst & vbcrlf
              '!!!!!!!! Hmmmm Need write other files to Bad log?
              Exit Sub
           Else
              GoodFile.Write "Create folder - " & Dst & vbcrlf
           end if   
        end if

     

        for each Folder in oFSO.GetFolder(Src).Subfolders
            CopyDir Src & "\" & Folder.Name , Dst & "\" & Folder.Name
        next

     

        for each File in oFSO.GetFolder(Src).Files
            oFSO.CopyFile File, Dst & "\" & File.Name
           if Err Then
              Err.Clear
              BadFile.Write "File - " & File.Path & "\" & File.Name & vbcrlf
           Else
              GoodFile.Write File.Path & "\" & File.Name  & vbcrlf
           end if   
        next

     

    End Sub


    </script>
    </job>

     

     

    Там в одном месте в подпрограмме стоит выход, если создание каталога неудачно. Соответственно всё что глубже этого каталога в логи не пойдет. Если её убрать, то в логах будут ошибки от создания поддеревьев.

    11 января 2008 г. 16:30

Все ответы

  • А почему обязательно .vbs? Чем не нравится штатная xcopy?

    xcopy /e /h /q "C:\Test 1" "D:\Test 2"

    И какие файлы не могут быть скопированы? У меня копируются все, с любыми атрибутами
    11 января 2008 г. 11:08
  • Если файл уже существует, то xcopy каждый раз спрашивает, нужно ли его перезаписать. Тэг /y почему-то не срабатывает.

     

    А вообще у меня задачи с потоковым копированием различных файлов постоянно возникают, так что хотелось иметь под рукой скрипт, который путем несложных изменений можно было бы использовать для различных ситуаций.

    11 января 2008 г. 11:37
  • Только что сегодня рекомендовал очень хорошую бесплатную (для некоммерческого использования) утилиту копирования.

     

    http://www.xxcopy.com/xxcopy01.htm

     

    Там можно найти параметры копирования на ВСЕ случаи жизни. (Ну, почти на все ...)

    11 января 2008 г. 12:04
  • Тэг /y почему-то не срабатывает.
    Нет никаких предположений по этому поводу, кроме как ошибочного использования русского "у'
    Еще есть неплохая утилита robocopy.exe из состава Windows Server 2003 Resource Kit Tools
    11 января 2008 г. 12:07
  •  01MDM написано:
    Тэг /y почему-то не срабатывает.
    Нет никаких предположений по этому поводу, кроме как ошибочного использования русского "у'
    Еще есть неплохая утилита robocopy.exe из состава Windows Server 2003 Resource Kit Tools

     

    Спасибо за совет.

     

    Но, если можно, то хотелось бы посмотреть пример скрипта. Т.к. у меня задача научиться писать скрипты самому.

    11 января 2008 г. 13:09
  • Ну как-то вот так наверное :

     

    vxcopy.wsf

    <job>
        <runtime>
            <description>
                        XCopy on VBScript
            </description>
            <named
                name = "SRC"
                helpstring = "Source directory (/S also possible)"
                type = "string"
                required = "true"    
            />
            <named
                name = "DST"
                helpstring = "Destination directory (/D also possible)"
                type = "string"
                required = "true"
            />
            <named
                name = "Good"
                helpstring = "file for cood copied files (/G)(default - strout)"
                type = "string"
                required = "false"    
            />
            <named
                name = "Bad"
                helpstring = "file for BAD copied files (/B) (default - strerr)"
                type = "string"
                required = "false"    
            />
            <example>
          Example: vxcopy.wsf /S:"c:\debug" /D:"c:\release"
            </example>
        </runtime>
    <script language="VBScript">

    On Error Resume Next

     

    Const ForReading = 1, ForWriting = 2

     

    Set oFso = CreateObject("Scripting.FileSystemObject")

     

       if WScript.Arguments.Named.Item("SRC") <> "" then
          SDir = WScript.Arguments.Named.Item("SRC")
       Elseif WScript.Arguments.Named.Item("S") <> "" then
          SDir = WScript.Arguments.Named.Item("S")
       Else
          Wscript.Echo "Source directory must be set."
          Wscript.Echo "----------------------------"
          WScript.Arguments.ShowUsage
          WScript.Quit (1)
       end if

     

       if WScript.Arguments.Named.Item("DST") <> "" then
          DDir = WScript.Arguments.Named.Item("DST")
       Elseif WScript.Arguments.Named.Item("D") <> "" then
          DDir = WScript.Arguments.Named.Item("D")
       Else
          Wscript.Echo "Destination directory must be set."
          Wscript.Echo "----------------------------"
          WScript.Arguments.ShowUsage
          WScript.Quit (2)
       end if


       if WScript.Arguments.Named.Item("Good") <> "" then
          FileName = WScript.Arguments.Named.Item("Good")
       elseif WScript.Arguments.Named.Item("G") <> "" then
          FileName = WScript.Arguments.Named.Item("G")      
       Else
          FileName = ""
       end if

     

       if FileName <> "" Then
          Set  GoodFile = oFso.OpenTextFile(FileName, ForWriting, True)
          if Err Then
              Wscript.Echo "Error open Good file = " & FileName
              Wscript.Echo "----------------------------"
              WScript.Quit (3)
          end if
       Else
          Set GoodFile = Wscript.StdOut
       end if  

         
       if WScript.Arguments.Named.Item("Bad") <> "" then
          FileName = WScript.Arguments.Named.Item("Bad")
       elseif WScript.Arguments.Named.Item("B") <> "" then
          FileName = WScript.Arguments.Named.Item("B")
       Else
          FileName = ""
       end if

     

       if FileName <> "" Then
          Set  BadFile = oFso.OpenTextFile(FileName, ForWriting, True)
          if Err Then
              Wscript.Echo "Error open Badfile = " & FileName
              Wscript.Echo "----------------------------"
              WScript.Quit (3)
          end if
       Else
          Set BadFile = Wscript.StdErr
       end if  
         
       if NOT oFso.FolderExists(SDir) Then
          Wscript.Echo "Error open source directory" & sDir
          Wscript.Echo "----------------------------"
          WScript.Quit (3)
       Else
          CopyDir SDir, DDir
       end if


    Sub CopyDir ( ByVal Src, ByVal Dst )

     

        If NOT oFSO.FolderExists(Dst) Then

     

           Set Folder = oFSO.CreateFolder(Dst)

     

           if Err Then
              Err.Clear
              BadFile.Write "Create Folder - " & Dst & vbcrlf
              '!!!!!!!! Hmmmm Need write other files to Bad log?
              Exit Sub
           Else
              GoodFile.Write "Create folder - " & Dst & vbcrlf
           end if   
        end if

     

        for each Folder in oFSO.GetFolder(Src).Subfolders
            CopyDir Src & "\" & Folder.Name , Dst & "\" & Folder.Name
        next

     

        for each File in oFSO.GetFolder(Src).Files
            oFSO.CopyFile File, Dst & "\" & File.Name
           if Err Then
              Err.Clear
              BadFile.Write "File - " & File.Path & "\" & File.Name & vbcrlf
           Else
              GoodFile.Write File.Path & "\" & File.Name  & vbcrlf
           end if   
        next

     

    End Sub


    </script>
    </job>

     

     

    Там в одном месте в подпрограмме стоит выход, если создание каталога неудачно. Соответственно всё что глубже этого каталога в логи не пойдет. Если её убрать, то в логах будут ошибки от создания поддеревьев.

    11 января 2008 г. 16:30
  • Большое СПАСИБО !

     

    Сегодня проверю обязательно!

    14 января 2008 г. 12:09