【问题标题】:PowerShell to copy files to destination's subfolders while excluding certain folders in the destinationPowerShell 将文件复制到目标的子文件夹,同时排除目标中的某些文件夹
【发布时间】:2016-11-10 23:32:40
【问题描述】:

所以我一整天都在跳舞,并且不断地想到“给猫剥皮的方法不止一种”这句永恒的短语,所以我决定去社区。​​p>

场景:

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

注意事项:

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

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

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

谢谢!

-克里斯

【问题讨论】:

    标签: powershell xcopy get-childitem copy-item


    【解决方案1】:

    试一试:

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

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

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

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

    【讨论】:

    • 明白了!我对 -Destination 开关一无所知,果然我在我的 Windows 10 虚拟机上打开了 ISE,然后 BOOM 就在那里。非常感谢您的意见。
    • 来自Get-ChildItem for FileSystem:“属性、目录、文件、隐藏、只读和系统参数是在 Windows PowerShell 3.0 中引入的,仅在文件系统驱动器中有效。”
    【解决方案2】:

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

    【讨论】:

    • 嗨 LotPings,您的第一 2 行代码按预期工作,但您的最后一行 ForEach ($Destination in $Destionations) { "do copy/compare" } 离开了我有点失落。非常感谢您的意见,并想请您修改此内容,以便我给予您应有的发帖!
    • 它们仅用作您自己提供的代码的占位符。您的场景在这方面有点不清楚。仅在存在旧版本时才复制文件,还是复制所有文件。括号中的句子本身就是矛盾的。所以我选择专注于主要部分。
    • @CharlieEcho Editt 复制所有文件的答案
    • 是的!你的输入非常好。这完美地工作。对于不清楚并已更新问题,我深表歉意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多