Robocopy 中的 Get-ChildItem 未按预期工作

Robocopy 中的 Get-ChildItem 未按预期工作

我想找到其中的所有 .jpg 文件D:\ZZZ_Phone_test及其子目录,然后使用 Robocopy 将它们复制到其中D:\ZZZ_Phone_test\1\1\BackUp\(需要排除,因为它在源内)

如果可能的话,我更愿意使用 Robocopy,而不是编写更复杂的脚本。我计划使用 Robocopy 日志记录和其他选项。如果 Robocopy 不适用,请提供解释和您想到的任何内容的来源。

这不起作用:

Get-ChildItem -recurse D:\ZZZ_Phone_test -Exclude D:\ZZZ_Phone_test\1\1\BackUp -filter *.jpg | ForEach-Object {
  robocopy "D:\ZZZ_Phone_test\$_" "D:\ZZZ_Phone_test\1\1\BackUp\$_" /z /s /v
}

答案1

不太熟悉Robocopy,但看看帮助,我认为这对你有用:

$Source = 'D:\ZZZ_Phone_test'
$Backup = 'D:\ZZZ_Phone_test\1\1\BackUp'
Get-ChildItem $Source -Directory -Recurse | ? FullName -ne $Backup | ForEach{
    robocopy $_.FullName $Backup *.jpg /z /v
}

因为Get-ChildItem返回的是文件夹集合,所以我删除了/s参数。

如果只有一个文件夹Backup,并且您希望以代码而不是变量的形式使用路径,则应该这样做:

Get-ChildItem D:\ZZZ_Phone_test -Directory -Recurse | ? Name -ne 'Backup' | ForEach{
    robocopy $_.FullName D:\ZZZ_Phone_test\1\1\BackUp *.jpg /z /v
}

使用电源外壳别名,可以缩写为:

gci D:\ZZZ_Phone_test -ad -r | ? Name -ne 'Backup' | %{
    robocopy $_.FullName D:\ZZZ_Phone_test\1\1\BackUp *.jpg /z /v
}

答案2

尝试这个:

Get-ChildItem "D:\ZZZ_Phone_Test" -Exclude "D:\ZZZ_Phone_test\1\1\BackUp" | 
  Get-ChildItem -Recurse -Filter *.jpg |
    Foreach {
      robocopy $_.fullName "D:\ZZZ_Phone_test\1\1\BackUp" /z /b
    }

不需要 /z 开关,因为不需要复制子目录。

相关内容