2017-01-26 12 views
0

MD5ハッシュに基づいて比較する比較スクリプトがあります。それは奇妙なことをしていることに気づいた。ディレクトリとサブディレクトリを比較し、MD5ハッシュに基づいてファイルを置き換えます。

$Source= "D:\Folder1" 
$Destination = "D:\folder2" 

get-childitem $Source -Recurse | foreach { 
#Calculate hash using Algorithm MD5 reference http://www.tomsitpro.com/articles/powershell-file-hash-check,2-880.html 
Write-Host "Copying $($_.fullname) to $Destination" -ForegroundColor Yellow 
$OriginalHash = Get-FileHash -Path $_.FullName -Algorithm MD5 

#Now copy what's different 
$replacedfile = $_ | Copy-Item -Destination $Destination -Force -PassThru 

#Check the hash sum of the file copied 
$copyHash = Get-FileHash -Path $replacedfile.FullName -Algorithm MD5 

#compare them up 
if ($OriginalHash.hash -ne $copyHash.hash) { 
    Write-Warning "$($_.Fullname) and $($replacedfile.fullname) Files don't match!" 
} 
else { 
    Write-Host "$($_.Fullname) and $($replacedfile.fullname) Files Match" -ForegroundColor Green 
} 
} #Win! 

サブフォルダに違いがあるまで、スクリプトは正常に動作します。それで何らかの理由で私が見つけられないように見えますが、それはトップレベルとサブレベルの両方に別のアイテムをコピーします.....私は本当にダムになっていますし、問題を見ることができず、目の

File Test.Txt is in Source\SubFolder 

スクリプトの任意のアイデアを実行し、デスティネーション\サブフォルダと目的地であるtest.txtを置く.....

+0

サブディレクトリ差分ツールを書き換えしようとしているのはなぜ?すでに存在するものだけを使用してください。 –

+0

明らかにそうする必要がある、または私はこれをやっていないでしょう。私は問題に無関係であるので詳細には進まない。私の言葉を借りて、私はそれをこのようにする必要があります。 –

+0

'Copy-Item'コマンドで' -Recurse'を有効にしていませんか?私があなたの出力を再現できる唯一の方法は、ファイルを再帰的にコピーしたときでした。 – FoxDeploy

答えて

1

$replacedfile = $_ |という行は、ここでは$ _はサブディレクトリのない名前のみを含み、$ Destinationにコピーされます。

$replacedfile = $_ | Copy-Item -Destination $Destination -Force -PassThru 

行を置き換え

$replacedfile = $_.Fullname -replace [RegEx]::escape($Source),$Destination 

これは、完全なサブディレクトリ海流ソースを残し異なるベース部分を置き換えます。 ソース文字列に置換機能によってエスケープ文字として解釈される
バックスラッシュが含まれているため、[RegEx] :: escape($ Source)が必要です。

EDITあいまいさを避けるために完全なスクリプト:

$Source= "D:\Folder1" 
$Destination = "D:\folder2" 

get-childitem $Source -Recurse | foreach { 
    #Calculate hash using Algorithm MD5 reference http://www.tomsitpro.com/articles/powershell-file-hash-check,2-880.html 
    $SrcFile = $_.FullName 
    $SrcHash = Get-FileHash -Path $SrcFile -Algorithm MD5 

    $DestFile = $_.Fullname -replace [RegEx]::escape($Source),$Destination 
    Write-Host "Copying $SrcFile to $DestFile" -ForegroundColor Yellow 

    if (Test-Path $DestFile) { 
     #Check the hash sum of the file copied 
     $DestHash = Get-FileHash -Path $DestFile -Algorithm MD5 

     #compare them up 
     if ($SrcHash.hash -ne $DestHash.hash) { 
      Write-Warning "$SrcFile and $DestFile Files don't match!" 
      Copy-Item $SrcFile -Destination $DestFile -Force 
     } else { 
      Write-Host "$SrcFile and $DestFile Files Match" -ForegroundColor Green 
     } 
    } else { 
     Copy-Item $SrcFile -Destination $DestFile -Force 
    } 
} 
+0

私は論理を参照してください、しかし、これはスクリプトを壊す。 Get-FileHash:引数がnullであるため、パラメータ 'Path'に引数をバインドできません。 行:15文字:33 + $ copyHash = Get-FileHash -Path $ replacedfile。フルネーム - アルゴリズムMD5 + ~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:InvalidData:(:)、ParameterBindingValidationException + FullyQualifiedErrorId [-ファイルハッシュ取得]:ParameterArgumentValidationErrorNullNotAllowedを、 Get-FileHash ' –

+0

@RichardDakin $ replacedfileはオブジェクトではない文字列だったので、lateron参照は '.Fullname'を省略しなければなりません。上記のスクリプトを書き直してください。 – LotPings

+0

申し訳ありませんが、返事が遅れました。上記のスクリプトにも誤字があります。交換は-replaceにする必要があります。しかし、これは問題を解決するようです。ありがとうございました。 –

関連する問題