none
Script para copiar arquivos de varios diretorios RRS feed

  • Pergunta

  • Ola pessoal, 

    Sou novo ainda com Programação e se for possível, gostaria de uma ajuda com o código abaixo.

    Este código entra no diretório da rede que defini e faz a busca conforme os critérios e faz uma cópia no diretório final.

    #Determina o caminho de Destino
    
    $DirRaiz = 'DIRETORIO_FINAL'
    
    #Executa a Leitura do arquivo .txt
    
    $Server = Get-Content -Path 'C:\PowerShell\Servers.txt'
    
    #Transforma as linhas do arquivo em um array 
    
    $Server.GetType() | Format-Table -AutoSize
    
    #Lista as linhas do arquivo
    
    foreach ($element in $Server) 
        { 
           foreach($arq in (Get-ChildItem $element  -Recurse -Include "*.xlsm")){
                    
               if ((Get-Item $arq).Name -like '*W-RL*' -and $arq.Name -like '*8.5*' -and $arq.LastAccessTime -gt '2018-12-01' -and $arq.Length -ge 1mb -and $arq.Length -le 12mb) 
               {Copy-Item $arq.Fullname "$($DirRaiz)\$($NomePasta.Name)\$($arq.Name)" -Force}    
           }
    
    }


    Acontece que tenho agora 20 Diretórios em rede para fazer este mesmo processo. Eu tenho em lista .txt os diretórios, e gostaria que ele realizasse a leitura do diretório ali listado e com isso realizasse a busca como a definição do código acima, feito isso copiasse para pasta selecionada. Como agora eu tenho mais diretórios, queria também que ele criasse uma pasta de referencia ao diretório, por exemplo, acessa o diretório A e realiza a busca relacionada, apos isso copia os arquivos e leva para o diretório final e cria uma pasta "Arquivos Diretório A 2018-12-04" e assim por diante.

    Conseguem me ajudar?



    terça-feira, 4 de dezembro de 2018 12:49

