PowerShell 将文件复制到目标的子文件夹,同时排除目标中的某些文件夹

PowerShell to copy files to destination's subfolders while excluding certain folders in the destination

所以我一整天都在不停地跳舞,永恒的短语 "There's more than one way to skin a cat" 一直在脑海中浮现,所以我决定加入社区。

场景:

源文件夹"C:\Updates"有100个不同扩展名的文件。全部需要复制到"C:\Prod\"子文件夹覆盖任何重复项它可能会找到。

注意事项:

  1. "C:\Prod"中的子文件夹名称(目的地)非常动态并且经常更改。

  2. 命名约定用于确定在复制源文件时需要排除目标中的哪些子文件夹(以保留原始版本)。为了便于解释,假设任何以“!stop”开头的文件夹名称都应从复制过程中排除。 (!停止*如果考虑通配符)

所以,如果我幸运的话,我希望在 PS 中得到那些比我更伟大的人的意见来解决这个问题。我今天修改了 Copy-Item 和 xcopy,所以我很高兴听到其他人的意见。

谢谢!

-克里斯

试一试:

Get-ChildItem -Path C:\Prod -Exclude !stop* -Directory `
| ForEach-Object { Copy-Item -Path C:\Updates\* -Destination $_ -Force }

这将抓取 C:\Prod 中与过滤器不匹配的每个文件夹(-Directory 开关确保我们只抓取文件夹)并将其通过管道传输到我们所在的 ForEach-Object 命令 运行 Copy-Item命令将文件复制到目录。

-Directory 开关并非在每个版本的 PowerShell 中都可用;我不知道它是在我脑海中引入的哪个版本。如果您有不支持 -Directory 的旧版本 PowerShell,那么您可以使用此脚本:

Get-ChildItem -Path C:\Prod -Exclude !stop* `
| Where-Object { $_.PSIsContainer } `
| ForEach-Object { Copy-Item -Path C:\Updates\* -Destination $_ -Force }

仅对 select 不以“!stop”开头的子文件夹执行此操作

$Source = "C:\Updates\*"
$Dest =   "C:\Prod"
$Stop =   "^!stop"

$Destinations = GCI -Path $Dest |?{$_.PSIsContainer -and $_.Name -notmatch $Stop }
ForEach ($Destination in $Destinations) {
  Copy-Item -Path $Source -Destination $Destination.FullName -Force 
}

已编辑 现在将所有文件从 Update 复制到不以“!stop”开头的 Source 的 subs -whatif 开关显示会发生什么,以武装脚本删除 -whatif .

Edit2 简化了脚本。如果 C:\Prod 的 Sub/sub-folders 也应接收副本,则在管道前面的 gci 中包含一个 -rec 选项。