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

时间:2011-10-18 04:26:56

标签: powershell powershell-v3.0

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

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

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

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

4 个答案:

答案 0 :(得分: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

}

在PowerShell v2中,列顺序是不可预测的,因为Hashtable不保留键的顺序。在PowerShell v3中,如果使用[Ordered]类型,则保留密钥顺序,使得快速和脏的PowerShell语法几乎与JSON一样方便,可快速构建对象结构,而不会产生与{{{{{{{{ 1}}或Add-Member

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

答案 1 :(得分: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
}

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

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:2)

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

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

-Gill