Todas as Respostas

  • Pessoal, apos algumas pesquisas consegui que fizesse a leitura dos server em .txt me baseei no mesmo método para criar as pastas, funciona, mas de forma errada. Estou usando o código abaixo:

    $DirRaiz = 'DIRETORIO_FINAL'
    $Arquivos = Get-Content -Path 'C:\PowerShell\Pastas_Nomes.txt'
    $Server = Get-Content -Path 'C:\PowerShell\Servers.txt'
    
    
    $Server.GetType() | Format-Table -AutoSize
    $Arquivos.GetType() | Format-Table -AutoSize
    
    
    #Listando as linhas do arquivo
    
    foreach ($Arquivo in $Arquivos) {
    
        $NomePasta = $Arquivo
    
            foreach ($element in $Server) { 
                    
                    new-item (Join-Path $DirRaiz -ChildPath $NomePasta) -itemtype directory
    
                    foreach ($arq in (Get-ChildItem $element  -Recurse -Include "*.xlsm")) {
                        
    
                        if ((Get-Item $arq).Name -like '*W-RL*' -and $arq.Name -like '*8.5*' -and $arq.LastAccessTime -gt '2018-12-01' -and $arq.Length -ge 1mb -and $arq.Length -le 12mb)
    
                            {Copy-Item $arq.Fullname "$($DirRaiz)\$($NomePasta)\$($arq.Name)" } 
    
            }
    
        }
    }

    Ele cria as pastas certinho, o problema é que copia os mesmos arquivos para todas elas.

    É necessário que ele copie os arquivos do server "A" e coloque na Pasta correspondente a "A", terminou a busca, copiou os arquivos e transferiu, agora deve ir para o server "B" e assim por diante.

    Podem me ajudar?

    quarta-feira, 5 de dezembro de 2018 14:12
  • foreach ($element in $Server) {
    
            foreach ($Arquivo in $Arquivos) { 
                     $NomePasta = $Arquivo
                    
                    new-item ("$DirRaiz\$serverName\$NomePasta") -itemtype directory
    
                    foreach ($arq in (Get-ChildItem "$element\$NomePasta" -Recurse -Include "*.xlsm")) {
                        
    
                        if ((Get-Item $arq).Name -like '*W-RL*' -and $arq.Name -like '*8.5*' -and $arq.LastAccessTime -gt '2018-12-01' -and $arq.Length -ge 1mb -and $arq.Length -le 12mb)
    
                       {     Copy-Item $arq.Fullname "$($DirRaiz)\$($serverName)\$($NomePasta)\$($arq.Name)" }
    
            }
    
        }
    }


    https://inframicrosoft.wordpress.com/

    quarta-feira, 5 de dezembro de 2018 17:18
  • Olá Maurício,

    Obrigado pela ajuda, mas ainda continua o mesmo problema. Ele cria as pastas e copia os arquivos dentro dela, mas duplica tudo.

    Exemplo Server:

    C:\ServidorA

    D:\ServidorB

    Exemplo Nome Pasta a ser criada (Esta também segue uma lista em TXT, justamente para alterar o nome quando necessário):

    Arquivos_Servidor_A

    Arquivos_Servidor_B

    Estou com dificuldade de fazer ele entender o seguinte.

    Ele deve realizar a pesquisa no server A, Localizar os arquivos, criar a pasta de referencia ao Server no local indicado e colar os arquivos dentro desta pasta criada. Feito isso vai para server B e faz o mesmo processo, e, assim por diante.

    O que esta sendo feito é o seguinte:

    Ele realiza a pesquisa no Server A, Localiza os arquivos, Cria a Pasta de Referencia ao Server A e cola os arquivos. Só que ele cola todos os arquivos localizados no Server A, B, C, D... dentro dela, Feito isso, cria a pasta de referencia ao Server B, e cola novamente os arquivos localizados no Server A, B, C, D... ele faz isso em todas as pastas criadas, gerando duplicidades.



    quinta-feira, 6 de dezembro de 2018 13:26
  • Em cada servidor os nomes das pastas a serem copiadas são iguais? Você quer somente os arquivos sem manter as estruturas de pastas? Eu testei aqui e não teve duplicatas.


    https://inframicrosoft.wordpress.com/

    quinta-feira, 6 de dezembro de 2018 13:38
  • infelizmente não, pois dentro do Server A vai haver varias outras pastas, e para não ficar listando diretório a diretório, coloquei somente o diretório inicial no txt, até mesmo para que se houver alteração fique mais facil a manutenção, com isso a pesquisa é realizada em todas as pastas e sub-pastas que houverem, e somente irá copiar os arquivos que estiverem com esta definição:

    ((Get-Item $arq).Name -like '*W-RL*' -and $arq.Name -like '*8.5*' -and $arq.LastAccessTime -gt '2018-12-01' -and $arq.Length -ge 1mb -and $arq.Length -le 12mb)

    Ao localizar o arquivo nestas configurações então ele copia.

    A ideia de criar uma nova pasta é justamente para não misturar os arquivos com os de outros servidores. Então, deste modo, se ele localizar 3 arquivos no servidor A, ele vai colocar na pasta criada de referencia a esse servidor. Feito isso ele deve seguir para o servidor B, fazer a mesma rotina, e colocar os arquivos localizados na pasta criada de referencia ao servidor B. Criei o Txt para "Nomear as Pastas de referencia" seguindo o mesmo método para leitura dos server, pois ainda sou novato nisso e não consegui pensar em outra forma, contudo se tiver um outro método que se aplique, podemos testar sem problema.

    quinta-feira, 6 de dezembro de 2018 14:29
  • Então você tem uma lista de pasta que deseja pesquisar em casa servidor? Pode colocar exemplo do conteúdo de cada txt auxiliar?

    https://inframicrosoft.wordpress.com/

    quinta-feira, 6 de dezembro de 2018 16:48
  • Tenho sim:

    Conteúdo da txt servidores: 

    \\10.51.178.10\cwb_fileserver$\Diretorio\DEPARTAMENTOS
    \\10.51.178.11\cwb_fileserver$\Diretorio\DEPARTAMENTOS
    \\10.51.178.12\cwb_fileserver$\Diretorio\DEPARTAMENTOS
    \\10.51.178.13\poa_fileserver$\Diretorio\DEPARTAMENTOS
    \\10.51.178.14\poa_fileserver$\Diretorio\DEPARTAMENTOS
    \\10.51.178.15\RJO_fileserver$\Diretorio\DEPARTAMENTOS
    \\10.51.178.16\spo_fileserver$\Diretorio\DEPARTAMENTOS
    \\10.51.178.17\mgo_fileserver$\Diretorio\DEPARTAMENTOS
    \\10.51.178.18\dfo_fileserver$\Diretorio\DEPARTAMENTOS
    \\10.51.178.19\peo_fileserver$\Diretorio\DEPARTAMENTOS

    Conteúdo da txt nomeação de pastas:

    ARQUIVOS_PR_01
    ARQUIVOS_PR_02
    ARQUIVOS_PR_03
    ARQUIVOS_RS_01
    ARQUIVOS_RS_02
    ARQUIVOS_RJ_01
    ARQUIVOS_SP_01
    ARQUIVOS_MG_01
    ARQUIVOS_DF_01
    ARQUIVOS_PE_01
    Para cada servidor que sera realizada a busca do arquivo, deixei uma definição de pasta para ele. Pensei neste formato, pois evita evita manutenção no código toda vez que precisar acrescentar ou retirar um servidor. 

    quinta-feira, 6 de dezembro de 2018 17:06
  • O melhor que consegui foi assim:

    $DirRaiz = 'C:\Teste\DirFinal'
    $Arquivos = Get-Content -Path 'C:\Teste\Pastas_Nomes.txt'
    $Server = Get-Content -Path 'C:\Teste\Servers.txt'
    
    
    $Server.GetType() | Format-Table -AutoSize
    $Arquivos.GetType() | Format-Table -AutoSize
    
    
    #Listando as linhas do arquivo
    
    foreach ($element in $Server) {
    
            foreach ($Arquivo in $Arquivos) { 
                     $NomePasta = $Arquivo
                    
                    $serverName = $element.Substring($element.Length - 8)
    
                    new-item ("$DirRaiz\$serverName\$NomePasta") -itemtype directory
    
                    foreach ($arq in (Get-ChildItem "$element\$NomePasta" -Recurse -Include "*.csv")) {
                        
    
                       if ((Get-Item $arq).Name -like '*W-RL*' -and $arq.Name -like '*8.5*' -and $arq.LastAccessTime -gt '2018-12-01' -and $arq.Length -ge 1mb -and $arq.Length -le 12mb)
    
                           { Copy-Item $arq.Fullname "$($DirRaiz)\$($serverName)\$($NomePasta)\$($arq.Name)" }
    
            }
    
        }
    }

    A estrutura não é mantida, da forma que está o código, para cada cópia pois o código abaixo já é recursivo:

    Get-ChildItem "$element\$NomePasta" -Recurse -Include "*.xlsm"

    Como não tenho como testar pela rede fiz tudo local mesmo. O nome do servidor no meu caso é só uma forma que eu fiz para ter uma pasta única e você deve alterar para sua realidade.


    https://inframicrosoft.wordpress.com/



    • Editado J. Maurício quinta-feira, 6 de dezembro de 2018 17:42
    quinta-feira, 6 de dezembro de 2018 17:28
  • Mauricio, também não deu certo.

    Tenho que deixar recursivo, pois depois "\\10.51.178.10\cwb_fileserver$\Diretorio\DEPARTAMENTOS" vai ter:

    \DepartA

    \DepartB

    E assim por diante.

    Veja se consegue me ajudar a ter uma ideia com isso agora, deixando um pouco de lado o pedido anterior. Fiz uma alteração no código, em vez de copiar os arquivos nos servidores, fiz ele fazer a varredura e me trazer a informação de onde esta o arquivo pesquisado, informando servidor, pasta, sub-pastas, nome do arquivo e extensão, ou seja a informação completa de onde esta o arquivo. 

    Veja o código.

    $DirFinal = 'Diretorio_Final'
    $Server = Get-Content -Path 'C:\PowerShell\Servers.txt'
    
    $Server.GetType() | Format-Table -AutoSize
    
    $HoraInicial = Get-Date -format HH:mm:ss
    
    foreach ($Pesquisa in $Server) {
    
                    foreach ($arq in (Get-ChildItem $Pesquisa -Recurse -Include "*.xlsm")){
                        
                        if ((Get-Item $arq).Name -like '*W-RL*' -and $arq.LastAccessTime -gt (Get-Date).AddDays(-2) -and $arq.Length -ge 1mb -and $arq.Length -le 15mb)
           
                        {Write-Verbose -message $arq -verbose }
                    }
    
        $HoraFinal= Get-Date -format HH:mm:ss
    
        $dif= New-TimeSpan -Start $HoraInicial -End $HoraFinal
    
        Write-Verbose -message "Resultados: $Pesquisa - Tempo de Pesquisa por Server: $dif" -verbose
    
        $HoraInicial = Get-Date -format HH:mm:ss
     
     }

    Como falei ainda estou pegando isso, queria gerar relatório em txt ou csv, mas não consegui 100%, então deixei em tela mesmo. E como sou curioso, queria saber também quanto tempo ele leva para terminar cada pesquisa.

    Com estas informações é possível mudar a forma com ele vai copiar os arquivos, uma vez que eu já sei onde esta, certo? e com isso posso definir a pasta que será transposto com a definição que estou tentando? Só estou travado em como fazer neste momento hshshshs

    quinta-feira, 6 de dezembro de 2018 19:11
  • Não sei se funciona ou se é a melhor forma, mas acho que daria para exportar assim:

    Get-ChildItem $Pesquisa -Recurse -Include "*.xlsm" | Where-Object {$_.Name -like '*W-RL*' -and $_.LastAccessTime -gt (Get-Date).AddDays(-2) -and $_.Length -ge 1mb -and $_.Length -le 15mb} | Export-Csv -Path $Path -Force


    https://inframicrosoft.wordpress.com/

    sexta-feira, 7 de dezembro de 2018 13:35
  • Pior que não funciona muito bem. Neste caso meu maior problema é ele gerar o relatório completo.

    No código colocamos para ele fazer a pesquisa dentro de um loop e somente copiar ou listar aquele arquivo que se esta dentro dos critérios de pesquisa.

    Neste exemplo de código que vc me passou, até consegui extrair, mas ficou incompleto trazendo a ultima informação somente. Tentei desta forma também:

    {out-file -filepath "$DirFinal\Teste_process.txt" -inputobject $arq}
    Não consigo fazer com que se sobreponha, seria legal se a cada item localizado ele preenchesse sem apagar o resultado anterior.


    segunda-feira, 10 de dezembro de 2018 14:07