大家好,早上好。
我只是想看看是否可以将Compare-Object的输出格式化为pscustomObject。我看了一下以下类似的问题:
…但是,我似乎只是不明白它的概念。我讨厌问已经回答过的与此相关的问题,但是,我只是有点困惑。第三个链接是我唯一开始理解的链接,但仍然迷失在酱汁中。
只是希望根据侧指示器
返回属性分离输出.
$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]
}
}
不确定您期望的格式化输出是什么,但可能是一些东西;像这样吗?
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,
您正在获取格式化的输出字符串,而不是来自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解