Question

PowerShell 3.0 CTP1 introduit une nouvelle fonctionnalité [ordered] qui est un peu un raccourci pour OrderedDictionary. Je ne peux pas imaginer des cas d'utilisation pratique de celui-ci. Pourquoi est cette fonction vraiment utile? Quelqu'un peut-il donner des exemples utiles?

Exemple: ceci est, à mon humble avis, cas plutôt démonstration que pratique:

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

(je ne me dérange pas s'il est toujours utile, alors je suis à la recherche d'autres cas utiles).

Je ne cherche pas les cas d'utilisation de OrderedDictionary, il est utile, en effet. Mais nous pouvons l'utiliser directement dans v2.0 (et je fais beaucoup). Je suis en train de comprendre pourquoi cette nouvelle fonctionnalité [ordered] nécessaire en plus.


cas d'utilisation de réponses recueillies:

$hash = [ordered]@{}

est plus courte que

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

N.B.. ordered est pas un vrai raccourci pour le type. New-Object ordered ne fonctionne pas.

N.B.. 2: Mais cela reste un bon raccourci parce que (je pense, ne peut pas essayer), il crée typique pour le cas PowerShell dictionnaire insensible. La commande équivalente v2.0 est trop long, en effet:

New-Object System.Collections.Specialized.OrderedDictionary]([System.StringComparer]::OrdinalIgnoreCase)
Était-ce utile?

La solution

Tout d'abord je vais commencer par demander - Pourquoi pas eux?

Je ne peux penser à un cas d'utilisation dans mon projet où nous utilisons des scripts Powershell pour construire et déployer et YML pour config (en utilisant https: // github.com/scottmuc/PowerYaml )

La configuration de YML est lu comme hashtables. Les tâches sont précisées dans le YML comme Déployez la base de données, le déploiement, le service à iis deploy et ainsi de suite. Je voudrais faire la deploy base de données, puis deploy site web afin que je puisse éviter iisreset après. À l'heure actuelle, je dois regarder explicitement à ce sujet. Maintenant, je peux avoir une table de hachage Ordonné et spécifiez la base de données et le déploiement du premier d'où il arrive en premier.

Snippet:

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

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

Maintenant, le $hash =@{} se $hash=[ordered]@{}

Je ne sais pas comment cela signifie pour un produit pléthorique. OrderedDictionary est là dans .NET (j'ai beaucoup de cas d'utilisation pour elle dans la programmation) et ils venez d'ajouter un accélérateur pour elle.

Autres conseils

Il est en fait particulièrement utile pour créer sur la volée des objets sorta comme la façon dont vous utilisez ExpandoObject en C # ou des objets dynamiques en JavaScript. Le problème avec le faire dans les versions antérieures de PowerShell est que @{} (qui devient HashTable régulière) perd votre commande de clés il est donc un énorme PITA pour afficher ces à l'écran.

Considérez ceci.

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

}

Dans v2 PowerShell, l'ordre des colonnes est imprévisible car le Hashtable ne conserve pas l'ordre des clés. Dans la version 3 PowerShell, si vous avez utilisé le type de [Ordered], l'ordre clé est conservée, ce qui rend la syntaxe PowerShell rapide et sale presque aussi pratique que JSON pour construire rapidement des structures d'objet sans tous les problèmes généraux et de performance associées à Add-Member ou Select-Object.

Non par hasard, il y a un autre ajout à v3 PowerShell. Similaire à [Ordered] vous pouvez réellement spécifier [PSCustomObject] à la place. Cela va créer un droit de PSObject réelle dès le départ au lieu d'exiger un appel séparé à New-Object. Je ne peux pas dire pour sûr, mais je suis sûr que [Ordered] était un effet secondaire des changements qu'ils ont apportés à l'analyseur pour y arriver. Si elles ne faisaient que la conversion d'une Hashtable régulière, il n'y aurait aucun moyen de rétablir l'ordre initial des clés.

Ceci est utile pour faire une JOIN SQL (fusion alias ou passer comme un éclair) deux fichiers de données. Peut-être que les fichiers sont CSV ou JSON.

Vous voudriez construire une table de hachage à partir du premier fichier, fusion ou données d'utilisation du second fichier, puis les flux rebascule sur le disque ou à l'étape suivante du script.

[ordonné] vous pouvez garder le même ordre du fichier original, mais toujours l'utiliser comme un Hashtable.

Je l'ai vu utilisé dans les scripts PowerShell onglets de construction de l'information et de trier les onglets. Par exemple, la récupération des informations sur le disque dur de plusieurs serveurs, chaque serveur dans son propre onglet, puis trier les onglets par nom du serveur avant d'enregistrer. Le code « genre onglet » ressemble à ceci:

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

-Gill

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top