输出格式化是在存在长字符串时截断属性

时间:2017-10-18 15:36:14

标签: powershell powershell-v5.0

我有这个脚本,它接受两个对象并比较每个属性和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 *),因为结果更加紧凑,它会返回所有三个字段。

1 个答案:

答案 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 *使用起来很简单,但它在查询非索引属性时是一种性能问题。如果可以,请将您的选择集减少到您实际需要的选择集。