我遇到一个问题,我们需要逐行比较两个文件a.txt
和b.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
}
}
答案 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