当前位置: 首页 > 知识库问答 >
问题:

格式化比较对象输出

姜嘉荣
2023-03-14

大家好,早上好。

我只是想看看是否可以将Compare-Object的输出格式化为pscustomObject。我看了一下以下类似的问题:

  • PowerShell比较对象侧边指示器
  • 比较对象格式输出
  • 比较对象输出格式

…但是,我似乎只是不明白它的概念。我讨厌问已经回答过的与此相关的问题,但是,我只是有点困惑。第三个链接是我唯一开始理解的链接,但仍然迷失在酱汁中。

只是希望根据侧指示器返回属性分离输出.

$Reference = Get-Content "C:\Users\Abe\Desktop\onj1.txt"
$Difference = Get-Content "C:\Users\Abe\Desktop\onj2.txt"


Compare-Object -ReferenceObject $Reference -DifferenceObject $Difference -IncludeEqual | Tee-Object -Variable CompareObject | Out-Null
$compareObject | Foreach { 
$ONJ1 = $_.SideIndicator -eq "<=" | Select $_.InputObject
$ONJ2 = $_.SideIndicator -eq "=>" | Select $_.InputObject
$Both = $_.SideIndicator -eq "==" | Select $_.inputobject

    [pscustomobject]@{
        ONJ1 = $ONJ1
        ONJ2 = $ONJ2
        Both = $Both
                }
        } 

不幸的是,所有3列都返回相同的输出,我假设它是,因为我选择了InputObject属性,但是它获取了所有的输出。

编辑:如Zett42所解释

$Reference = Get-Content "C:\Users\Abe\Desktop\onj1.txt"
$Difference = Get-Content "C:\Users\Abe\Desktop\onj2.txt"


Compare-Object -ReferenceObject $Reference -DifferenceObject $Difference -IncludeEqual | Tee-Object -Variable CompareObject | Out-Null

$null = [array]$ONJ1 = $compareObject | Where-Object {$_.SideIndicator -eq "<="} | Select-Object -ExpandProperty InputObject
$null = [array]$ONJ2 = $compareObject | Where-Object {$_.SideIndicator -eq "=>"} | Select-Object -ExpandProperty InputObject
$null = [array]$Both = $compareObject | Where-Object {$_.SideIndicator -eq "=="} | Select-Object -ExpandProperty InputObject


For($i=0; $i -lt ($ONJ1.Count + $ONJ2.Count + $Both.Count); $i++){
    [pscustomobject]@{
        ONJ1 = $ONJ1[$i]
        ONJ2 = $ONJ2[$i]
        Both = $Both[$i]
                }
        } 

共有2个答案

艾才良
2023-03-14

不确定您期望的格式化输出是什么,但可能是一些东西;像这样吗?

onj1.txt文件

Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor.

onj2.txt

Lorem ipsum dolor sit amet, 
sed do eiusmod tempor.
$Reference = Get-Content "C:\Users\Abe\Desktop\onj1.txt"
$Difference = Get-Content "C:\Users\Abe\Desktop\onj2.txt"

$compare = Compare-Object -ReferenceObject $Reference -DifferenceObject $Difference -IncludeEqual

[PsCustomObject]@{
    ONJ1 = ($compare | Where-Object {$_.SideIndicator -eq "<="}).InputObject -join [environment]::NewLine
    ONJ2 = ($compare | Where-Object {$_.SideIndicator -eq "=>"}).InputObject -join [environment]::NewLine
    Both = ($compare | Where-Object {$_.SideIndicator -eq "=="}).InputObject -join [environment]::NewLine
} | Format-Table -Wrap

输出:

ONJ1                                                      ONJ2                         Both                  
----                                                      ----                         ----                  
Lorem ipsum dolor sit amet,                               Lorem ipsum dolor sit amet,  sed do eiusmod tempor.
consectetur adipiscing elit,                                                                                 
巫马松
2023-03-14

您正在获取格式化的输出字符串,而不是来自Compare-Object的实际数据。格式化的输出很难处理,因为它只是非结构化的字符串。将Compare-Object的直接输出存储到变量中,而不会通过管道传输到其他cmdlet。然后您根据该数据进行进一步处理。

$reference = 'foo', 'bar', 'baz', 'bim'
$difference = 'bim', 'fop', 'bar'

