copie 100 novos arquivos de um diretório e substitua cada arquivo pelos arquivos antigos em sua localização atual

1

Eu tenho 100 arquivos em um diretório. Estes são novos arquivos que precisam substituir arquivos antigos que estão localizados em muitos subdiretórios. O que eu acho que deve ser feito é: procure um arquivo de cada vez e, em seguida, substitua-o. Até agora eu encontrei uma maneira de encontrar os arquivos nos diretórios, mas não consigo usar cada nome de arquivo para substituí-lo com o novo.

$files = @(Get-ChildItem D:\topLevelDir\*.txt)
foreach ($file in $files) { gci -Path C:\Users\MyUserName\ -filter $file.Name -Recurse -ErrorAction SilentlyContinue -Force}

Eu pensei que seria uma tarefa simples, mas eu estou lutando um pouco. O que posso fazer para usar a lista e substituir cada arquivo? Como posso usar o comando Where-object para usar cada nome de arquivo e substituir o novo arquivo pelo antigo?

    
por eliko 23.08.2017 / 22:09

1 resposta

0

Where-Object é ótimo para receber uma lista de objetos e vasculhá-los com base em alguma condição. Use $_ para interagir com cada objeto que você alimenta um de cada vez.

$newFiles = "C:\Users\username\new"
$oldFiles = "C:\Users\username\originals"

Get-ChildItem $newFiles | ForEach-Object {

    $currentFile = $_

    $oldFileLocation = Get-ChildItem -Recurse $oldFiles | Where-Object { $_ -Match "$currentFile"} | Select-Object -ExpandProperty DirectoryName

    if($oldFileLocation) {   # if this variable is not null, we've found original file location
        Write-Host "found file [$currentFile] in location: [$oldFileLocation]. overwriting the original."
        Copy-Item -Path $newFiles\$currentFile -Destination $oldFileLocation -Force
    }
    else {
        Write-Warning "could not find file [$currentFile] in location [$oldFiles]."
    }

}

Se usado com os seguintes arquivos de teste:

C:\Users\username\new\
-file1.txt
-file2.txt
-file3.txt
-file4.txt

C:\Users\username\originals\
-foldera\file2.txt
-folderb\foo\file3.txt
-folderc\file1.txt

Os resultados são:

found file [file1.txt] in location: [C:\Users\username\originals\folderc]. overwriting the original.
found file [file2.txt] in location: [C:\Users\username\originals\foldera]. overwriting the original.
found file [file3.txt] in location: [C:\Users\username\originals\folderb\foo]. overwriting the original.
WARNING: could not find file [file4.txt] in location [C:\Users\username\originals].

Dependendo do cenário específico ao qual você o aplica, talvez você queira adicionar verificações para manipular um arquivo encontrado em mais de um subdiretório.

    
por 24.08.2017 / 14:50

Tags