当前位置:  开发笔记 > 编程语言 > 正文

Powershell Copy-Item但仅复制更改的文件

如何解决《PowershellCopy-Item但仅复制更改的文件》经验,为你挑选了2个好方法。

我试图通过目录递归并将其从A复制到B.可以通过以下方式完成:

Copy-Item C:\MyTest C:\MyTest2 –recurse

我希望能够只复制新文件(存在于src但不存在于dest中的文件),并且只复制基于CRC校验而不是日期时间戳的可能已更改的文件.

$file = "c:\scripts"
param
(
$file
)

$algo = [System.Security.Cryptography.HashAlgorithm]::Create("MD5")
$stream = New-Object System.IO.FileStream($file, [System.IO.FileMode]::Open)

$md5StringBuilder = New-Object System.Text.StringBuilder
$algo.ComputeHash($stream) | `
% { [void] $md5StringBuilder.Append($_.ToString("x2")) }
$md5StringBuilder.ToString()

$stream.Dispose() 

这段代码给了我一个特定文件的CRC校验...我只是不确定如何把两个脚本放在一起真正给我我需要的东西.我也不知道上面的CRC校验是否真的是这样做的正确方法.

有没有人有任何见解?



1> Bobby B..:

这两个都是PowerShell的可靠答案,但是利用Robocopy(MS提供的强大复制应用程序)可能要容易得多.

robocopy "C:\SourceDir\" "C:\DestDir\" /MIR

会完成同样的事情.


据我所知,robocopy不会比较内容.它依赖于尺寸和日期戳.

2> dance2die..:

以下是一些指导如何使脚本更易于维护的指南.

将原始脚本Conver作为过滤器.

filter HasChanged { 
    param($file)

    # if $file's MD5 has does not exist
    # then return $_
}

然后只需过滤所有更新的文件并复制它们.

# Note that "Copy-Item" here does not preserve original directory structure
# Every updated file gets copied right under "C:\MyTest2"
ls C:\MyTest -Recurse | HasChanged | Copy-Item -Path {$_} C:\MyTest2

或者您可以创建另一个生成子目录的函数

ls C:\MyTest -Recurse | HasChanged | % { Copy-Item $_ GenerateSubDirectory(...) }

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有