9

总而言之,有一个应用程序可以生成它的导出转储。我需要编写一个脚本,将前几天的转储与最新的转储进行比较,如果它们之间存在差异,我必须进行一些基本的移动和删除操作。我尝试找到一种合适的方法,我尝试的方法是: $var_com=diff (get-content D:\local\prodexport2 -encoding Byte) (get-content D:\local\prodexport2 -encoding Byte) 我也尝试了 Compare-Object cmdlet。我注意到内存使用率非常高,最终我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:> 比较文件 .\20131104.csv .\20131104-copy.csv

文件匹配

PS C:> 比较文件 .\20131104.csv .\20131107.csv

文件不匹配

如果您想以编程方式大规模使用它,您可以轻松修改上述函数以返回 $true 或 $false 值


编辑

看到这个答案后,我只想提供更大规模的版本,它只返回truefalse

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 回答