Frage

PowerShell 3.0 CTP1 führt eine neue Funktion vor [ordered] Welches ist eine Verknüpfung für OrderedDictionary. Ich kann mir praktische Anwendungsfälle davon nicht vorstellen. Warum ist diese Funktion wirklich nützlich? Kann jemand einige nützliche Beispiele liefern?

Beispiel: Dies ist IMHO, eher Demo -Fall als praktisch:

$a = [ordered]@{a=1;b=2;d=3;c=4}

(Es macht mir nichts aus, ob es noch nützlich ist, dann suche ich nur nach anderen nützlichen Fällen).

Ich suche keine Anwendungsfälle von OrderedDictionary, Es ist in der Tat nützlich. Aber wir können es direkt in V2.0 verwenden (und ich mache viel). Ich versuche zu verstehen, warum diese neue Funktion ist [ordered] zusätzlich benötigt.


Gesammelte Anwendungsfälle aus Antworten:

$hash = [ordered]@{}

ist kürzer als

$hash = New-Object System.Collections.Specialized.OrderedDictionary

NB ordered ist keine echte Abkürzung für den Typ. New-Object ordered funktioniert nicht.

NB 2: Aber dies ist immer noch eine gute Abkürzung, weil (ich denke nicht versuchen kann), dass es typisch für PowerShell -Fall -Unempfindlichkeitswörterbuch ist. Der äquivalente Befehl in v2.0 ist in der Tat zu lang:

New-Object System.Collections.Specialized.OrderedDictionary]([System.StringComparer]::OrdinalIgnoreCase)
War es hilfreich?

Lösung

Zuerst werde ich zunächst fragen - warum nicht sie haben?

Ich kann mir einen Anwendungsfall in meinem Projekt vorstellen, in dem wir PowerShell -Skripte für Build und Bereitstellen und YML für die Konfiguration verwenden https://github.com/scottmuc/poweryaml )

Die Konfiguration von YML wird als Hashtables gelesen. Die Aufgaben werden in der YML -Bereitstellung in Datenbank, Bereitstellung für IIS, Bereitstellung von Dienst usw. angegeben. Ich möchte die Datenbankbereitstellung und dann die Website -Bereitstellung durchführen, damit ich anschließend iisreset vermeiden kann. Derzeit muss ich mir das ausdrücklich ansehen. Jetzt kann ich eine bestellte Hash -Tabelle haben und zuerst die Bereitstellung der Datenbank angeben und daher zuerst geschieht.

Snippet:

function Convert-YamlMappingNodeToHash($node)
{
    $hash = @{}
    $yamlNodes = $node.Children

    foreach($key in $yamlNodes.Keys)
    {
        $hash[$key.Value] = Explode-Node $yamlNodes[$key]
    }
    return $hash
}

Jetzt die $hash =@{} werden $hash=[ordered]@{}

Ich weiß nicht, wie dies für ein aufgeblähtes Produkt bedeutet. Bestellter Dotionary befindet sich in .NET (ich habe viele Anwendungsfälle dafür im Programmieren) und sie haben gerade einen Gaspedal hinzugefügt.

Andere Tipps

Dies ist eigentlich besonders nützlich, um Objekte im Laufe der Fliege zu erstellen, wie Sie EXTODOObject in C# oder dynamischen Objekten in JavaScript verwenden würden. Das Problem dabei, dies in früheren Versionen von Powershell zu tun, ist das @{} (was regelmäßig wird HashTable) verliert die Tastenbestellung, daher ist es eine riesige Pita, diese auf dem Bildschirm anzuzeigen.

Bedenken Sie.

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

}

In PowerShell V2 ist die Säulenordnung unvorhersehbar, weil die Hashtable behält nicht die Reihenfolge der Schlüssel. In PowerShell v3, wenn Sie das verwendet haben [Ordered] Typ, die Schlüsselbestellung wird erhalten, sodass die schnelle und schmutzige PowerShell -Syntax so bequem wie JSON für schnelles Aufbau von Objektstrukturen ohne alle mit dem miteinander verbundenen Overhead- und Leistungsproblemen macht Add-Member oder Select-Object.

Nicht zufällig gibt es eine weitere Ergänzung zu Powershell V3. Ähnlich zu [Ordered] Sie können tatsächlich angeben [PSCustomObject] stattdessen. Dies erzeugt eine tatsächliche PSObject Von Anfang an, anstatt einen separaten Anruf zu benötigen New-Object. Ich kann nicht sicher sagen, aber das bin ich mir ziemlich sicher [Ordered] war ein Nebeneffekt der Änderungen, die sie dem Parser vorgenommen haben, um dies zu erreichen. Wenn sie nur eine Konvertierung von einem Stammgast durchführten Hashtable, Es würde keine Möglichkeit geben, die ursprüngliche Reihenfolge der Schlüssel wiederherzustellen.

Dies ist nützlich, um zwei Datendateien mit einem SQL -Join (auch bekannt als Zusammenführung oder Reißverschluss) durchzuführen. Vielleicht sind die Dateien CSV oder JSON.

Sie möchten einen Hashtable aus der ersten Datei erstellen, Daten aus der zweiten Datei zusammenschließen oder verwenden, und dann die Änderungen wieder auf die Festplatte oder in den nächsten Schritt des Skripts streamen.

Mit [bestellt] können Sie dieselbe Reihenfolge der Originaldatei aufbewahren, sie aber dennoch wie ein Hashtable verwenden.

Ich habe gesehen, dass es in PowerShell -Skripten verwendet wurde, die Registerkarten der Information erstellen und die Registerkarten sortieren. Abrufen Sie beispielsweise Festplatteninformationen von mehreren Servern, jedem Server in seiner eigenen Registerkarte, und sortieren die Registerkarten vor dem Speichern nach Servernamen. Der Code "Tab -Sortier" sieht folgendermaßen aus:

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

-Kieme

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top