Get-ChildItemпозволяет перечислять файлы и каталоги, в том числе рекурсивно с фильтрами имен файлов. Copy-Itemпозволяет скопировать файл.
Существует много совпадений с точки зрения выбора файлов, часто само Copy-Itemпо себе достаточно в зависимости от деталей того, что вам нужно (например, хотите ли вы сохранить структуру папок?)
Чтобы скопировать все *.fooи *.barиз StartFolder в DestFolder:
Copy-Item -path "StartFolder" -include "*.foo","*.bar" -Destination "DestFolder"
Если вам нужно сохранить структуру папок, все становится сложнее, потому что вам нужно создать имя папки назначения, что-то вроде:
$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
}
Но robocopyскорее всего будет проще
robocopy StartFolder DestFolder *.foo *.bar /s
В конце концов, способ выбора будет зависеть от деталей того, что нужно.
(Выше я избегал псевдонимов (например, Copy-Itemвместо copy) и явно использовал имена параметров, даже если они позиционные.)