修改比较对象输出文件内容

Modifying Compare-Object Output file content

我正在比较两个文本文件并将差异发送到输出文件。这是我的简单代码。

$file1 = (Get-Content .\txt1.txt)
$file2 = (Get-Content .\txt2.txt)
compare-object $file1 $file2 | out-file txt3.txt

(Get-Content -Path .\txt3.txt) |
    ForEach-Object {
        $_ -Replace '=>', 'After'`
           -Replace '<=', 'Before'`
    } |
        Set-Content -Path .\txt3.txt
Get-Content -Path .\txt3.txt

现在是输出。

InputObject SideIndicator
----------- -------------
banaple     After           
cherry      After           
orange      Before           
strawberry  Before

是否可以交替使用之后和之前,以便用户更容易理解此结果?我主要担心的是,如果我有很多行的差异并且它们像这样显示,所有 After 都在上面,然后是相应的 Before 在下面,那么它可能会让用户感到困惑。或者,如果我可以在它们旁边加上数字来指出哪些之后和之前是合作伙伴。

我希望有人能帮我解决这个问题。我刚刚开始熟悉 Compare-Object 命令,但我真的很难获得我需要的修改。我提前感谢任何能回答我的问题的人:)

如果您通过索引比较两个文件,意思是比较 file1 上的 index 0file2[ 上的 index 0 =36=] 和儿子我个人根本不会使用 Compare-Object 因为它很慢:

$arr1 = 'orange','strawberry','orange'
$arr2 = 'banaple','cherry','orange','banana'

# Note: I'm placing those 2 arrays for demonstration purposes only.
# $arr1 and $arr2 should be changed to:
# $arr1 = Get-Content .\txt1.txt
# $arr2 = Get-Content .\txt2.txt

$totalCount = ($arr1.Count, $arr2.Count | Measure-Object -Maximum).Maximum

$arr3 = for($i=0;$i -lt $totalCount;$i++)
{
    $status = 'NO CHANGE'

    if($arr1[$i] -ne $arr2[$i])
    {
        $status = 'UPDATED'
    }

    [pscustomobject]@{
        Before = $arr1[$i]
        After = $arr2[$i]
        Status = $status
    }
}
  • $arr3 将导致以下结果:
Before     After   Status   
------     -----   ------   
orange     banaple UPDATED  
strawberry cherry  UPDATED  
orange     orange  NO CHANGE
           banana  UPDATED 
  • 如果您想导出 $arr3 我建议您使用 CSV 作为导出格式:
$arr3 | Export-Csv absolultepath\to\file3.csv -NoTypeInformation
  • 如果要导出为普通文本文件:
$arr3 | Out-File absolultepath\to\file3.txt

相同的逻辑,但作为一个函数:

function Compare-Files {
[cmdletbinding()]
param(
    [parameter(mandatory)]
    [ValidateScript({Test-Path $_ -PathType Leaf})]
    [System.IO.FileInfo]$BeforeFile,
    [parameter(mandatory)]
    [ValidateScript({Test-Path $_ -PathType Leaf})]
    [System.IO.FileInfo]$AfterFile
)

    $file1 = Get-Content $BeforeFile
    $file2 = Get-Content $AfterFile

    $totalCount = ($file1.Count, $file2.Count | Measure-Object -Maximum).Maximum
  
    for($i=0;$i -lt $totalCount;$i++)
    {
        $status = 'NO CHANGE'

        if($file1[$i] -ne $file2[$i])
        {
            $status = 'UPDATED'
        }

        [pscustomobject]@{
            Before = $file1[$i]
            After = $file2[$i]
            Status = $status
        }
    }
}

演示:

PS /> Compare-Files -BeforeFile .\file1.txt -AfterFile .\file2.txt

Before     After   Status   
------     -----   ------   
orange     banaple UPDATED  
strawberry cherry  UPDATED  
orange     orange  NO CHANGE
           banana  UPDATED  

PS /> Compare-Files -BeforeFile .\file1.txt -AfterFile .\file2.txt | Export-Csv ...