英語で読む

次の方法で共有


Compare-Object コマンドレットの使用

2 つのオブジェクトまたはテキスト ファイルの比較

Compare-Object は、興味深いコマンドレットです。最終的に、2 つのオブジェクトを比較して、2 つの間に違いがあればその違いを知らせます。たとえば、次のコマンドを使用して、現在コンピュータで実行されている処理に関する情報を $A という変数に格納します。

$A = Get-Process

たとえば、いくつかのアプリケーションの開始と終了を行い、次のように $B という変数に最後の処理情報を格納します。

$B = Get-Process

この結果、コンピュータで実行されている処理に関する情報を含むオブジェクトのペアがわかります。$A はたとえば 10:00 に実行されていた処理を表します。$B は 10:30 に実行されていた処理を表します。

2 つのオブジェクトがあれば、Compare-Object を使用して $A と $B の間に終了した処理または開始した処理がわかります (該当する場合)。次に、実行するコマンドを示します。

Compare-Object $A $B

返される出力の種類を紹介します。

InputObject                             SideIndicator
-----------                             -------------
System.Diagnostics.Process (EXCEL)      =>
System.Diagnostics.Process (freecell)   =>
System.Diagnostics.Process (notepad)    =>
System.Diagnostics.Process (dexplore)   <=

=> 記号は、問題の処理 (フリーセルなど) が 2 つ目のオブジェクトのプロパティ セットに見つかったけれども、1 つ目のオブジェクトのプロパティ セットには見つからなかったことを示します。フリーセルは、最初の処理情報セット ($A に格納されているデータ) を取得した後に起動したことを示します。<= 記号は、$A のデータセットに Dexplore が含まれるけれども、$B のデータセットには含まれないことを示します。つまり、アプリケーションが最初から実行されていて、2 つ目の処理情報セットを取得する前にアプリケーションが終了した場合にのみ、このような結果になります。

言い換えると、最初のプロセス一覧を取得した後、Excel、フリーセル、メモ帳を開始し、Dexplore を終了しました。どのようなしくみかわかりますか。

Compare-Object は、2 つのテキスト ファイルのコンテンツを比較するために使用できます。フォルダ C:\Scripts に 2 つのファイルがあるとします。X.txt というファイルには、次の内容が含まれます。

This is line number 1.
Line 2.
This is line number 3.

そして、ファイル Y.txt の内容は次のようになります。

This is line number 1.
This is line number 2.
This is line number 3.

2 つのファイルに違いがあるかどうかを確認するには、次のコマンドを使用します。

Compare-Object $(Get-Content c:\scripts\x.txt) $(Get-Content c:\scripts\y.txt)

これが Compare-Object が返す値です。

InputObject                             SideIndicator
-----------                             -------------
This is line number 2.                  =>
Line 2.                                 <=

ここでは、Get-Content コマンドレットを使用して、2 つのテキスト ファイルのコンテンツを取得していること、および各 Get-Content コマンドがかっこで囲まれていることに注意してください。それによって、オブジェクト (反対に、たとえば文字列値) を Compare-Object に確実に渡すことができます。実質的に、ここで実行した内容は、これら 3 つのコマンドを含む 1 つのコマンドを作成することです。

$A = Get-Content c:\scripts\x.txt
$B = Get-Content c:\scripts\y.txt
Compare-Object A$ B$

2 つのテキスト ファイルについて行ごとの比較を確認する場合は、-includeequal パラメータを追加します。

Compare-Object $(Get-Content c:\scripts\x.txt) $(Get-Content c:\scripts\y.txt) -includeequal

この結果、次のような出力になります。

InputObject                             SideIndicator
-----------                             -------------
This is line number 1.                  ==
This is line number 3.                  ==
This is line number 2.                  =>
Line 2.                                 <=
Compare-Object のエイリアス
  • diff

関連リンク