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

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

NB 2:但这仍然是一个很好的捷径,因为(我认为,无法尝试)它为PowerShell案例不敏感的词典创造了典型的捷径。 v2.0中的等效命令确实太长了:

New-Object System.Collections.Specialized.OrderedDictionary]([System.StringComparer]::OrdinalIgnoreCase)
有帮助吗?

解决方案

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

我可以想到我的项目中的用例 https://github.com/scottmuc/poweryaml )

YML的配置读取为Hashtables。这些任务是在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]@{}

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

其他提示

实际上,这对于创建直通对象特别有用,例如如何在JavaScript中使用C#或Dynamic对象中的ExpanialObject。在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-Member 或者 Select-Object.

并非偶然,Powershell V3还有另一个补充。如同 [Ordered] 您实际上可以指定 [PSCustomObject] 反而。这将创建一个实际 PSObject 从一开始就不需要单独的呼叫 New-Object. 。我不能肯定地说,但我很确定 [Ordered] 是他们对解析器进行的更改的副作用。如果他们只是从普通的 Hashtable, ,无法恢复钥匙的原始顺序。

这对于执行SQL JON(又称合并或拉链)两个数据文件很有用。也许文件是CSV或JSON。

您需要从第一个文件构建一个标签,合并或使用第二个文件中的数据,然后将更改流回到磁盘或脚本的下一步。

使用[订购],您可以保留原始文件的相同顺序,但仍然像标签一样使用它。

我已经看到它在PowerShell脚本中使用,这些脚本构建信息的选项卡并对选项卡进行排序。例如,从几个服务器中检索硬盘驱动器信息,每个服务器在其自己的选项卡中,然后在保存之前按服务器名称对选项卡进行排序。 “ TAB Sort”代码看起来像这样:

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

-鳃

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top