繁体   English   中英

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

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

因此,我整天都在不停地跳着舞,而永不过时的一句“给猫剥皮的方法不止一种”,让我决定加入社区。

场景:

源文件夹“ 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中都可用; 我不知道它是哪个版本推出的。 如果您使用的旧版PowerShell不支持-Directory则可以使用以下脚本:

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

要仅选择不以“!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选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM