gpt4 book ai didi

powershell - 如果我不列出属性,比较对象不起作用

转载 作者:行者123 更新时间:2023-12-04 09:11:04 25 4
gpt4 key购买 nike

我有 2 个要比较的 Excel 电子表格:

$OleDbAdapter = New-Object System.Data.OleDb.OleDbDataAdapter “Select * from [Report$]“,”Provider=Microsoft.ACE.OLEDB.12.0;Data Source=S:\FIS-BIC Reporting\Report Output Files\Product-Marketing\TEST_XI\ECM - Pipeline by LOB_04182013_040544.xls;Extended Properties=”"Excel 12.0 Xml;HDR=YES”";”
$RowsReturned = $OleDbAdapter.Fill($DataTable)

$OleDbAdapter2 = New-Object System.Data.OleDb.OleDbDataAdapter “Select * from [Report$]“,”Provider=Microsoft.ACE.OLEDB.12.0;Data Source=S:\FIS-BIC Reporting\Report Output Files\Product-Marketing\ECM - Pipeline by LOB_04182013_074004.xls;Extended Properties=”"Excel 12.0 Xml;HDR=YES”";”
$RowsReturned2 = $OleDbAdapter2.Fill($DataTable2)

Compare-Object $DataTable $DataTable2

它什么都不返回。我知道在第 6 列中,它们是不同的。如果我指定“-property F6”,它会返回差值。除非我指定属性,否则知道为什么不这样做吗?列数可能会有所不同(尽管比较中的每个文件都相同),因此专门指定属性将不起作用。

最佳答案

如果不指定 -属性(property)参数,比较对象 不比较所有属性,它比较调用 的结果.ToString() 两个对象上的方法。所以,Compare-Object $DataTable $DataTable2比较 $DataTable1.ToString() $DataTable1.ToString() . .ToString() 方法在 DataTable 对象上调用时返回一个空字符串,因此报告没有区别。

例如:

$file1 = Get-Item somefilename
$file1 = Get-Item anotherfilename
Compare-Object $file1 $file2

这将返回两个文件的完整路径之间的差异,如下所示:
InputObject              SideIndicator
----------- -------------
<path>\anotherfilename =>
<path>\somefilename <=

那是因为调用 .ToString() 在 FileInfo 对象上返回其 全名 属性,因此您正在比较文件的完整路径名。

虽然 -属性(property)参数接受多个属性,列出所有属性不是解决方案。除了非常乏味之外,它不会给你想要的结果。如果您列出多个属性, 比较对象 比较所有属性的组合,如果列出的任何一个属性不同,它会返回一个结果,显示所有列出的属性(相同和不同的属性)作为单个差异。

您需要做的是遍历属性列表,然后调用 比较对象 每个属性一次:
$properties = ($DataTable | Get-Member -MemberType Property | Select-Object -ExpandProperty Name)
foreach ($property in $properties) {
Compare-Object $DataTable $DataTable2 -Property "$property" | Format-Table -AutoSize
}
  • 在大多数情况下,当比较两个对象的所有属性时,您需要使用 Get-Member -MemberType Properties , 以覆盖所有属性类型。但是,如果要比较 DataTable 对象,最好使用 Get-Member -MemberType Property以便您只比较与数据字段对应的属性,而不是与数据无关的 DataTable 对象的其他属性。
  • 这是假设列数与您所说的相同,或者至少是 中的列数。 $DataTable2 不超过 中的列数$数据表 .

    如果您不能可靠地假设,请导出 $属性(property)通过比较 ($DataTable | Get-Member -MemberType Property).Count 来获得更多列的数组与 ($DataTable2 | Get-Member -MemberType Property).Count并使用较大的属性。
  • 使用 格式表很重要,它不仅仅是为了让事情看起来漂亮。如果您列出多个相同类型的对象(在本例中为数组),PowerShell 会记住第一个对象的格式,并将其用于所有后续对象,除非您明确指定格式。由于第一列的名称对于每个属性(即电子表格中的每一列)都不同,因此第一列对于除遇到的第一个差异之外的所有属性都是空的。
    -AutoSize开关是可选的。那只是为了让事情看起来很漂亮。但是您必须将结果通过管道传送到格式过滤器。您也可以使用 格式列表若你宁可。
  • 关于powershell - 如果我不列出属性,比较对象不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18259861/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com