在 PowerShell 单行中对数字进行舍入

Posted

技术标签:

【中文标题】在 PowerShell 单行中对数字进行舍入【英文标题】:Round a number in PowerShell one-liner 【发布时间】:2014-12-08 14:42:04 【问题描述】:

我正在使用 VMWare 的 PowerCLI 运行此命令以从 vCenter 输出各种清单。

Get-VM | Select-Object Name,MemoryGB,NumCpu,UsedSpaceGB,@n="TotalHDSizeGB"; e=(Get-HardDisk -VM $_ |Measure-Object -Sum CapacityGB).Sum,@n="Network"; e=(Get-NetworkAdapter -VM $_ |Select -unique -expand NetworkName)Sort-Object Network|Export-Csv -Path vms.csv

我想对 UsedSpaceGB 进行四舍五入并列出所有 NetworkName 值,而不仅仅是一个。我已经看到如何使用 [Math]::Round() 对脚本中的数字进行四舍五入,但我无法在命令行上找到示例,并且我的尝试未能达到预期的结果。我怎么做?

【问题讨论】:

【参考方案1】:

尝试使用以下代替 UsedSpaceGB:

@ n="SpaceUsedGB"; e=[math]::round( $_.UsedSpaceGB, 3 )

这会将 UsedSpaceGB 四舍五入到小数点后 3 位,并将字段命名为 SpaceUsedGB。要四舍五入到最接近的整数,请将3 更改为0,或者直接使用:

@ n="SpaceUsedGB"; e=[math]::round( $_.UsedSpaceGB )

如果您不想将 NetworkNames 作为数组返回,而只是作为排序字符串返回,则可以将该表达式更改为:

@n="Network"; e=(Get-NetworkAdapter -VM $_ | sort-object NetworkName | Select -unique -expand NetworkName) -join ', '

因为我的 TotalHDSizeGB 在某些情况下也有很多小数位,所以我的最终版本命令如下所示:

get-vm | Select-Object Name, MemoryGB, NumCpu, @ n="DiskUsedGB"; e=[math]::round( $_.UsedSpaceGB ), @ n="TotalHDSizeGB"; e=[math]::round((Get-HardDisk -vm $_ | Measure-Object -Sum CapacityGB).Sum), @n="Network"; e=(Get-NetworkAdapter -VM $_ | sort-object NetworkName | Select -unique -expand NetworkName) -join ', ' | Export-Csv -Path vms.csv

【讨论】:

谢谢猎人。我在第一次尝试中非常接近,但做得不太对。第二个,我不知道。你省了我更多的摸索。我需要记住 -join 的东西。我确定我过去可以使用它。

以上是关于在 PowerShell 单行中对数字进行舍入的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PL-SQL 中舍入数字?

Powershell:将分数转换为整数 - 令人惊讶的舍入行为

准确预测任意浮点格式之间转换的舍入误差

如何在猪脚本中对单行中的字段进行总计?

powershell 舍入并转换为GB

RoundTo()舍入的差异