Get-ChildItempermite listar arquivos e diretórios, inclusive recursivamente com filtros de nome de arquivo. Copy-Itempermite copiar um arquivo.
Há muita sobreposição em termos de seleção dos arquivos, muitas vezes Copy-Itempor si só é suficiente, dependendo dos detalhes do que você precisa (por exemplo, deseja manter a estrutura da pasta?)
Para copiar tudo *.fooe *.bardo StartFolder para o DestFolder:
Copy-Item -path "StartFolder" -include "*.foo","*.bar" -Destination "DestFolder"
Se você precisar preservar a estrutura da pasta, as coisas ficarão mais difíceis porque você precisará criar o nome da pasta de destino, algo como:
$sourcePath = 'C:\StartFolder'
$destPath = 'C:\DestFolder'
Get-ChildItem $sourcePath -Recurse -Include '*.foo', '*.bar' | Foreach-Object `
{
$destDir = Split-Path ($_.FullName -Replace [regex]::Escape($sourcePath), $destPath)
if (!(Test-Path $destDir))
{
New-Item -ItemType directory $destDir | Out-Null
}
Copy-Item $_ -Destination $destDir
}
Mas robocopyé provável que seja mais fácil:
robocopy StartFolder DestFolder *.foo *.bar /s
No final, a maneira de escolher dependerá dos detalhes do que é necessário.
(No exemplo acima, evitei aliases (por exemplo, em Copy-Itemvez de copy) e usei explicitamente nomes de parâmetros, mesmo que sejam posicionais.)