Powershell中的Variablize方法调用

时间:2015-07-01 21:21:23

标签: powershell

我正在寻找一种动态调用函数的方法或属性的方法。例如,我想要调用$ Error [0]的每个属性。我可以通过以下方式获取所有属性名称的列表:

$a = ($error[0] | get-member -type property | select Name)

我想做这样的事情:

foreach($b in $a){
     $error[0].&($b.Name)
}

但是调用运算符(&)并没有像我期望的那样解析$ b.Name(它应该解析为'CatagoryInfo')。无论如何都要做这样的事情吗?

3 个答案:

答案 0 :(得分:0)

您可以使用Invoke-Expression

$a = ($error[0] | get-member -type property | select Name)

foreach($b in $a){
     Invoke-Expression "`$error[0].$($b.Name)"
}

答案 1 :(得分:0)

只需删除&

$a = ($error[0] | get-member -type property | select Name)

foreach($b in $a){
     $error[0].($b.Name)
}

答案 2 :(得分:0)

您可以使用不同的方式来检索属性:

$Properties=$Error[0].PSObject.Properties

这将返回PSPropertyInfo个对象的集合。 PSPropertyInfo个对象具有Value属性,您可以使用该属性来获取或设置属性值:

$Properties|ForEach-Object {'Name={0}; Value={1}'-f$_.Name,$_.Value}

还要注意检索属性值的一些可能的问题。 PowerShell允许您使用属性语法访问IDictionary元素。这里的问题是PowerShell更喜欢访问集合元素而不是实际属性:

$Hashtable=@{}
$Hashtable.Count
# 0
$Hashtable.Add('SomeName',10)
$Hashtable.SomeName
# 10
$Hashtable.Count
# 1
$Hashtable.Add('Count',20)
$Hashtable.Count
# 20
$Hashtable|Select-Object -ExpandProperty Count
# 2