下午好!
我是一个Powershell新手,试图了解数据输出的工作原理。我正在尝试在活动目录中找到两个用户之间的差异。我找到了一个有效的解决方案(两个AD用户帐户上的比较对象(,但是相关字段中的某些数据被截断了...这没有帮助。
我在这里的页面底部找到了一个看起来非常优雅的解决方案: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:UsersUSERDesktopdifferences.txt
这将产生"不允许使用空管道元素"的错误。如果我删除一条线返回以将第一条管线放在$UserComparison变量之后......
$UserComparison | Format-Table -Property * -AutoSize `
| Out-String -Width 4096 `
| Out-File C:aliases.txt
。然后创建文本文件,但它的格式不正确。只有前两列出现在输出中,右侧有大量浪费的空格,每行后返回几个空行......与网站上的示例完全不同。
这是因为我找到的脚本将数据写入变量,然后只在屏幕上打印变量,而不是使用可以正确输出的命令吗?我觉得我拥有我需要的所有部分,只是配置不正确,无法获得我想要的输出。
谢谢!
所以,#1 行:
$UserComparison
| Format-Table -Property * -AutoSize `
| Out-String -Width 4096 `
| Out-File C:UsersUSERDesktopdifferences.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
将计算最长项目的宽度,并将其设置为列的宽度。有些项目太长。例如。对我来说,缩略图照片(恰好是我数组中的第 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:UsersUSERDesktopdifferences.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 }