有序],新的PowerShell 3.0功能的用例
-
22-10-2019 - |
题
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}}
-鳃