[英]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宽度限制所截断,然后将不显示User2
或Comparison
列。 在这种情况下, 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.