我有这个脚本,它接受两个对象并比较每个属性和noteproperty,在这种情况下,我试图比较Get-ADUser
返回的两个ADUser对象:
Function Compare-ObjectProperties {
Param(
[PSObject]$ReferenceObject,
[PSObject]$DifferenceObject
)
$objprops = $ReferenceObject | Get-Member -MemberType Property,NoteProperty | % Name
$objprops += $DifferenceObject | Get-Member -MemberType Property,NoteProperty | % Name
$objprops = $objprops | Sort | Select -Unique
$diffs = @()
foreach ($objprop in $objprops) {
$diff = Compare-Object $ReferenceObject $DifferenceObject -Property $objprop
if ($diff) {
$diffprops = @{
PropertyName=$objprop
RefValue=($diff | ? {$_.SideIndicator -eq '<='} | % $($objprop))
DiffValue=($diff | ? {$_.SideIndicator -eq '=>'} | % $($objprop))
}
$diffs += New-Object PSObject -Property $diffprops
}
}
if ($diffs) {$diffs | select propertyname,refvalue,diffvalue}
}
$ad1 = Get-ADUser user1 -Properties *
$ad2 = Get-ADUser user2 -Properties *
Compare-ObjectProperties $ad1 $ad2 | select propertyname,refvalue,diffvalue
结果只有两个字段:propertyname和refvalue。第三个字段似乎不适合屏幕。 Format-Table -AutoSize
根本不会改变结果(我也尝试过wrap,length和autosize选项)。
事实上,即使我使用Out-File result.txt
,结果也只包含这两列。我认为脚本中的一个命令是使用格式化覆盖格式表和我的其他尝试,但我不确定哪一个或如何看。
如果我比较具有较短属性的对象,该脚本可以正常工作。我甚至可以使用get-aduser user1
(不用-properties *
),因为结果更加紧凑,它会返回所有三个字段。
答案 0 :(得分:1)
你已经知道屏幕上有太多东西了。 Format-Table -auto
无法使其适应且Out-File
在幕后使用相同的cmdlet来处理该数据。将对象传递给Out-File
将强制PowerShell将对象呈现为已经无法执行的字符串。来自docs.microsoft.com
Format-Table命令假定属性越靠近属性列表的开头,它就越重要。因此它试图完全显示最接近开头的属性。如果Format-Table命令无法显示所有属性,它将从显示中删除一些列并提供警告。
不确定为什么你没有看到警告。我也没有得到一个,我的$WarningPreference
不应该阻止它。
通常,当要显示许多属性并且PowerShell使用Format-List
时会出现这种情况。我认为这个阈值是4,但我不记得了。由于您有3个不起作用的属性。
所以你可以做的两件事取决于场景
管道到Format-List
使用为对象设计的输出格式。 Export-Csv
是明显的选择
你真的比较这些用户对象的所有属性吗?我知道-Properties *
使用起来很简单,但它在查询非索引属性时是一种性能问题。如果可以,请将您的选择集减少到您实际需要的选择集。