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)
答案 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