如果项目尚不存在,则将项目从源复制到目标

use*_*820 5 powershell

我有一个非常基本的PowerShell复制脚本,可以将项目从源文件夹复制到目标文件夹.但是这会移动太多的数据,我想检查文件名是否已经存在,以便可以忽略该文件.我不需要像验证创建日期/校验和/等那样复杂.

目前它的行列如下:

Copy-Item source destination -recurse
Copy-Item source2 destination2 -recurse
Run Code Online (Sandbox Code Playgroud)

我想我需要添加Test-Path cmdlet,但我不确定如何实现它.

Ric*_*ard 13

你可以随时打电话ROBOCOPYPowerShell.

使用/ xc(排除已更改)/ xn(排除更新)和/ xo(排除更旧)标志:

robocopy /xc /xn /xo source destination 
Run Code Online (Sandbox Code Playgroud)

这将只复制那些不在目标文件夹中的文件.

有关更多选项类型 robocopy /?


nic*_*bot 7

以 Wai Ha Lee 的帖子为基础,这里有一个对我有用的例子:

$Source = "<your path here>"
$Dest = "<your path here>"
$Exclude = Get-ChildItem -recurse $Dest

Get-ChildItem $Source -Recurse -Filter "*.pdf" | Copy-Item -Destination $Dest -Verbose -Exclude $Exclude
Run Code Online (Sandbox Code Playgroud)

这会构建一个要排除的列表,然后将源目录和子目录中的所有 pdf 复制到单个文件夹中的目标...不包括现有文件。再说一遍,这是我的需求示例,但与您的需求类似。应该很容易调整到您满意的程度。


小智 6

虽然我同意这Robocopy是解决此类问题的最佳工具,但我完全赞成为客户提供他们所要求的东西,这是一个有趣的 PowerShell 练习。

此脚本应该按照您的要求执行:仅当文件在目标中不存在时才将文件从源复制到目标,并且具有最少的装饰。由于您在示例中使用了 -recurse 选项,因此编码比仅测试 Destination 文件夹中的文件名要多一些。

$Source = "C:\SourceFolder"
$Destination = "C:\DestinationFolder"

Get-ChildItem $Source -Recurse | ForEach {
    $ModifiedDestination = $($_.FullName).Replace("$Source","$Destination")
    If ((Test-Path $ModifiedDestination) -eq $False) {
        Copy-Item $_.FullName $ModifiedDestination
        }
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

$exclude = Get-ChildItem -recurse $dest
Copy-Item -Recurse $file $dest -Verbose -Exclude $exclude
Run Code Online (Sandbox Code Playgroud)

  • 通常我会同意,但这里的代码和变量名称非常不言自明且简洁。 (3认同)
  • 最好在代码中包含一些上下文/解释,因为这会使答案对于OP和将来的读者更加有用。 (2认同)