Powershell - 创建宽表

时间:2016-02-11 18:59:39

标签: powershell truncate

下午好!

我是一名Powershell新手,试图了解数据输出的工作原理。我试图找到Active Directory中两个用户之间的差异。我找到了一个有效的解决方案(Compare-Object on two AD user accounts),但是相关字段中的某些数据被截断了......这没有帮助。

我在页面底部找到了一个看似非常优雅的解决方案:http://poshoholic.com/2010/11/11/powershell-quick-tip-creating-wide-tables-with-powershell/

我试图将这两者合并为一个脚本。这就是我所拥有的:

$user1 = get-aduser jdoe -Properties *
$user2 = get-aduser jsmith -Properties *

$Usercomparison = @()

$user1.GetEnumerator() | ForEach-Object {
    If ($User2.($_.Key) -eq $_.Value)
    {
        $Comparison = 'Equal'
    }
    else
    {
        $Comparison = 'Different'
    }

    $UserObj = New-Object PSObject -Property ([ordered]@{
        Property = $_.Key
        User1 = $_.Value
        User2 = $User2.($_.Key)
        Comparison = $Comparison
    })
    $UserComparison += $UserObj
}

$UserComparison
| Format-Table -Property * -AutoSize `
| Out-String -Width 4096 `
| Out-File C:\Users\USER\Desktop\differences.txt

这会产生“不允许空管元素”的错误。如果我删除一行返回以将第一个管道放在$ UserComparison变量之后......

$UserComparison | Format-Table -Property * -AutoSize `
| Out-String -Width 4096 `
| Out-File C:\aliases.txt

...然后创建了文本文件,但格式错误。输出中只显示前两列,右边有大量浪费的空白,每行后面有几个空行返回......没有类似网站上的例子。

这是因为我发现的脚本将数据写入变量然后只是在屏幕上打印变量而不是使用可以正确输出的命令吗?我觉得我拥有所需的所有部分,只是没有正确的配置来获得我想要的输出。

谢谢!

1 个答案:

答案 0 :(得分:0)

所以,#1行:

$UserComparison
| Format-Table -Property * -AutoSize `
| Out-String -Width 4096 `
| Out-File C:\Users\USER\Desktop\differences.txt

因为您首次执行

而无效
$UserComparison

输出$UserComparison的内容。接下来,执行

| Format-Table -Property * -AutoSize `

由于 nothing 被传输到Format-Table,因此出现了哪些错误。 Format-Table语句末尾的“ticks”(`)是一个续行语句,即第二个版本:

$UserComparison | Format-Table -Property * -AutoSize `
| Out-String -Width 4096 `
| Out-File C:\aliases.txt

是正确的,因为它将被解释为一条巨行。

第二个问题,你遇到问题的原因是因为4096个字符没有足够的空间容纳所有内容,因此被截断。请注意,-AutoSize将计算最长项的宽度,并将其作为列的宽度。有些物品太长了。对于前者对我来说,thumbnailPhoto(恰好是我的数组中的第140项):

$UserComparison[140]

给出类似这样的东西(根据宽度截断):

Property       User1
--------       -----
thumbnailPhoto {255 216 255 224 0 16 74 70 73 70 0 1 1 1 0 96 0...

当我计算出它的宽度时,它给了我:

#Calculate  width of User1
($UserComparison[140].User1 | Out-String).Length

7555

#Calculate width of full field
($UserComparison[140] | Out-String).Length

12297

是的,User1长度为7,555个字符。这意味着Format-Table -Autosize会使User1至少 7,555个字符宽,这显然会被您在Out-String上指定的4,096宽度限制截断,然后不会显示User2Comparison列。在这种情况下,您的Out-String宽度必须至少为12,297宽才能显示完整字段。

解决方法是在Out-String上指定更宽的宽度,保证更宽,例如50,000,因此您的代码将是:

$UserComparison | Format-Table -Property * -AutoSize `
| Out-String -Width 50000 `
| Out-File C:\Users\USER\Desktop\differences.txt

现在,以这种方式做事的缺点是文本文件中的每一行都是最长项的全宽,因此(在我的情况下)每行的长度为12,297个字符。这使得事情更难阅读。

输出内容的其他方法是:

仅限于显示“属性”和“比较”列:

$UserComparison | Select Property, Comparison `
| Format-Table -Property * -AutoSize `
| Out-String -Width 4096 `
| Out-File SimpleCompare.txt

或者,如果您需要查看完整值是什么,请将每个属性切换到一个带有ForEach-Object的单独表中,然后将其传递以便更容易阅读,并且每个属性仅限于它的特定宽度:

$UserComparison | Select Property, Comparison, User1, User2 `
| ForEach-Object { $_ | Format-Table -Property * -AutoSize `
| Out-String -Width 50000 `
| Out-File EasyToRead.txt -Append }