Powershell-在哈希表中使用Array元素

时间:2019-12-22 06:03:08

标签: powershell hashtable

我有以下代码尝试将数组的值传递到哈希表中。但是无论我做什么,我都没有得到想要的输出(取而代之的是null)。 我对Powershell并不完全陌生(使用反复试验的概念做了很多事情)

以下只是整个脚本的一小部分。 $ ScriptBlock1变量包含到要从中检索数据的数据源的连接详细信息。

$var1 = & $ScriptBlock1 | Select-Object ColumnName | ForEach-Object {'"' + $_.ColumnName + '"'}
$Columns = $var1 -join ','

$ColumnsArray = $Columns -split ','
$ColumnsArray[0]    <-------- output of this is "OWNER"
$ColumnsArray[1]    <-------- output of this is "TABLE_NAME"

$data = & $ScriptBlock2 "| Select-Object $Columns"

$hashtable = [ordered]@{
"OWNER"      = ($data).$ColumnsArray[0];   <--- if I hardcode it to ($data."OWNER" it works)
"TABLE_NAME" = ($data).$ColumnsArray[1];   <--- if I hardcode it to ($data."TABLE_NAME" it works)
}
$hashtable | FT 

I have also tried using [pscustomobject], but I get the same problem.

使用数组元素值的想法是使脚本更具通用性,因此我可以一次又一次地使用它,而不必每次都进行过多编辑。

1 个答案:

答案 0 :(得分:0)

您必须将属性名称$ColumnsArray[0]视为表达式,并将其评估为字符串。您可以使用子表达式运算符$()来完成此操作。

$hashtable = [ordered]@{
"OWNER"      = $data.$($ColumnsArray[0])
"TABLE_NAME" = $data.$($ColumnsArray[1])
}

说明:

您正在使用成员访问运算符(.)来访问对象的($data)属性。 PowerShell需要属性名称的字符串。使用该语法,当PowerShell可以将变量干净地扩展为字符串时,变量就可以工作。但是,当您尝试访问该变量的属性或数组的索引时,扩展将停止于对变量名不合法的字符。在您的情况下,[是一个特殊字符,指示索引引用的开始,并且不会包含在字符串插值中。若要解决此问题,您可以将变量检索代码包装在子表达式运算符中。将评估子表达式的内部内容,并相应地输出结果。

$data.$ColumnsArray[0]的情况下,$data$ColumnsArray被扩展。然后执行.成员访问。然后,检索该结果的第一个索引[0]。由于$data.$ColumnsArray将检索$null,因此[0]索引将导致空数组异常。使用此语法扩展数组时,将对其进行字符串化。您可以通过运行"$ColumnsArray"看到这一点,它将以空格分隔的一个字符串输出所有数组元素。这是基于$OFS自动变量值的默认行为。

下面是您所看到的行为的一些示例。

# Setting up an example
$array = 'prop1','prop2'
$obj = [pscustomobject]@{'prop3' = 'value3'; 'prop1'='value1';'prop2'='value2'; 'prop1 prop2' = 'combined'}
# Show the object and its properties
$obj

prop3  prop1  prop2  prop1 prop2
-----  -----  -----  -----------
value3 value1 value2 combined

# Stringified Array Example: Notice the array elements space separated on a single line
"$array"
prop1 prop2

# Stringified Array In Member Access Operation
# This only retrieves a value because we created a property named 'prop1 prop2'
$obj.$array
combined

# Stringified Array In Member Access With an Index
# Index retrieval happens last in the evaluation
# Only outputs the first character as expected in $string[0]
$obj.$array[0]
c

# Using sub-expression with expected results
$obj.$($array[0])
value1