12

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

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

$a = [ordered]@{a=1;b=2;d=3;c=4}

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

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


从答案中收集的用例:

$hash = [ordered]@{}

短于

$hash = New-Object System.Collections.Specialized.OrderedDictionary

NBordered并不是该类型的真正快捷方式。New-Object ordered不起作用。

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

New-Object System.Collections.Specialized.OrderedDictionary]([System.StringComparer]::OrdinalIgnoreCase)
4

4 回答 4

13

这实际上对于创建动态对象特别有用,类似于在 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

}

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

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

于 2012-05-01T20:45:47.523 回答
9

首先我会问 - 为什么不拥有它们?

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

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

片段:

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

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

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

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

于 2011-10-18T04:44:34.657 回答
2

这对于执行 SQL 连接(也称为合并或压缩)两个数据文件很有用。也许这些文件是 CSV 或 JSON。

您希望从第一个文件构建哈希表,合并或使用第二个文件中的数据,然后将更改流式传输回磁盘或脚本的下一步。

使用 [ordered] 您可以保持与原始文件相同的顺序,但仍可以像哈希表一样使用它。

于 2013-10-19T21:50:36.387 回答
2

我已经看到它在构建信息选项卡并对选项卡进行排序的 powershell 脚本中使用。例如,从多个服务器检索硬盘信息,每个服务器在其自己的选项卡中,然后在保存之前按服务器名称对选项卡进行排序。“标签排序”代码如下所示:

$i=0;$wb.Worksheets | %{$i++;[ordered]@{$_.name=$i}}

-鳃

于 2013-12-02T15:41:09.510 回答