如何在Powershell中定义嵌套对象数组?

时间:2018-10-31 17:46:46

标签: arrays powershell multidimensional-array powershell-v4.0 anonymous-types

我有一个我需要识别和删除的密码列表,非开发人员维护此列表的最简单方法是通过类似于以下内容的声明:

$bannedCiphers = @{
    "RC4 128/128"=@{
        "IsPermitted" = $false
        "AffectedCiphers" = @{
                        "SSL_RSA_WITH_RC4_128_MD5",
                        "SSL_RSA_WITH_RC4_128_SHA",
                        "TLS_RSA_WITH_RC4_128_MD5",
                        "TLS_RSA_WITH_RC4_128_SHA"
        }
    } 
}

尽管我无法为Powershell中的嵌套对象创建正确的语法。

使用上述嵌套属性创建对象的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

这应该可以解决问题...

$bannedCiphers = @{
    "RC4 128/128"= @{
        "IsPermitted" = $false
        "AffectedCiphers" = @(
            "SSL_RSA_WITH_RC4_128_MD5",
            "SSL_RSA_WITH_RC4_128_SHA",
            "TLS_RSA_WITH_RC4_128_MD5",
            "TLS_RSA_WITH_RC4_128_SHA"
        )
    } 
}

此外,$bannedCiphers哈希表可以轻松地转换为JSON(并反过来)

啦...

$bannedCiphers | ConvertTo-Json

...输出:

{  
   "RC4 128/128":{  
      "IsPermitted":false,
      "AffectedCiphers":[  
         "SSL_RSA_WITH_RC4_128_MD5",
         "SSL_RSA_WITH_RC4_128_SHA",
         "TLS_RSA_WITH_RC4_128_MD5",
         "TLS_RSA_WITH_RC4_128_SHA"
      ]
   }
}

如果您首先使用JSON格式的数据,则可以将其导入PowerShell,例如:

$myJsonData = @"
    {  
       "RC4 128/128":{  
          "IsPermitted":false,
          "AffectedCiphers":[  
             "SSL_RSA_WITH_RC4_128_MD5",
             "SSL_RSA_WITH_RC4_128_SHA",
             "TLS_RSA_WITH_RC4_128_MD5",
             "TLS_RSA_WITH_RC4_128_SHA"
          ]
       }
    }
"@

$myNestedCiphers = $myJsonData | ConvertFrom-Json

答案 1 :(得分:0)

我想我会重新发布该答案,并使用自定义对象示例来进一步阐明代码。

没有pscustomobject的原始解决方案:

$bannedCiphers = @{
    "RC4 128/128"= @{
        "IsPermitted" = $false
        "AffectedCiphers" = @(
            "SSL_RSA_WITH_RC4_128_MD5",
            "SSL_RSA_WITH_RC4_128_SHA",
            "TLS_RSA_WITH_RC4_128_MD5",
            "TLS_RSA_WITH_RC4_128_SHA"
            )
        } 
    "Another RC4"= @{
        "IsPermitted" = $false
        "AffectedCiphers" = @(
            "Cipher1",
            "Cipher2",
            "Cipher3",
            "Cipher4"
            )
        } 
    }

此解决方案的输出将产生$ bannedCiphers输出:

Name                           Value
----                           -----
Another RC4                    {IsPermitted, AffectedCiphers}
RC4 128/128                    {IsPermitted, AffectedCiphers}

我的解决方案创建自定义对象:

$bannedCiphers2 = [pscustomobject]@{
    "RC4 128/128"= @{
        "IsPermitted" = $false
        "AffectedCiphers" = @(
            "SSL_RSA_WITH_RC4_128_MD5",
            "SSL_RSA_WITH_RC4_128_SHA",
            "TLS_RSA_WITH_RC4_128_MD5",
            "TLS_RSA_WITH_RC4_128_SHA"
            )
        } 
    "Another RC4"= @{
        "IsPermitted" = $false
        "AffectedCiphers" = @(
            "Cipher1",
            "Cipher2",
            "Cipher3",
            "Cipher4"
            )
        } 
    }

我的解决方案的输出将产生$ bannedCiphers2输出:

RC4 128/128                    Another RC4
-----------                    -----------
{IsPermitted, AffectedCiphers} {IsPermitted, AffectedCiphers}

原始:

$bannedCiphers | Select-Object *

IsReadOnly     : False
IsFixedSize    : False
IsSynchronized : False
Keys           : {Another RC4, RC4 128/128}
Values         : {System.Collections.Hashtable, System.Collections.Hashtable}
SyncRoot       : System.Object
Count          : 2

vs:

$bannedCiphers2 | Select-Object *

RC4 128/128                    Another RC4
-----------                    -----------
{IsPermitted, AffectedCiphers} {IsPermitted, AffectedCiphers}

答案 2 :(得分:0)

您还可以在类中创建嵌套列表。

ERROR: tensorflow-1.15.0-cp37-cp37m-win_amd64.whl is not a supported wheel on this platform.

一个或多个子类可以作为变量 $child_list 嵌套在父类中。类为从 json 解析的可接受数据设置边界。