【问题标题】:Use cases of [ordered], the new PowerShell 3.0 feature[ordered] 的用例,新的 PowerShell 3.0 功能
【发布时间】:2011-12-09 18:51:18
【问题描述】:

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

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

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

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

【问题讨论】:

  • 其实是$hash = New-Object System.Collections.Specialized.OrderedDictionary
  • 谢谢,已更正。所以是的,它节省了打字时间。但这就是全部吗?
  • 那么[xml][datetime][hashtable] 以及包括[int] 在内的许多其他人呢——毕竟它们被称为加速器。
  • 是的,但是这个加速器与上面提到的不同。它不是类型的快捷方式。但它使用相同的语法。这令人困惑。到目前为止,它加速时唯一真正的用例是 [ordered]@{} 带有 empty 哈希表(我不认为带有硬编码值的示例真的有用)。我不会只为此添加功能。我一定错过了其他有用的东西,这就是我问这个问题的原因。
  • 也许等到最终版本?毕竟现在是 CTP。

标签: powershell dictionary powershell-3.0


【解决方案1】:

这实际上对于创建动态对象特别有用,类似于在 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-Member 或相关的所有开销和性能问题Select-Object.

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

【讨论】:

  • 最后一点,使用[PSCustomObject] 来制作“对象文字”,是黄金。比New-Object psobject -Prop 好多了。您应该添加一个代码示例,这样人们就不会错过它。即使我猜它没有回答问题。
【解决方案2】:

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

我可以在我的项目中想到一个用例,我们使用 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 中(我在编程中有很多用例),他们刚刚为它添加了一个加速器。

【讨论】:

  • “为什么不拥有它们?”...如果这是唯一的原因,那么这也许是产品臃肿的一种方式。
  • 记录了 1 个用例([ordered]@{} vs. New-Object System.Collections.OrderedDictionary)。请注意:我想以同样的方式为 ArrayList 提供一个加速器 [list]。实际上,我使用 ArrayList 比使用 OrderedDictionary 更频繁。当然,也许只有我一个人。
  • 那么你是从有New-Object System.Collections.OrderedDictionary的时候为什么现在订购的角度来问问题的?
  • 这真的是捷径吗?我还没有 v3.0 可以尝试。这行得通吗:New-Object ordered?
  • "当有 New-Object System.Collections.OrderedDictionary 为什么现在才订购?" - 是的,这是原因之一。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

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

    -吉尔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多