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 个宽度限制截断了=],然后将不会显示 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 的单独 table,然后传递它,这样会更容易读取,并且每个 属性 被限制在它的特定宽度:
$UserComparison | Select Property, Comparison, User1, User2 `
| ForEach-Object { $_ | Format-Table -Property * -AutoSize `
| Out-String -Width 50000 `
| Out-File EasyToRead.txt -Append }
下午好!
我是一名 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 个宽度限制截断了=],然后将不会显示 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 的单独 table,然后传递它,这样会更容易读取,并且每个 属性 被限制在它的特定宽度:
$UserComparison | Select Property, Comparison, User1, User2 `
| ForEach-Object { $_ | Format-Table -Property * -AutoSize `
| Out-String -Width 50000 `
| Out-File EasyToRead.txt -Append }