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.