繁体   English   中英

Powershell-创建宽表

[英]Powershell - Creating Wide Tables

下午好!

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

我在下面的页面底部找到了一个非常优雅的解决方案: 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

...然后创建了文本文件,但格式不正确。 仅前两列显示在输出中,右侧有大量浪费的空白,并且每行之后返回几行空白...与网站上的示例不同。

这是因为我找到的脚本将数据写入变量,然后仅在屏幕上打印该变量,而不是使用可以正确输出的命令? 我觉得我已经拥有了所有需要的东西,只是没有正确的配置来获得想要的输出。

谢谢!

因此,第一行:

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

无效,因为您先执行

$UserComparison

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

| Format-Table -Property * -AutoSize `

发生错误的原因是没有任何内容通过管道传递到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

现在,这样做的缺点是文本文件中的每一行将是最长项目的全宽,因此(以我为例)每行将为12297个字符长。 这使事情很难阅读。

输出内容的其他方式是:

将事情限制为仅显示“属性”和“比较”列:

$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 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM