我刚刚将PowerShell从v3.0升级到v5.1,并注意到Select-Object和Format-Table的控制台输出的行为截然不同。如果某个属性的值太长,则所有后来的属性都会从控制台输出中完全分离出来(我可以看到所有值仍在传递,只是在控制台输出中被抑制了)。我想要一种简单的方法来复制2.0 / 3.0(4.0?)的旧行为,其中值被截断以适合控制台中的所有属性,因为一眼就能比较数据,但是我不知道可以做到这一点。
这是一个例子:我制作了一个哈希表数组,然后尝试在120个字符宽的控制台中查看输出:
$array = @()
$array += New-Object PSObject -Property @{Name="Test1";Value1="samplestring";Value2="Omitted Text"}
$array += New-Object PSObject -Property @{Name="Test2";Value1="Much longer string. More than 120 characters, so that we can suppress Value2's console output. This sentence ought to do it.";Value2="Omitted Text"}
$array | select Name,Value1,Value2
在PS 2.0和3.0中,输出正是我想要的:
Name Value1 Value2
---- ------ ------
Test1 samplestring Omitted Text
Test2 Much longer string. More than 120 ch... Omitted Text
...但是在5.1中,它似乎会自动应用Format-Table -AutoSize并给出以下信息:
Name Value1
---- ------
Test1 samplestring
Test2 Much longer string. More than 120 characters, so that we can suppress Value2's console output. This sentence o...
我尝试摆弄Format-Table的计算属性,但是我无法使width属性起作用,并且说实话,指定每个属性的宽度对于我正在键入和运行的命令来说太繁琐了在飞行中。我还缺少其他命令,还是后悔升级?
答案 0 :(得分:0)
答案 1 :(得分:0)
我找不到解决方案将行为改回旧版本, 但是:我能够写出一些适合您需求的东西。
$array = @()
$array += New-Object PSObject -Property
@{Name="Test1";Value1="samplestring";Value2="Omitted Text"}
$array += New-Object PSObject -Property @{Name="Test2";Value1="Much longer string. More than 120 characters, so that we can suppress Value2's console output. This sentence ought to do it.";Value2="Omitted Text"}
$array | Format-table -Property @{ e='name'; width=40 }, `
@{ e='value1'; width=40 }, `
@{ e='value2'; width=40 }
我还认为,我在一个无关紧要的问题上有两种说法。 随着数组大小的扩展,+ =运算符会降低性能,因为它必须 (据我所知)重新复制整个数组,然后向其添加下一个元素。如果您正在使用大型数据集并进行大量的添加和删除条目,则建议使用列表。