Jump to content
frenovato

Copiar pastas usando o CMD/Robocopy

Recommended Posts

Boa Tarde.

Na busca continua de melhorar processos estou tentando criar uma interface e reduzir o tempo de cópia de pastas nos servidores de arquivos.

Usando um processo manual com o CMD e o comando robocopy do Windows consigo copiar arquivos com nomes extensos e acima de 255 caracteres.

No processo esbarrei na minha limitação e travei na execução do comando. Alguém teria alguma luz para dar no processo?

Segue o que foi feito até o momento.

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <AutoItConstants.au3>

#Region ### START Koda GUI section ### Form=

Global $origem, $destino, $numera = 0, $txt, $result, $listar

Local $_1 = GUICreate("Copiar arquivos", 541, 402, 616, 134)
Local $Button_iniciar = GUICtrlCreateButton("Iniciar cópia", 400, 352, 131, 41)
GUICtrlSetFont(-1, 10, 800, 0, "Arial")
Local $Label2 = GUICtrlCreateLabel("  **Rodar apenas em servidores**", 17, 306, 508, 26, BitOR($SS_CENTERIMAGE,$SS_SUNKEN))
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x000000)
Local $Origem_box = GUICtrlCreateGroup("Origem", 8, 8, 393, 81)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
Local $Input_origem = GUICtrlCreateInput("Origem", 24, 40, 259, 24)
Local $Button_proc_ori = GUICtrlCreateButton("Selecionar", 309, 38, 75, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Local $Destino_box = GUICtrlCreateGroup("Destino", 8, 104, 393, 81)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
Local $Input_destino = GUICtrlCreateInput("Destino", 24, 136, 259, 24)
Local $Button_proc_dest = GUICtrlCreateButton("Selecionar", 309, 134, 75, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Local $txt = GUICtrlCreateGroup("Registro de Saída", 8, 208, 393, 81)
GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
Local $Input_txt = GUICtrlCreateInput("Nome do txt de saída", 24, 240, 259, 24)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)

#EndRegion ### END Koda GUI section ###

Local $sUserName = ;usuário
Local $sPassword = ;senha
Local $sDomain = ;domínio
Local $sCMD = "robocopy" & $Input_origem & $Input_destino & "/E /R:0 /W:0 /V /NP /ETA /LOG+:" & @ScriptDir & $Input_txt & ".txt"

Global $prompt = RunAsWait($sUserName, $sDomain, $sPassword, $RUN_LOGON_NOPROFILE, @ComSpec & "/C" & $sCMD)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

        Case $Button_proc_ori
            $origem = FileSelectFolder("Procurando pasta.", "", "", @ScriptDir)
            GUICtrlSetData($Input_origem, $origem)
        Case $Button_proc_dest
            $destino = FileSelectFolder("Procurando pasta.", "", "", @ScriptDir)
            GUICtrlSetData($Input_destino, $destino)
        Case $Button_iniciar
            $origem = GUICtrlRead($Input_origem)
            $destino = GUICtrlRead($Input_destino)
            $txt = GUICtrlRead($Input_txt)
            SplashTextOn("Copiar:", "Copiando arquivos, aguarde...", 320, 60, -1, -1, 33, "Arial black", 12)
            If FileExists($origem) >= FileExists($destino) Then $prompt
            ProcessWaitClose($prompt)
            If FileExists($destino) Then listar($listar, $destino)
            If FileExists($origem) = FileExists($destino) Then MsgBox(4096, "Finalizado:", "Foram copiados " & $numera & " arquivos.")
            $result = StdoutRead(RunAsWait($sUserName, $sDomain, $sPassword, $RUN_LOGON_NOPROFILE, @ComSpec & "/C" & $sCMD))
            FileChangeDir(@ScriptFullPath)
            FileOpen($Input_txt & ".txt", 1)
            FileWrite($Input_txt & ".txt", $result)
            FileClose($Input_txt & ".txt")
            If FileExists(@WorkingDir & $Input_txt & ".txt") Then MsgBox(4096, "Documento de saída criado", "O documento foi " & @WorkingDir & $Input_txt & ".txt com sucesso")
            If Not FileExists(@WorkingDir & $Input_txt & ".txt") Then MsgBox(4096, "Falha no retorno", "O documento não foi criado com sucesso")
            Sleep(5000)
            SplashOff()
            exit
    EndSwitch
WEnd

Func listar(ByRef $listar, $path = "")
    $counter = 0
    $path &= '\'
    Local $list_files = '', $file, $demand_file = FileFindFirstFile($path & '*')
    If $demand_file = -1 Then Return ''
    While 1
        $file = FileFindNextFile($demand_file)
        If @error Then ExitLoop
        If @extended Then
            If $counter >= 10 Then ContinueLoop
            listar($listar, $path & $file)
        Else
            If $origem = $destino Then
                $numera += 1
                TrayTip("Listando", $file, 1, 0)
                IniWrite(@ScriptDir & "\Teste.txt", "Retorno da cópia", $path & $file, StringLen($path & $file) & " linhas")
            EndIf
        EndIf
    WEnd
    FileClose($demand_file)
EndFunc   ;==>listar

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×