注文]のユースケース、新しい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)
解決
最初に私は尋ねることから始めます - なぜそれらを持っていないのですか?
私のプロジェクトのユースケースを考えることができます。ここでは、Build and DeployとYMLにPowerShellスクリプトを使用し、構成にYMLを使用します(使用 https://github.com/scottmuc/poweryaml )
YMLの構成は、ハッシュテーブルとして読み取られます。タスクは、YMLのようにデータベースへの展開、IISへの展開、展開サービスなどで指定されています。データベースの展開を行い、その後、Webサイトの展開を行い、後で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にあります(プログラミングでは多くのユースケースがあります)。
他のヒント
これは、実際には、c#でexpandooobjectまたはjavascriptで動的オブジェクトを使用する方法のように、オンザフライオブジェクトを作成するのに特に役立ちます。 PowerShellの以前のバージョンでこれを行うことの問題は、 @{}
(これはレギュラーになります HashTable
)キーの注文を失うので、これらを画面に表示するのは巨大なピタです。
このことを考慮。
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]
タイプ、キーオーダーが保持され、迅速で汚れたパワーシェル構文を、すべてのオーバーヘッドとパフォーマンスの問題を迅速に構築するためのJSONとほぼ同じくらい便利になります Add-Member
また Select-Object
.
偶然ではないが、PowerShell V3には別の追加があります。に似ている [Ordered]
実際に指定できます [PSCustomObject]
代わりは。これにより、実際のものが作成されます PSObject
別の呼び出しを要求する代わりに、最初からすぐに New-Object
. 。確かに言うことはできませんが、私はそれがかなり確信しています [Ordered]
それを実現するために、パーサーに行った変更の副作用でした。彼らがただのレギュラーから変換をしているだけなら Hashtable
, 、キーの元の注文を復元する方法はありません。
これは、2つのデータファイルをSQL結合(マージまたはジッピング)を実行するのに役立ちます。ファイルはCSVまたはJSONかもしれません。
最初のファイルからハッシュテーブルを構築し、2番目のファイルからデータをマージまたは使用してから、変更をディスクまたはスクリプトの次のステップにストリーミングします。
順序付け]を使用すると、元のファイルと同じ注文を保持できますが、ハッシュテーブルのように使用できます。
情報のタブを構築し、タブをソートするPowerShellスクリプトで使用されているのを見てきました。たとえば、いくつかのサーバーからハードドライブ情報を取得します。各サーバーは独自のタブにあり、保存する前にサーバー名でタブをソートします。 「タブソート」コードは次のようになります。
$i=0;$wb.Worksheets | %{$i++;[ordered]@{$_.name=$i}}
- ギル