比较两个文件的内容,并输出内容差异以及行号

时间:2019-05-21 04:31:21

标签: powershell

我遇到一个问题,我们需要逐行比较两个文件a.txtb.txt的内容,如果发现与内容和行号有任何差异,则输出结果。

在这种情况下,我们不应该使用Compare-Object。我们还有其他选择吗?

我尝试使用for循环,但无法获得想要的结果

例如:a.txt:

Hello = "Required"
World =  5678
Environment = "new"
Available = 9080.90

b.txt”

Hello = "Required"
World =  5678.908
Environment = "old"
Available = 6780.90

我需要获得如下输出:

Line number 2:World is not matching
Line number 3:Environment is not matching
Line number 4:Available is not matching

我尝试了以下代码段,但未成功

$file1  = Get-Content "C:\Users\Desktop\a.txt"
$file2  = Get-Content "C:\Users\Desktop\b.txt"
$result = "C:\Users\Desktop\result.txt"

$file1 | foreach { 
$match = $file2 -match $_
    if ( $match ){ 
        $match | Out-File -Force $result -Append 
    }
}

2 个答案:

答案 0 :(得分:0)

由于您对2似乎有不良反应,因此请尝试使用这种极其笨拙的设置。由于您列出的需求很少甚至没有,因此这将为您提供满足“发现任何差异”条件的最低要求。

如果您有更多行,请复制并粘贴更多Compare-Object语句。

If

答案 1 :(得分:0)

Get-Content将文件内容作为具有从零开始的索引的字符串数组返回。

array变量具有自动属性.Count / .Length
您可以使用简单的计数来迭代数组。

您需要在=处拆分行以分隔名称和内容。

使用-f format operator输出结果。

## Q:\Test\2019\05\21\SO_56231110.ps1

$Desktop = [environment]::GetFolderPath('Desktop')
$File1   = Get-Content (Join-Path $Desktop "a.txt")
$File2   = Get-Content (Join-Path $Desktop "b.txt")

for ($i=0;$i -lt $File.Count;$i++){
    if($File1[$i] -ne $File2[$i]){
        "Line number {0}:{1} is not matching" -f ($i+1),($File1[$i] -split ' = ')[0]
    }
}

示例输出:

Line number 2:World is not matching
Line number 3:Environment is not matching
Line number 4:Available is not matching