Search code examples
powershelloutputcompareobject

Powershell Compare-Object Format Output


Here is the script that I wrote:

function Compare {

    $file1 = Read-Host "Please enter the path of the first file you would like to compare"
    $file2 = Read-Host "Please enter the path of the second file you would like to compare"

    $outFile = Read-Host "Please enter the path to where you would like your output file."

    Try{
        $compareOne = Get-Content $file1
        $comparetwo = Get-Content $file2
    } 
    Catch{
        Write-Host "The path you entered is either invalid or the file does not exist. "    
    }

    Write-Host "Beginning comparison"
    Compare-Object $compareOne $compareTwo  | Out-File $outFile
    Write-Host "Complete!"
}

Compare

And this is my output:

InputObject | SideIndicator
------------|--------------
   Value1   |    <=
   Value2   |    <=
   Value3   |    =>
   Value4   |    =>

Is it possible for me to format my output in such a way that I can change the headers of each column?

And instead of => and <= I could give which file the differences are actually found in?

Here is the kind of output I am looking for:

   Value    |     File 
------------|--------------
   Value1   |    $file1
   Value2   |    $file2
   Value3   |    $file2
   Value4   |    $file1

I'm still quite new to PowerShell so if you could explain your answer that would be great, just so I can understand what is actually going on.

I am also trying to make this "dummy proof" so that anyone can just compare two text files, without any further input.

Any help would be greatly appreciated!


Solution

  • Something like this, maybe?

    function compareCSV {
    
    $file1 = Read-Host "Please enter the path of the first file you would like to compare"
    $file2 = Read-Host "Please enter the path of the second file you would like to compare"
    
    $outFile1 = Read-Host "Please enter the path to where you would like your output file."
    
    Try{
        $compareOne = Get-Content $file1
        $comparetwo = Get-Content $file2
    } 
    Catch{
        Write-Host "The path you entered is either invalid or the file does not exist. "    
    }
    
    Write-Host "Beginning comparison"
    $Compare = 
    Compare-Object $compareOne $compareTwo
    
    $compare | foreach  { 
          if ($_.sideindicator -eq '<=')
            {$_.sideindicator = $file1}
    
          if ($_.sideindicator -eq '=>')
            {$_.sideindicator = $file2}
         }
    
     $Compare | 
       select @{l='Value';e={$_.InputObject}},@{l='File';e={$_.SideIndicator}} |
       Out-File $outFile1
    
      Write-Host "Complete!"
    }
    
    compareCSV