所以我一整天都在跳这个舞蹈,永恒的短语“不止一种方法让猫皮肤”不断浮现在脑海中,所以我决定带上社区。 p>
情景:
源文件夹“C:\ Updates”有100个不同扩展名的文件。所有这些都需要复制到“C:\ Prod \”的 子文件夹 ,覆盖它可能找到的任何重复项。
注意事项:
“C:\ Prod”中的子文件夹名称(目的地)非常动态且频繁更改。
命名约定用于确定在复制源文件时需要排除目标中的哪些子文件夹(以保留原始版本)。为了便于说明,可以说任何以“!stop”开头的文件夹名称都应该从复制过程中排除。 (!如果考虑通配符,则停止*)
所以,在这里,如果我很幸运的话,我想要输入比我更大的人来解决这个问题。我今天使用了Copy-Item和xcopy进行了修改,所以我很高兴听到其他人的意见。
谢谢!
-Chris
答案 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选项。