我目前正在尝试从System.Object []中提取信息,但我希望只从n
中获取Col1
和Col2
,因为它有很多不必要的内容列。
设置:
$var
所需:
$var =
.. Col1 Col2
.. 1 2147483648
.. 2 524288000
.. 3 268435456000
.. 4 268435456000
我可以使用下面的代码获得所需的Col3:
$res=
.. Col1 Col2 Col3
.. 1 2147483648 2 GB
.. 2 524288000 500 MB
.. 3 268435456000 250 GB
.. 4 268435456000 250 GB
然而,这只是显示Col3而不是其他列,我想要的是通过选择列和使用列表达式来获得某种哈希表但是如果我将条件语句放在一个列表中,我就无法得到任何东西IF和一个ELSE在下面的代码中的表达式中:
foreach($t in $var)
{
if($t.Col2% ([math]::pow(1024,3)))
{
$t.Col2/([math]::pow(1024,2))" MB"
}
else
{
$t.Col2/([math]::pow(1024,3))" GB"
}
}
我的主要目标是提取这些列并将它们大量插入到SQL中的表中,但我无法使用ELSE表达式,但如果我只指定IF条件,那么它似乎可以工作。
我想知道这是否是对powershell中哈希表的表达式中的IF-ELSE语句的限制。
答案 0 :(得分:2)
您应该在对象中添加ScriptProperty
来计算它,然后将其称为常规属性。定义脚本属性使用Add-Member
和脚本块,但使用$this
代替$_
来引用当前对象。
$var | Add-Member -MemberType ScriptProperty -Name DisplaySize -Value {
if($this.Col2 % ([math]::pow(1024,3)))
{
$this.Col2/([math]::pow(1024,2))"MB"
}
else
{
$this.Col2/([math]::pow(1024,3))"GB"
}
}
} -Force
$var[0].DisplaySize
您也知道,PowerShell包含KB / MB / GB /等的简写语法:
1MB # equivalent to writing 1048576
3TB # equivalent to writing 3298534883328
答案 1 :(得分:0)
#Solution 1, with column builded in select, condensed
$var | select *, @{N="DisplaySize";E={ "{0} {1}" -f @(if($this.Col2 % ([math]::pow(1024,3))) {($this.Col2/1MB), "MB"} else {($this.Col2/1GB), "GB"} ) }}
#Solution 2, with column builded in select, explain
$var | select *, @{N="DisplaySize";E={
if($this.Col2 % ([math]::pow(1024,3)))
{
"{0} MB" -f ($this.Col2/1MB)
}
else
{
"{0} GB" -f ($this.Col2/1GB)
}
}}
#Solution 3, with column builded, logique to take 2 columns
$var | select *, @{N="DisplaySizeMB";E={$this.Col2/1MB}}, @{N="DisplaySizeGB";E={$this.Col2/1GB}}