我试图通过目录递归并将其从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校验是否真的是这样做的正确方法.
有没有人有任何见解?
这两个都是PowerShell的可靠答案,但是利用Robocopy(MS提供的强大复制应用程序)可能要容易得多.
robocopy "C:\SourceDir\" "C:\DestDir\" /MIR
会完成同样的事情.
以下是一些指导如何使脚本更易于维护的指南.
将原始脚本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(...) }