The output of diff -q path1 path2
is pretty verbose. This function
- Converts full paths to relative
- Differences are red.
Missing ‘diff’ ?
If git
is installed, you may need to update your %PATH%
environment variable.
# in your profile
$Env:Path = "$Env:ProgramFiles\Git\usr\bin", $Env:Path -join ';'
Stand-Alone function Compare-Directory
This is an isolated version of <a href="https://github.com/ninmonkey/Ninmonkey.Console">Ninmonkey.Console: Compare-Directory</a>
. I removed all dependencies except coloring is provided by the module PoshCode/Pansies.
function Invoke-NativeCommand {
<#
.synopsis
wrapper to both call 'Get-NativeCommand' and invoke an argument list
.example
PS> # Use the first 'python' in path:
Invoke-NativeCommand 'python' -Args '--version'
#>
param(
# command name: 'python' 'ping.exe', extension is optional
[Parameter(Mandatory, Position = 0)]
[string]$CommandName,
# Force error if multiple binaries are found
[Parameter()][switch]$OneOrNone,
# native command argument list
[Alias('Args')]
[Parameter(Position = 1)]
[string[]]$ArgumentList
)
$binCommand = Get-NativeCommand $CommandName -OneOrNone:$OneOrNone -ea Stop
& $binCommand @ArgumentList
}
function Compare-Directory {
<#
.SYNOPSIS
Compare Two directories using 'diff'
.EXAMPLE
Compare-Directory 'c:\foo' 'c:\bar\bat'
#>
[Alias('DiffDir')]
param(
# Path1
[Parameter(Mandatory, Position = 0)]
[string]$Path1,
# Path2
[Parameter(Mandatory, Position = 1)]
[string]$Path2,
# Output original raw text?
[Parameter()][switch]$OutputRaw
)
$Base1 = $Path1 | Get-Item -ea Stop
$Base2 = $Path2 | Get-Item -ea Stop
$Label1 = $Base1 | Split-Path -Leaf | New-Text -fg 'green'
$Label2 = $Base2 | Split-Path -Leaf | New-Text -fg 'yellow'
"Comparing:
Path: $Path1
Path: $Path2
" | Write-Information
$stdout = Invoke-NativeCommand 'diff' -args @(
'-q'
$Base1
$Base2
)
$outColor = $stdout
$outColor = $outColor -replace [regex]::Escape($path1), $Label1
$outColor = $outColor -replace [regex]::Escape($path2), $Label2
$outColor = $outColor -replace 'Only in', (New-Text 'Only In' -fg 'red')
$outColor = $outColor -replace 'Differ', (New-Text 'Differ' -fg 'red')
if ($OutputRaw) {
h1 'Raw' | Write-Information
$stdout
return
}
$outColor
}
function Get-NativeCommand {
<#
.synopsis
wrapper that returns Get-Item on a native command
.example
# if you want an error when multiple options are found
PS> Get-NativeCommand python -OneOrNone
.example
# note: this is important, $cmdArgs to be an array not scalar for '@' usage
$binPy = Get-NativeCommand python
$cmdArgs = @('--version')
& $binPy @cmdArgs
.example
#>
[cmdletbinding()]
param(
# Name of Native .exe Application
[Parameter(Mandatory, Position = 0, ValueFromPipeline)]
[object]$CommandName,
# One or None: Raise errors when there are more than one match
[Parameter()][switch]$OneOrNone
)
process {
try {
$query = Get-Command -Name $CommandName -All -CommandType Application -ea Stop
| Sort-Object Name
} catch [CommandNotFoundException] {
Write-Error "ZeroResults: '$CommandName'"
return
}
if ($OneOrNone -and $query.Count -gt 1) {
$query | Format-Table -Wrap -AutoSize -Property Name, Version, Source
Write-Error "OneOrNone: Multiple results for '$CommandName'"
return
}
if ($query.Count -gt 1) {
$query = $query | Select-Object -First 1
}
Write-Debug "Using Item: $($query.Source)"
$query
}
}