Powershell - 创建宽表

Powershell - Creating Wide Tables

下午好!

我是一名 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

这会产生 "an empty pipe element is not allowed" 的错误。如果我删除一行 return 以将第一条管道放在 $UserComparison 变量之后...

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

...然后创建了文本文件,但格式不正确。输出中仅出现前两列,右侧有大量浪费的空格,每行后有几个空行 returns...与网站上的示例完全不同。

难道是因为我找到的脚本把数据写到一个变量中,然后只是把这个变量打印在屏幕上,而不是使用可以正常输出的命令?我觉得我拥有我需要的所有部分,只是配置不正确,无法获得我想要的输出。

谢谢!

所以,#1 行:

$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个字符不足以space容纳所有内容,因此被截断了。请记住,-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 个字符宽,这显然被您在 [=27 上指定的 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 的单独 table,然后传递它,这样会更容易读取,并且每个 属性 被限制在它的特定宽度:

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