PowerShell v5.1 Select-对象控制台输出与 v3.0 不同
PowerShell v5.1 Select-Object Console Output Is Different from v3.0
我刚刚将 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
在PS2.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 的计算属性,但我无法使宽度 属性 起作用,老实说,指定每个 属性 对于我正在输入的命令 & 运行 来说工作量太大了。我是否遗漏了其他命令,或者我是否对升级感到后悔?
我似乎在 V5.1 上工作得很好
我找不到将行为改回旧版本的解决方案,
但是:我能够写一些可能适合您需要的东西。
$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 }
另外,我想我会把我的两种感觉放在一个不相关的事情上。
随着数组规模的扩大,+= 运算符对性能不利,因为它必须
(据我所知)重新复制整个数组,然后向其中添加下一个元素。如果您正在处理大型数据集并进行大量添加和删除条目,我建议您使用列表。
我刚刚将 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
在PS2.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 的计算属性,但我无法使宽度 属性 起作用,老实说,指定每个 属性 对于我正在输入的命令 & 运行 来说工作量太大了。我是否遗漏了其他命令,或者我是否对升级感到后悔?
我似乎在 V5.1 上工作得很好
我找不到将行为改回旧版本的解决方案, 但是:我能够写一些可能适合您需要的东西。
$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 }
另外,我想我会把我的两种感觉放在一个不相关的事情上。 随着数组规模的扩大,+= 运算符对性能不利,因为它必须 (据我所知)重新复制整个数组,然后向其中添加下一个元素。如果您正在处理大型数据集并进行大量添加和删除条目,我建议您使用列表。