none
POWERSHELLでファイル比較するには(バイナリファイル) RRS feed

  • 質問

  • Powershellで

    compare-object -referenceobject $(get-content C:\WORK.DAT) -differenceobject $(get-content D:\WORK.DAT)

    を実行した際に

    InputObject                                                                                             SideIndicator                                                                                        
    -----------                                                                                             -------------                                                                                        
                                                                                      ... =>                                                                                                   
                                                                                      ... <=                                                            

    となります。

    COMPコマンドで実行すると

    COMP C:\WORK.DAT D:\WORK.DAT

    OFFSET 2838F で比較エラーがあります
    ファイル1 = 4
    ファイル2 = 0
    OFFSET 28390 で比較エラーがあります
    ファイル1 = 94
    ファイル2 = 7

    となります。

    同じファイルを比較していますが、Powershellでは、違いが表示されません。

    何故でしょうか?

    2012年9月4日 2:19

回答

  • こんにちは

    ヘルプには「 このコマンドは、2 つのテキスト ファイルの各行の内容を比較します。」とありますのでテキスト用なのだと思います。

    • 回答としてマーク qoo_man 2012年9月4日 6:22
    2012年9月4日 3:39
  • こんにちは、

    PowerShellコマンドレットではありませんが、標準ではfc.exeなんてのが使えそうです。

    fc ファイル1 ファイル2 /B

    みたいな感じで。

    詳しい比較結果などが欲しければフリーソフトとかですかね。

    • 回答としてマーク qoo_man 2012年9月4日 6:22
    2012年9月4日 5:41
  • これでどうでしょうか

    ハッシュの比較をしています。

    適時改造してください。

    # Compare-BinaryFile
    # Input (string)FilePath1 , (string)FilePath2
    # Output boolen
    # FilePath1とFilePath2のファイルそれぞれのSHAハッシュを算出して比較する

    Function Compare-BinaryFile{
     param(
       [string]$FilePath1 = ''
      ,[string]$FilePath2 = ''
      )

    $SHA = New-Object System.Security.Cryptography.SHA1CryptoServiceProvider
    [Byte[]]$HashValue1 = New-Object byte[] 50
    [Byte[]]$HashValue2 = New-Object byte[] 50

    $OpenMode = New-Object System.IO.FileMode
    $OpenMode.value__ = 3  #Open
    $AccessMode = New-Object System.IO.FileAccess
    $AccessMode.value__ = 1 #Read

    $FS1 = New-Object System.IO.FileStream($FilePath1,$OpenMode,$AccessMode)
    $FS2 = New-Object system.IO.FileStream($FilePath2,$OpenMode,$AccessMode)

    $HashValue1 = $SHA.ComputeHash($FS1)
    $HashValue2 = $SHA.ComputeHash($FS2)

    $OpenMode = $null
    $AccessMode = $null
    $FS1 = $null
    $FS2 = $null
    $ComF = $true

    for($i=0;$i -lt 50;$i++)
    {
     if($HashValue1[$i] -ne $HashValue2[$i]) {$ComF = $false;break}
    }

    $HashValue1 = $null
    $HashValue2 = $null

    return $ComF

    }

    使い方:

    Compare-BinaryFile <比較対象1ファイルパス> <比較対象2ファイルパス>

    • 回答としてマーク qoo_man 2013年4月4日 5:54
    2013年4月4日 5:47
  • こんにちは。

    バイナリファイルの扱いってあまり見かけませんね。

    [Byte[]]$compA = Get-Content "abcde.exe" -Encoding Byte
    Set-Content "abcde.exe" -Value $compA -Encoding Byte

    上記を変数に取り込んで、Compare-Objectを実行すればファイルの比較は出来そうです。

    しかし大きいサイズのファイル(数10MB)は応答がなくなりますので、ご注意ください。

    Hide

    • 回答としてマーク qoo_man 2013年4月8日 0:10
    2013年4月5日 1:08

