【问题标题】:Compare-Object different property names比较对象不同的属性名称
【发布时间】:2017-08-16 13:38:52
【问题描述】:

有没有办法使用 Compare-Object -property 来比较具有不同名称的 2 个属性?我有这样的事情:

    $ComparisonProperty= $ComparisonProperty | Add-Member -MemberType AliasProperty -Name Url -Value ITEM_TARGET_URI -PassThru
Compare-Object $FirstFile $SecondFile -Property Url -PassThru | Where-Object{$_.SideIndicator -eq "<="} | Out-file .\result.txt

但这给出了一个错误:

无法将参数绑定到参数“InputObject”,因为它为空

在 $ComparisonProperty

//编辑

示例数据是 2 个带有许多标头的 csv 文件,其中 1 个带有 Url 标头,另一个带有 ITEM_TARGET_URI。结果应该是文件 1 中不存在于文件 2 中的字符串。如果我为它们提供相同的属性名称,则比较有效,但重点是强制它比较具有不同名称的 2 个属性。

【问题讨论】:

  • 不应该是$ComparisonProperty | Add-Member ... -> $SecondFile | Add-Member ...吗? (假设$SecondFile 是没有Url 属性的那个)
  • 对于标题我说使用属性别名或创建计算属性以使属性具有相同的名称。您的错误虽然与此无关。 $ComparisonProperty 是否在其他任何地方声明?否则我同意这个错误。是 $null。哪个文件没有“正确”属性
  • @MathiasR.Jessen 这就是答案。 Wolwgang .. 如果您显示一些样本数据和预期输出,这个问题会更好。那么答案会更好。
  • @Matt Done,提供了更多我想要实现的数据。
  • 您是否提前知道标题以及其他列在输出中是否重要?

标签: powershell


【解决方案1】:

要回答实际问题,计算属性或属性别名将为您提供所需的内容。您一直在尝试使用后者,但您需要将该属性添加到文件对象本身。考虑两个文件示例

id,first_name
1,Elia
2,Nikolos
3,Bert
4,Sharleen
5,Bill

id,beginning_name
1,Elia
2,Nikolos
3,Bert
4,Mildrid
5,Bill

请注意,标题是不同的。所以现在让我们尝试创建属性别名。假设我已经将这些文件作为 CSV 导入了

$file2 | Add-Member -MemberType AliasProperty -Name first_name -Value beginning_name
compare-object $file1 $file2 -Property first_name

这将为您提供您所期望的结果。我为第二个文件 object

添加了别名

您可以只使用列数据

另一种方法是删除属性并只使用字符串数组。因为我知道我想要的标题,所以我也可以自己获取这些列

$namesfromfile1 = $file1 | Select-Object -ExpandProperty first_name
$namesfromfile2 = $file2 | Select-Object -ExpandProperty beginning_name

Compare-Object $urls1 $urls2

根据您的 PS 版本,这也可以缩短。是否简化取决于读者。

Compare-Object ($file1).first_name ($file2).beginning_name

【讨论】:

    猜你喜欢
    • 2016-10-02
    • 2015-09-04
    • 2020-01-20
    • 2021-12-18
    • 2021-05-08
    • 1970-01-01
    • 2019-06-28
    • 2016-05-05
    • 1970-01-01
    相关资源
    最近更新 更多