簡體   English   中英

如何更新 Powershell 哈希表中數組中的數組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM