powershell二进制文件比较

时间:2013-11-14 23:47:31

标签: powershell powershell-v2.0

全部, 有一个应用程序生成它的导出转储。我需要编写一个脚本,将前一天的转储与最新的转换进行比较,如果它们之间存在差异,我必须对移动和删除类型的东西进行一些基本的操作。 我试过找到一个合适的方法,我尝试的方法是: $var_com=diff (get-content D:\local\prodexport2 -encoding Byte) (get-content D:\local\prodexport2 -encoding Byte) 我也尝试了Compare-Object cmdlet。我注意到内存使用率非常高,最终我在几分钟后收到消息System.OutOfMemoryException。你有一个人做了一些similer吗?请一些想法。 有一个线程提到了一个比较,我不知道如何去做。 在此先感谢大家 OSP

5 个答案:

答案 0 :(得分:15)

使用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
}

答案 1 :(得分:10)

您可以使用fc.exe。它配备了Windows。以下是您将如何使用它:

fc.exe /b d:\local\prodexport2 d:\local\prodexport1 > $null
if (!$?) {
    "The files are different"
}

答案 2 :(得分:7)

另一种方法是比较文件的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'}

答案 3 :(得分:6)

PowerShell的while back I wrote逐字节比较例程:

function FilesAreEqual
{
   param([System.IO.FileInfo] $first, [System.IO.FileInfo] $second) 
   $BYTES_TO_READ = 32768;

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

   $iterations = [Math]::Ceiling($first.Length / $BYTES_TO_READ);
   $fs1 = $first.OpenRead();
   $fs2 = $second.OpenRead();

   $one = New-Object byte[] $BYTES_TO_READ;
   $two = New-Object byte[] $BYTES_TO_READ;

   for ($i = 0; $i -lt $iterations; $i = $i + 1)
   {
       $fs1.Read($one, 0, $BYTES_TO_READ) | out-null;
       $fs2.Read($two, 0, $BYTES_TO_READ) | out-null;

       if ([BitConverter]::ToInt64($one, 0) -ne 
           [BitConverter]::ToInt64($two, 0))
       {
           $fs1.Close();
           $fs2.Close();
           return $false;
       }
   }

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

   return $true;
}

您可以通过以下方式使用它:

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

哈希(如MD5)需要遍历整个文件才能进行哈希计算。该脚本会在看到差异时立即返回。它也进行了比较而没有计算,所以它应该减少对系统的压力。

答案 4 :(得分:0)

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"
}