none
Script para copiar somente arquivos .txt existentes em várias pastas para um unico lugar RRS feed

  • Discussão Geral

  • Script para copiar somente arquivos .txt existentes em várias pastas para um unico lugar, como fazer isso?? o Robocopy copia toda estrutura
    sexta-feira, 31 de março de 2017 19:02

Todas as Respostas

  • Em PowerShell

    Use da seguinte forma : salve o script em um arquivo .ps1 (Ex: CopiaTxt.ps1)
    Execute o script a partir do terminal powershell colocando parametros as pastas raiz de onde voce quer pesquisar se existem arquivos .txt.
    Irá procurar recursivamente na pasta raiz e subpastas.
    Ex: CopiaTxt.ps1 C:\Users\User1\Documents D:\Arquivos C:\Users\User2

    Irá copiar os arquivos .txt para a pasta C:\Backup

    #CopiaTxt.ps1
    Clear-Host
    $totalList = @()
    $pastaDestino = "C:\Backup\"
    if ($args -ne $null)
    {
        for ($i=0;$i -lt $args.Count;$i++)
        {
              
              if (Test-Path $args[$i])
              {
                    $list = Get-ChildItem $args[$i] -Filter *.txt -Recurse |  where-object {-not ($_.PSIsContainer)}
                    if ($list -ne $null)
                    {
                        $script:totalList += $list
                                            
                    }
                                     
            
              }
         }
     }
    else
    {
       "Use como parametros as pasta de Origem. Ex: copiaTXT.ps1 C:\Users\User1\Documents"
       ""
       ""
       exit
    }
    
    if ($script:totalList.Count -eq 0)
    {
        ""
        ""
        Write-Host -ForegroundColor Red "      Não encontrado arquivos .txt"
        ""
        ""
    }
    else
    {
        ""
        ""
        Write-Host -ForegroundColor Green "        Encontrado(s) $($script:totalList.Length) arquivos .txt"
        ""
        Write-Host "           Copiando para $pastaDestino ..."
        ""
        ""
        if (!(Test-Path $pastaDestino))
        {
            md $pastaDestino -force | out-null
        }
        $numCopia = 1    
        foreach ($file in $script:totalList) 
        { 
            if (Test-Path (Join-Path $pastaDestino $file.name))
            {
                $nomeDaCopia = [System.IO.Path]::GetFileNameWithoutExtension($file.name) + " Copia($numCopia).txt" 
                Copy-Item $file.fullname $pastaDestino$nomeDaCopia -Force 
                $numCopia++
            }
            else
            {
                Copy-Item $file.fullname $pastaDestino -Force
            }
        }  
     }
     

    sábado, 1 de abril de 2017 21:56
  • Copy-Path .\*.ps1 -Destination "C:\Users\userAccount\OneDrive - Bllc\Backup-ps1"

    .\*.ps1  (Define um filtro pra copiar apenas arquivos com aquela extensão definida, que no caso eu defini como ps1).

    -Destination - Destino pra onde vai os arquivos a serem copiados ou movidos.

    Morreu aqui. 

    Essa linha de comando também serve pra Mover, seguindo a mesma ordem. Se quiser mover outras extensões é só mudar o nome da extensão, como ps1 ,troque pra jpg e afins. Espero ter ajudado.

    Jogue esse script dentro de uma pasta, lembrando de trocar a extensão.

    Você pode coloca lo dentro de outras pastas ,e só usar o Invoce- Expression pra que o primeiro execute os outros iguais ,e faça tudo sozinho.

    Espero ter ajudado. =D


    Obs: Se as pastas estiverem dentro da pasta Documentos, é só rodar o script dentro da pasta documentos e definir nele o local onde vai entregar as copias.

    quarta-feira, 5 de abril de 2017 20:05
  • Amigo

    Espero que depois de tanto tempo você tenha conseguido resolver seu problema. Seguindo a mesma dúvida que você ví que ninguem respondeu o que queria, pessoal só quer ranking de respostas. Mas eu achei na net um ninja que matou.

    Existe um comando chamado For (não sei se funciona em todas as versõe do Windows, eu uso o 10), as sintaxes são muito difíceis de entender no ajuda /?, mas o cara (tentei achar para dar os créditos) deu a sintaxe e explicou como segue:

    For /r "D:\Origem" %d in (*.xml) do copy "%d" "D:\Destino"

    Esse comando como está ai em cima o For analisará a origem em tudo que é subdiretório de D:\Origem os arquivos .xml e vai copiar para um único diretório na pasta em D:\Destino.

    Aí veio a segunda treta, quando eu criava e rodava em um .bat não funcionava, então o ninja explicou que se for usar em um bat, tem que dobrar o % e fica como segue:

    For /r "D:\XML ServiceCorp" %%d in (*.xml) do copy "%%d" "D:\xxml" 

    Espero ajudar muitas pessoas com essa resposta, afinal fóruns servem para isso. O conhecimento precisa ser compartilhado para fazer um mundo melhor.

    Eu perdi mais de 3 horas em pesquisas e caí em mais de 30 paginas com certeza com gente respondendo robocopy ( que eu domino e é otimo para backups ) ou xcopy, mas ambos vão copiar a estrutura de diretórios também, que é o que eu não queria e é o que vc também não quer.

    Abraço a todos, lembrando que sou apenas um usuário curioso, sou contador e precisava ajudar um cliente a salvar todos os xml de notas dele.

    sábado, 7 de março de 2020 01:13
  • Boa @Heliton Costa,

    O único problema que eu vejo nisso é se existirem arquivos com nomes iguais na origem. Por exemplo:

    Origem\Pasta01\MeuArquivo.txt
    Origem\Pasta02\MeuArquivo.txt
    Origem\Pasta03\MeuArquivo.txt

    Como podem existir arquivos com nomes iguais em pastas diferentes mais não podem existir arquivos com nomes iguais na mesma pasta isso ou causaria um erro ou alguns arquivos com nomes iguais seriam sobre escritos se você usar copy /y por exemplo.

    No caso teria que fazer um esquema para renomear arquivos com nomes iguais:

    @echo off
    chcp 1252> Nul
    
    set Origem=%userprofile%\desktop\Origem
    set Destino=%userprofile%\desktop\Destino
    set Tipo=.txt
    
    for /r %Origem% %%a in (*%Tipo%) do (
    if /i exist "%Destino%\%%~nxa" (
    set "Arquivo=%%~na"
    set "Extencao=%%~xa"
    set "Completo=%%a"
    call :Renomear
    )
    if /i not exist "%Destino%\%%~nxa" copy "%%a" "%Destino%"
    )
    
    exit
    
    :Renomear
    for /l %%b in (1,1,100) do if /i not exist "%Destino%\%Arquivo%(%%b)%Extencao%" copy "%Completo%" "%Destino%\%Arquivo%(%%b)%Extencao%"& goto :EOF
    goto :EOF
    
    
    
    

    O resultado ficaria algo assim:


    R. Bohner

    sábado, 7 de março de 2020 11:20