Форматирование вывода усекает свойства при наличии длинных строк.

У меня есть этот скрипт, который берет два объекта и сравнивает каждое свойство и свойство примечания, в этом случае я пытаюсь сравнить два объекта ADUser, возвращаемые Get-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

в результате всего два поля: имя свойства и значение ссылки. Третье поле кажется не помещающимся на экране. Format-Table -AutoSize вообще не меняет результат (я также пробовал параметры переноса, длины и авторазмера).

На самом деле, даже если я использую Out-File result.txt, результат будет включать только эти два столбца. Я думаю, что одна из команд в сценарии использует форматирование, которое переопределяет форматную таблицу и другие мои попытки, но я не уверен, какую именно и как увидеть.

Скрипт отлично работает, если я сравниваю объекты с более короткими свойствами. Я даже могу просто использовать get-aduser user1 (опустив -properties *), и поскольку результат намного компактнее, он возвращает все три поля.


person Cpt.Whale    schedule 18.10.2017    source источник


Ответы (1)


Вы уже знаете, что на экране слишком много всего. Format-Table -auto не может настроить его, а Out-File использует те же командлеты для обработки этих данных. Передача объектов в Out-File заставит PowerShell отображать объект в виде строки, с которой у него уже возникли проблемы. Из docs.microsoft.com

Команда Format-Table предполагает, что чем ближе свойство к началу списка свойств, тем оно важнее. Таким образом, он пытается полностью отобразить свойства, ближайшие к началу. Если команда Format-Table не может отобразить все свойства, она удалит некоторые столбцы из отображения и выдаст предупреждение.

Не знаю, почему вы не увидели предупреждение. Я тоже не получил его, и мой $WarningPreference не должен был этому препятствовать.

Обычно такая ситуация возникает, когда нужно показать много свойств, а PowerShell использует Format-List. Я думаю, что порог для этого 4, но я не помню. Поскольку у вас есть 3 свойства, которые не вступают в игру.

Итак, две вещи, которые вы могли бы сделать в зависимости от сценария

Вывод в консоль

Труба к Format-List

Вывод в файл

Используйте выходной формат, предназначенный для объекта. Export-Csv очевидный выбор


Примечание

Вы действительно сравниваете все свойства этих пользовательских объектов? Я понимаю, что -Properties * прост в использовании, но он снижает производительность, поскольку запрашивает неиндексные атрибуты. Если можете, сократите набор выбора до тех, которые вам действительно нужны.

person Matt    schedule 18.10.2017
comment
Я бы добавил, что при сравнении двух разных объектов AD с использованием -Properties * всегда будут некоторые различия (например, отличительное имя, GUID, SID и т. д.). Как заметил Мэтт, лучше выбирать свойства, которые вы действительно хотите сравнить. - person Bill_Stewart; 18.10.2017
comment
Обратите внимание, что Out-File форматирует объекты по размеру экрана по умолчанию, но это можно настроить с помощью параметра -width. Конвейер к Out-File -Path $Path -Width 2147483647 должен устранить любое усечение, если ваши строки не длиннее 2 147 483 647 символов. Параметр представляет собой 32-битное целое число, так что это наибольшее число, которое он может принять. Я считаю, что вы можете делать подобные вещи на экране, используя Out-String -Width 2147483647. ссылка - person TheMadTechnician; 18.10.2017
comment
Истинный. Я не хотел заходить слишком далеко, так как он все равно не должен был использовать это здесь. - person Matt; 18.10.2017
comment
Это именно то, что мне было нужно - я не знал о поведении таблицы форматов и выходного файла. У меня работают и export-csv, и format-list. В этом случае мне, к сожалению, нужно было перечислить все свойства, иначе я бы смог использовать встроенный compare-object. - person Cpt.Whale; 18.10.2017