下午好!
我是一名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 :(得分: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宽度限制截断,然后不会显示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
现在,以这种方式做事的缺点是文本文件中的每一行都是最长项的全宽,因此(在我的情况下)每行的长度为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 }