我有以下代码尝试将数组的值传递到哈希表中。但是无论我做什么,我都没有得到想要的输出(取而代之的是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.
使用数组元素值的想法是使脚本更具通用性,因此我可以一次又一次地使用它,而不必每次都进行过多编辑。
答案 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