すべての返信

  • こんにちは

    ヘルプには「 このコマンドは、2 つのテキスト ファイルの各行の内容を比較します。」とありますのでテキスト用なのだと思います。

    • 回答としてマーク qoo_man 2012年9月4日 6:22
    2012年9月4日 3:39
  • minminnana_prof 様

    ありがとうございます。

    テキスト用なんですね。

    バイナリファイルを比較する方法、ご存じではないでしょうか?

    よろしくお願いいたします。

    2012年9月4日 4:07
  • こんにちは、

    PowerShellコマンドレットではありませんが、標準ではfc.exeなんてのが使えそうです。

    fc ファイル1 ファイル2 /B

    みたいな感じで。

    詳しい比較結果などが欲しければフリーソフトとかですかね。

    • 回答としてマーク qoo_man 2012年9月4日 6:22
    2012年9月4日 5:41
  • minminnana_prof 様

    ありがとうございます。

    Dosのコマンドを使うのであれば、COMPで事足りるのですが、PowerShellで書けないかと。

    現時点で、存在しない機能であればあきらめるとします。

    また、解らないことがあればお願いします。

    2012年9月4日 6:22
  • これでどうでしょうか

    ハッシュの比較をしています。

    適時改造してください。

    # Compare-BinaryFile
    # Input (string)FilePath1 , (string)FilePath2
    # Output boolen
    # FilePath1とFilePath2のファイルそれぞれのSHAハッシュを算出して比較する

    Function Compare-BinaryFile{
     param(
       [string]$FilePath1 = ''
      ,[string]$FilePath2 = ''
      )

    $SHA = New-Object System.Security.Cryptography.SHA1CryptoServiceProvider
    [Byte[]]$HashValue1 = New-Object byte[] 50
    [Byte[]]$HashValue2 = New-Object byte[] 50

    $OpenMode = New-Object System.IO.FileMode
    $OpenMode.value__ = 3  #Open
    $AccessMode = New-Object System.IO.FileAccess
    $AccessMode.value__ = 1 #Read

    $FS1 = New-Object System.IO.FileStream($FilePath1,$OpenMode,$AccessMode)
    $FS2 = New-Object system.IO.FileStream($FilePath2,$OpenMode,$AccessMode)

    $HashValue1 = $SHA.ComputeHash($FS1)
    $HashValue2 = $SHA.ComputeHash($FS2)

    $OpenMode = $null
    $AccessMode = $null
    $FS1 = $null
    $FS2 = $null
    $ComF = $true

    for($i=0;$i -lt 50;$i++)
    {
     if($HashValue1[$i] -ne $HashValue2[$i]) {$ComF = $false;break}
    }

    $HashValue1 = $null
    $HashValue2 = $null

    return $ComF

    }

    使い方:

    Compare-BinaryFile <比較対象1ファイルパス> <比較対象2ファイルパス>

    • 回答としてマーク qoo_man 2013年4月4日 5:54
    2013年4月4日 5:47
  • チキン様

    古い質問ですが見つけていただいてありがとうございます。

    FUNCTIONを作ったことは無いのですが、挑戦してみます。

    丁寧な内容ですので非常にありがたいです。

    試してみた結果をまた記入いたします。

    2013年4月4日 5:54
  • こんにちは。

    バイナリファイルの扱いってあまり見かけませんね。

    [Byte[]]$compA = Get-Content "abcde.exe" -Encoding Byte
    Set-Content "abcde.exe" -Value $compA -Encoding Byte

    上記を変数に取り込んで、Compare-Objectを実行すればファイルの比較は出来そうです。

    しかし大きいサイズのファイル(数10MB)は応答がなくなりますので、ご注意ください。

    Hide

    • 回答としてマーク qoo_man 2013年4月8日 0:10
    2013年4月5日 1:08
  • PSSpecialist様

    ありがとうございます。

    試してみました。

    結果は

    InputObject   SideIndicator 
    -----------   ------------- 
    チツテト125    =>            
    チネテト123     <=            

    こんな感じでした。一部表示されない部分もありますが、概ねOKでした。

    ただ、setでファイルを上書きしているようなので少し不安です。

    • 編集済み qoo_man 2013年4月8日 2:46
    2013年4月8日 0:09
  • チキン様

    そのままコピーして使ってみました。

    期待通りに比較出来ているようです。

    参考にさせていただいて、不一致な個所が分かるようにしたいです。

    ありがとうございました。

    2013年4月8日 0:21