[英]How do I update an array in an array in a hashtable in Powershell?
我正在使用 Powershell 所需的 state 配置並有一個單獨的定義文檔 (psd1) 我通過以下方式加載到 memory
$ConfigData = Import-PowerShellDataFile "$Path"
我想根據環境變量更新節點名稱。 整個 psd1 文件顯示它的類型為哈希表(名稱和基本類型在下面),然后 allnodes 顯示為一個數組,然后 nodename 顯示為另一個數組。
Hashtable System.Object
Object[] System.Array
Object[] System.Array
替換不會持續存在(如下所示)。 如果我嘗試將其分配回自身或副本,“無法在此 object 上找到屬性‘nodename’。驗證該屬性是否存在 yadda”
$ConfigData.AllNodes.NodeName -replace 'vms','vmp'
or
$ConfigDataHolder.AllNodes.NodeName = $ConfigData.AllNodes.NodeName -replace 'vms','vmp'
直接引用/分配不會持續存在,下面的 output 仍然是以前的服務器名,即使在克隆場景中也是如此。
$ConfigData.AllNodes.NodeName[2] = "something"
由於您在arrays上使用屬性訪問來訪問其元素的值,因此您正在利用成員訪問枚舉。
但是,成員訪問枚舉 - 按照設計- 僅適用於獲取值,而不適用於設置(更新)它們。
不幸的是,正如您所經歷的那樣,嘗試更新時的行為是模糊的:
當您嘗試將成員訪問枚舉屬性作為一個整體分配時,錯誤消息是模糊的:它告訴您不存在這樣的屬性,因為在設置時它只查看數組 object 本身,即使它確實找到了它在獲取時,當它查看 arrays元素時; 一個最小的例子:
$data = @{ arr = @(@{ subarr = 1, 2 }, @{ subarr = 3, 4 }) } #.. ERROR " property 'subarr' cannot be found on this object" $data,arr.subarr = @(42, 43)
如果你嘗試一個特定的索引(例如[2]
),但是應用索引的數組本身是通過成員訪問枚舉獲得的,賦值實際上是在一個臨時數組上運行的,因此被悄悄地有效丟棄; 一個最小的例子:
$data = @{ arr = @(@{ subarr = 1, 2 }, @{ subarr = 3, 4 }) } #,. IGNORED. because.arr.subarr is the result of #.! member-access enumeration. $data.arr.subarr[0] = 42
解決方案是單獨針對數組元素進行更新,可以使用單個索引(例如, [2]
),也可以在循環中逐個更新。
一個簡化的例子:
$configData = @{
AllNodes = @(
@{
NodeName = @(
'Node1a',
'Node1b'
)
},
@{
NodeName = @(
'Node2a',
'Node2b'
)
}
)
}
# OK: a specific element of *both* arrays involved - .AllNodes and .NodeName -
# is targeted and can therefore be assigned to.
$configData.AllNodes[0].NodeName[1] = 'NewNode1b'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.