9

すべて、エクスポート ダンプを生成するアプリケーションがあります。前日のダンプと最新のダンプを比較するスクリプトを作成する必要があります。それらの間に違いがある場合は、移動や削除などの基本的な操作を行う必要があります。私はそれを行う適切な方法を見つけようとしましたが、私が試した方法は次 のとおり$var_com=diff (get-content D:\local\prodexport2 -encoding Byte) (get-content D:\local\prodexport2 -encoding Byte) です。 Compare-Object コマンドレットも試しました。メモリ使用量が非常に多いことに気付き、最終的System.OutOfMemoryExceptionに数分後にメッセージが表示されます。あなたの一人は似たようなことをしましたか?. いくつかの考えをお願いします。比較について言及したスレッドがありましたが、どうすればよいかわかりません。Ospの皆様、よろしくお願いします

4

5 に答える 5

22

PowerShell 4 では、ネイティブ コマンドレットを使用してこれを行うことができます。

function CompareFiles {
    param(
    [string]$Filepath1,
    [string]$Filepath2
    )
    if ((Get-FileHash $Filepath1).Hash -eq (Get-FileHash $Filepath2).Hash) {
        Write-Host 'Files Match' -ForegroundColor Green
    } else {
        Write-Host 'Files do not match' -ForegroundColor Red
    }
}

PS C:> CompareFiles .\20131104.csv .\20131104-copy.csv

ファイルの一致

PS C:> CompareFiles .\20131104.csv .\20131107.csv

ファイルが一致しません

これをプログラムで大規模に使用する場合は、上記の関数を簡単に変更して $true または $false 値を返すことができます。


編集

この回答を見た後、単にtrueまたはfalseを返す大規模なバージョンを提供したかっただけです:

function CompareFiles 
{
    param
    (
        [parameter(
            Mandatory = $true,
            HelpMessage = "Specifies the 1st file to compare. Make sure it's an absolute path with the file name and its extension."
        )]
        [string]
        $file1,

        [parameter(
            Mandatory = $true,
            HelpMessage = "Specifies the 2nd file to compare. Make sure it's an absolute path with the file name and its extension."
        )]
        [string]
        $file2
    )

    ( Get-FileHash $file1 ).Hash -eq ( Get-FileHash $file2 ).Hash
}
于 2014-07-15T18:08:17.187 に答える
12

fc.exe を使用できます。Windowsに付属しています。使用方法は次のとおりです。

fc.exe /b d:\local\prodexport2 d:\local\prodexport1 > $null
if (!$?) {
    "The files are different"
}
于 2013-11-15T00:28:14.360 に答える
8

別の方法は、ファイルの MD5 ハッシュを比較することです。

$Filepath1 = 'c:\testfiles\testfile.txt'
$Filepath2 = 'c:\testfiles\testfile1.txt'

$hashes = 
foreach ($Filepath in $Filepath1,$Filepath2)
{
 $MD5 = [Security.Cryptography.HashAlgorithm]::Create( "MD5" )
 $stream = ([IO.StreamReader]"$Filepath").BaseStream
 -join ($MD5.ComputeHash($stream) | 
 ForEach { "{0:x2}" -f $_ })
 $stream.Close()
 }

if ($hashes[0] -eq $hashes[1])
  {'Files Match'}
于 2013-11-15T01:19:22.343 に答える
8

しばらく前に、2 つのファイルを PowerShell で比較するためのバッファー比較ルーチンに関する記事を書きました。

function FilesAreEqual {
    param(
        [System.IO.FileInfo] $first,
        [System.IO.FileInfo] $second, 
        [uint32] $bufferSize = 524288) 

    if ($first.Length -ne $second.Length) return $false

    if ( $bufferSize -eq 0 ) $bufferSize = 524288

    $fs1 = $first.OpenRead()
    $fs2 = $second.OpenRead()

    $one = New-Object byte[] $bufferSize
    $two = New-Object byte[] $bufferSize
    $equal = $true

    do {
        $bytesRead = $fs1.Read($one, 0, $bufferSize)
        $fs2.Read($two, 0, $bufferSize) | out-null

        if ( -Not [System.Linq.Enumerable]::SequenceEqual($one, $two)) {
            $equal = $false
        }

    } while ($equal -and $bytesRead -eq $bufferSize)

    $fs1.Close()
    $fs2.Close()

    return $equal
}

次の方法で使用できます。

FilesAreEqual c:\temp\test.html c:\temp\test.html

ハッシュ (MD5 など) は、ハッシュ計算を行うためにファイル全体をトラバースする必要があります。このスクリプトは、バッファに違いがあるとすぐに戻ります。ネイティブの PowerShell よりも高速な LINQ を使用してバッファーを比較します。

于 2014-04-02T02:55:18.520 に答える