总而言之,有一个应用程序可以生成它的导出转储。我需要编写一个脚本,将前几天的转储与最新的转储进行比较,如果它们之间存在差异,我必须进行一些基本的移动和删除操作。我尝试找到一种合适的方法,我尝试的方法是:
$var_com=diff (get-content D:\local\prodexport2 -encoding Byte) (get-content D:\local\prodexport2 -encoding Byte)
我也尝试了 Compare-Object cmdlet。我注意到内存使用率非常高,最终我System.OutOfMemoryException
在几分钟后收到一条消息。你们中有人做过类似的事情吗?请有一些想法。有一个线程提到了一个比较,我不知道如何去做。在此先感谢各位Osp
问问题
20026 次
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:> 比较文件 .\20131104.csv .\20131104-copy.csv
文件匹配
PS C:> 比较文件 .\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
不久前,我写了一篇关于缓冲比较例程的文章,用 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 回答
2
if ( (Get-FileHash c:\testfiles\testfile1.txt).Hash -eq (Get-FileHash c:\testfiles\testfile2.txt).Hash ) {
Write-Output "Files match"
} else {
Write-Output "Files do not match"
}
于 2020-01-31T08:32:36.497 回答