29

ディレクトリを再帰的に 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 チェックが行われます...2 つのスクリプトを組み合わせて、本当に必要なものを提供する方法がわかりません。また、上記の CRC チェックが実際にこれを行う正しい方法であるかどうかもわかりません。

誰にも洞察力がありますか?

4

4 に答える 4

37

どちらもPowerShellの確かな答えですが、 Robocopy(MSが提供する堅牢なコピーアプリケーション)を活用する方がはるかに簡単です。

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

同じことを成し遂げるでしょう。

于 2011-03-25T13:32:24.287 に答える
10

スクリプトをより保守しやすくするためのガイドラインを次に示します。

元のスクリプトをフィルターとして変換します。

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(...) }
于 2009-03-24T16:18:46.597 に答える