pesquisa e copia arquivos de uma estrutura de diretórios lendo um arquivo de texto

1

Eu tenho uma pasta com muitas subpastas e arquivos nelas. Eu tenho um arquivo de texto com os nomes dos arquivos que eu quero copiar para uma pasta de destino separada. Os nomes de arquivos no arquivo de texto não possuem informações de caminho.

Na pasta de destino, quero que o arquivo e sua estrutura de pastas sejam recriados. Existe um roteiro rápido para isso? ou uma ferramenta? Eu estou no Windows.

    
por Regmi 28.06.2018 / 07:37

1 resposta

2

O seguinte script do PowerShell deve fazer o que você deseja.

Altere as três primeiras variáveis para se adequarem ao seu ambiente.

## Q:\Test18\SU_1334840.ps1
#Requires -Version 3

# get files to copy from file in same foler
$FileList = Get-Content '.\FileList.txt'
$BaseSrc = 'X:\Source\path\'
$BaseDst = 'Y:\Destination\path\'

ForEach ($File in $FileList){
   ForEach ($Find in (Get-ChildItem $BaseSrc$File -File -Recurse)) {
       $DestFile = Join-Path $BaseDst ($Find.FullName.Replace($BaseSrc,'') )
       $DestDir = Split-Path $DestFile
       If (!(Test-Path $DestDir)){ MD $DestDir |Out-Null}
       # "Copying {0} to {1}" -f $Find.FullName,$DestFile
       Copy-Item $Find.FullName $DestFile
    }
}

Para ver o que está acontecendo enquanto o script funciona, remova o # antes de "Copying...

O script requer pelo menos a versão 3 do PowerShell

Dependendo do tamanho da sua lista / do número de arquivos e subdiretórios na sua árvore de origem, essa abordagem um pouco diferente pode ser mais rápida.

## Q:\Test18\SU_1334840_2.ps1
#Requires -Version 3

# get files to copy from file in same foler
$FileList = Get-Content '.\FileList.txt'
$BaseSrc = 'X:\Source\path\'
$BaseDst = 'Y:\Destination\path\'

ForEach ($File in (Get-ChildItem $BaseSrc -File -Recurse)) {
    If ($File.Name -in $FileList) {
       $DestFile = Join-Path $BaseDst ($File.FullName.Replace($BaseSrc,'') )
       $DestDir = Split-Path $DestFile
       If (!(Test-Path $DestDir)){ MD $DestDir |Out-Null}
       "Copying {0} to {1}" -f $File.FullName,$DestFile
       Copy-Item $File.FullName $DestFile
    }
}

Exemplo de saída:

> . Q:\Test18\SU_1334840.ps1
Copying C:\sysz.dll to A:\Test\sysz.dll
Copying C:\sysz.exe to A:\Test\sysz.exe
Copying C:\sys\ClipBoard.exe to A:\Test\sys\ClipBoard.exe
Copying C:\sys\ClipBoard.txt to A:\Test\sys\ClipBoard.txt
Copying C:\sys\DUMPHEX.EXE to A:\Test\sys\DUMPHEX.EXE
    
por 28.06.2018 / 10:27