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

Arrays 如何在Powershell中定义嵌套对象数组?,arrays,powershell,multidimensional-array,powershell-4.0,anonymous-types,Arrays,Powershell,Multidimensional Array,Powershell 4.0,Anonymous Types,我有一个需要识别和删除的密码列表,非开发人员维护该列表的最简单方法是通过类似于以下内容的声明: $bannedCiphers = @{ "RC4 128/128"=@{ "IsPermitted" = $false "AffectedCiphers" = @{ "SSL_RSA_WITH_RC4_128_MD5", "SSL_RSA_WITH_RC4_128_S

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

$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中的嵌套对象创建正确语法时遇到困难


创建具有上述嵌套特性的对象的正确方法是什么

这应该可以做到

$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(并返回)

A洛杉矶

$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

我想我会重新发布这个答案,并使用自定义对象示例进一步澄清我的代码

没有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"
            )
        } 
    }
此解决方案的输出将产生$BannedChipers输出:

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"
            )
        } 
    }
我的解决方案的输出将产生$BannediPhone 2输出:

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:


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

class cChild{
[string] $id
[string] $field1
}

class cParent{
[string] $id
[string] $field1
[cChild[]] $child_list
}

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

我将使用
Name=[string]
IsPermitted=[bool]
AffectedCiphers=[array]
创建一个自定义对象。可以存储在数组或其他集合类型中的。如果您有许多这样的条目(所有条目都具有唯一的键),并且需要快速查找它们,那么可能需要一个哈希表。他的问题更多的是关于数据类型与对象类型的问题—为什么需要创建
PSCustomObject
?实用性在哪里?这是一种松散类型的脚本语言。。。你应该利用这一点,或者换成C#这不是苹果对苹果。。。您正在发现数据类型与对象类型之间的差异。。。在现实生活中你不会这么做的
$bannedCiphers |选择对象*
您只需执行
$bannedCiphers
-在实践中,无论
PsCustomObject
与否,就OP而言,它们都执行相同的操作。。为了回答OP的问题,我提供了一个基于数据类型的答案。@MattOestreich嗨,Matt,是的,我知道。我将变量管道化以选择object*,是为了显示两者之间的差异。两人最终都会完成任务。不用担心!
$bannedCiphers | Select Object*
的输出以及此:
$bannedCiphers2 | Select Object*
概述了这些对象类型包含的属性。
PSCustomObject
是“自定义”类型-哈希表不是自定义类型-它是在某个类中定义的“数据类型”。执行此操作时,您会看到该类的属性:
$bannedCiphers | Select Object*
该“数据类型”
hashtable
包含一个键/值对-
PSCustomObject
不同-它是自定义的。。。因此,该类型的属性也不同-这不会更改任何类型后面的数据。
class cChild{
[string] $id
[string] $field1
}

class cParent{
[string] $id
[string] $field1
[cChild[]] $child_list
}