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