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

时间:2016-11-10 23:32:40

标签: powershell xcopy get-childitem copy-item

所以我一整天都在跳这个舞蹈,永恒的短语“不止一种方法让猫皮肤”不断浮现在脑海中,所以我决定带上社区。

情景:

源文件夹“C:\ Updates”有100个不同扩展名的文件。所有这些都需要复制到“C:\ Prod \” 子文件夹 ,覆盖它可能找到的任何重复项。

注意事项:

  1. “C:\ Prod”中的子文件夹名称(目的地)非常动态且频繁更改。

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

  3. 所以,在这里,如果我很幸运的话,我想要输入比我更大的人来解决这个问题。我今天使用了Copy-Item和xcopy进行了修改,所以我很高兴听到其他人的意见。

    谢谢!

    -Chris

2 个答案:

答案 0 :(得分:1)

试一试:

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

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

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

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

答案 1 :(得分:0)

要仅选择不以“!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复制到Source的子节点,而不是以“!stop”开头-whatif开关显示会发生什么,为脚本删除-whatif。

Edit2 简化了脚本。如果C:\ Prod的子/子文件夹也应该收到副本,包括在他管道前面的gci的-rec选项。