2016-02-11 37 views
0

下午好!Powershell - 创建宽表

我是一名试图了解数据输出如何工作的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 

...然后将文本文件被创建,但它的格式错误。只有前两列出现在输出中,并且在右边有大量浪费的空白,并且在每行后面有几个空白行返回......没有什么像网站上的示例。

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

谢谢!

+0

如果您只是s把它看出来,你可以尝试'format-table -Property * -AutoSize | convertto-html c:\ myfile.html' –

+0

@TonyHinkle将HTML放入控制台但未生成文件。 <!DOCTYPE html PUBLIC“ - // W3C // DTD XHTML 1.0 Strict // EN”“http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”> HTML表

' 尝试的情况下,多个位置,这是一个写权限的问题。我是否正确使用了你的添加? '$ UserComparison | format-table -Property * -AutoSize | convertto-html c:\ myfile.html' –

+0

尝试'$ UserComparison | ft -wrap | out-file c:\ temp \ test.txt'还有一些东西被截断了,比如用户所属的所有组,但它可能会得到你所需要的。 –

回答

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 ` 

哪些错误,因为什么被管道输送到Format-Table。该“蜱”(`)在Format-Table语句的结尾是一个继续行语句,即第二个版本:

$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至少 7555个字符宽,这显然是由您在Out-String指定,然后将不显示User2Comparison列4096宽度限制截断。在这种情况下,您的Out-String需要宽度至少为12,297,才能显示完整字段。

的解决方法是指定在该保证是更广泛的一样,说的Out-String一个更大的宽度,5所以您的代码将是:

$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对象放在一个单独的表格中,然后传递它以便读取,并且每个属性都被限制为它的特定宽度:

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