0

所以我一整天都在跳舞,而永恒的短语“给猫剥皮的方法不止一种”,所以我决定去社区。

设想:

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

注意事项:

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

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

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

谢谢!

-克里斯

4

2 回答 2

2

试一试:

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

-Directory这会抓取C:\Prod 中与过滤器不匹配的每个文件夹(开关确保我们只抓取文件夹),并将其通过管道传送到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 }
于 2016-11-11T00:41:45.323 回答
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 
}

Edited Now 将所有文件从 Update 复制到 Source 的 subs 中,不以“!stop”开头 -whatif 开关显示会发生什么,以武装脚本删除 -whatif。

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

于 2016-11-11T00:50:53.663 回答