$compareObject = Compare-Object -ReferenceObject $Reference -DifferenceObject $Difference -IncludeEqual 

然后根据SideIndicator分离结果:

[array] $left  = $compareObject | Where-Object SideIndicator -eq '<=' | 
                                  Select-Object -ExpandProperty InputObject
[array] $right = $compareObject | Where-Object SideIndicator -eq '=>' | 
                                  Select-Object -ExpandProperty InputObject
[array] $both  = $compareObject | Where-Object SideIndicator -eq '==' |
                                  Select-Object -ExpandProperty InputObject

变量$left是一个数组,它只包含$Reference中的项, $Difference$Difference中的项目, $both$Reference$Diverrence中的两个项目。

注意:我已经明确地将变量的类型设置为[array],这样我们可以将单个元素的输出视为多个元素。对单个字符串应用索引运算符将选择单个字符,而对字符串数组应用索引运算符则将输出单个字符串。通过显式地将变量类型设置为[array],我们可以在不需要额外代码的情况下处理这两种情况。

现在我们可以根据分离的结果进行进一步的处理,例如。G.将它们填充到[PSCustomObject]的单个数组中:

# Determine the total number of rows we need. -1 to make it a valid array index.
$maxIndex = ( $left.Count, $right.Count, $both.Count | Measure-Object -Maximum ).Maximum - 1

foreach( $i in 0..$maxIndex ) {
    [pscustomobject]@{
        ONJ1 = if( $i -lt $left.Count )  { $left[ $i ] }  else { $null }
        ONJ2 = if( $i -lt $right.Count ) { $right[ $i ] } else { $null }
        Both = if( $i -lt $both.Count )  { $both[ $i ] }  else { $null }
    }
}

赋值右侧的 if/else 称为条件赋值(又名三元运算符)。由于每个数组$left$right$both 可能具有不同的大小(小于 $maxIndex),我们需要确保不会“超调”并使用无效索引。

实际上这只在使用严格模式时才需要

输出:

ONJ1 ONJ2 Both
---- ---- ----
foo  fop  bar
baz       bim
 类似资料:
  • 我们可以看到格式化就是通过格式字符串得到特定格式: format!("{}", foo) -> "3735928559" format!("0x{:X}", foo) -> "0xDEADBEEF" format!("0o{:o}", foo) -> "0o33653337357" 根据使用的参数类型,同样的变量(foo)能够格式化成不同的形式:X, o 和未指定形式。 这个格式化的功能是通过 t

  • 我正在尝试创建一个二进制搜索程序,该程序可以使用各种类型的变量(int、float、string等)来查看数组中是否存在元素。我正试图找出如何比较变量。下面是我正在使用的内容的草图: 我甚至不确定使用对象是否是最好的方法。

  • 问题内容: 我必须将对象与预定义类的列表进行比较。 使用安全还是应该使用? 注意: 我不能使用,我没有对象,我只有对象。在这种情况下,我会像枚举一样使用它! 问题答案: 不会覆盖来自的方法,该方法是这样实现的: 因此与(除非为null)相同。

  • 本节提供了一个实例来演示如何使用DateFormat类和SimpleDateFormat类格式化Date对象,以及如何将格式化后的字符串追加到指定的字符串后面,最后演示了修改时区的方法。 例子 : 格式化Date对象 实例的代码如下: package chapter8; import java.text.SimpleDateFormat; import java.text.DateFormat;

  • 我已经被覆盖了hashcode和equals以查找具有相同开始日期和关闭日期的值。我得到了重复对象的类似哈希代码。当等同于这些对象时,我得到了布尔值“假”。在我的理解中,对象==对象比较对象的引用,即使引用是相同的;代码返回假。你能帮我理解是什么问题吗?我在下面发布了我的代码: Main.java 输出: 检查客户对象引用:Customer@643 对象引用(位于Map中):[Customer@6

  • 问题内容: 我刚刚开始为AngularJS应用编写测试,并且正在Jasmine中进行测试。 以下是相关的代码段 ClientController: ClientControllerSpec: 测试失败: 有谁知道为什么会发生这种情况吗? 另外..由于我不熟悉AngularJS测试,因此欢迎对我的测试设置错误还是可以改进提出任何意见。 更新: 包括ClientService: 另外,我通过比较id解