修改比较对象输出文件内容
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 0
和 file2[ 上的 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 ...
我正在比较两个文本文件并将差异发送到输出文件。这是我的简单代码。
$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 0
和 file2[ 上的 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 ...