[ordered]的用例,新的PowerShell 3.0功能

Rom*_*min 11 powershell powershell-3.0

PowerShell 3.0 CTP1引入了一个新功能[ordered],它有点像OrderedDictionary.我无法想象它的实际用例.为什么这个功能真的有用?有人可以提供一些有用的例子吗?

例如:这是,恕我直言,而不是实际的演示案例:

$a = [ordered]@{a=1;b=2;d=3;c=4}
Run Code Online (Sandbox Code Playgroud)

(我不介意它是否仍然有用,那我只是在寻找其他有用的案例).

我不是在寻找用例OrderedDictionary,确实很有用.但我们可以直接在v2.0中使用它(我做了很多).我试图理解为什么还[ordered]需要这个新功能.


从答案收集的用例:

$hash = [ordered]@{}
Run Code Online (Sandbox Code Playgroud)

比...短

$hash = New-Object System.Collections.Specialized.OrderedDictionary
Run Code Online (Sandbox Code Playgroud)

NB ordered不是该类型的真正捷径.New-Object ordered不起作用.

注2:但这仍然是一个很好的捷径,因为(我认为,不能尝试)它创建典型的PowerShell不区分大小写的字典.v2.0中的等效命令实际上太长了:

New-Object System.Collections.Specialized.OrderedDictionary]([System.StringComparer]::OrdinalIgnoreCase)
Run Code Online (Sandbox Code Playgroud)

Jos*_*osh 11

这实际上对于创建动态对象排序特别有用,就像在C#中使用ExpandoObject或在JavaScript中使用动态对象一样.在PowerShell的早期版本中执行此操作的问题在于@{}(它变为常规版本HashTable)会丢失您的密钥排序,因此将这些显示在屏幕上是一个巨大的PITA.

考虑一下.

foreach ($row in import-csv blah.csv) {

  # In v3: $obj = [Ordered]@{

  $obj = @{
    Name      = $row.Name
    Exists    = Test-Path $row.FileName
    OtherProp = 123
    Blah      = "derp"
    Timestamp = Get-Date
  }

  New-Object PSObject -Property $Obj

}
Run Code Online (Sandbox Code Playgroud)

在PowerShell v2中,列顺序是不可预测的,因为Hashtable它不保留键的顺序.在PowerShell v3中,如果您使用了[Ordered]类型,则会保留键顺序,使得快速而脏的PowerShell语法几乎与JSON一样方便,可以快速构建对象结构,而不会产生与Add-Member或相关的所有开销和性能问题Select-Object.

并非巧合,PowerShell v3还有另外一个补充.与[Ordered]您实际上可以指定相似[PSCustomObject].这将从一PSObject开始就创建一个实际权利,而不是需要单独调用New-Object.我不能肯定地说,但我很确定这[Ordered]是他们对解析器所做的更改的副作用.如果他们只是从常规进行转换,则Hashtable无法恢复密钥的原始顺序.


man*_*lds 9

首先,我将首先询问 - 为什么不让它们?

我可以想一下我的项目中的一个用例,我们使用Powershell脚本进行构建和部署,使用yml进行配置(使用https://github.com/scottmuc/PowerYaml)

来自yml的配置作为哈希表读入.任务在yml中指定,如部署到数据库,部署到iis,部署服务等.我想进行数据库部署,然后进行网站部署,这样我就可以避免iisreset了.目前我必须明确地看一下.现在,我可以有一个Ordered哈希表并首先指定部署数据库,因此它首先发生.

片段:

function Convert-YamlMappingNodeToHash($node)
{
    $hash = @{}
    $yamlNodes = $node.Children

    foreach($key in $yamlNodes.Keys)
    {
        $hash[$key.Value] = Explode-Node $yamlNodes[$key]
    }
    return $hash
}
Run Code Online (Sandbox Code Playgroud)

现在$hash =@{}变成了$hash=[ordered]@{}

我不知道这对于膨胀的产品意味着什么.OrderedDictionary存在于.NET中(我在编程中有很多用例),他们刚刚为它添加了一个加速器.