Domanda

PowerShell 3.0 CTP1 introduce una nuova funzionalità [ordered] che è un po 'una scorciatoia per OrderedDictionary. Non riesco a immaginare pratici casi d'uso di esso. Perché questa caratteristica davvero utile? Qualcuno può fornire alcuni esempi utili?

Esempio: questo è, secondo me, caso piuttosto demo che pratico:

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

(non mi importa se è ancora utile, allora io sono solo alla ricerca di altri casi utili).

Io non sono alla ricerca di casi d'uso di OrderedDictionary, è utile, anzi. Ma possiamo usarlo direttamente in v2.0 (e fare un sacco). Sto cercando di capire perché è questa nuova funzionalità [ordered] necessaria in aggiunta.


casi di utilizzo raccolti da risposte:

$hash = [ordered]@{}

è più corta

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

NB. ordered non è una vera scorciatoia per il tipo. New-Object ordered non funziona.

NB. 2: Ma questa è ancora una buona scorciatoia perché (credo, non può provare) crea tipico per dizionario insensitive caso PowerShell. Il comando equivalente in v2.0 è troppo lungo, anzi:

New-Object System.Collections.Specialized.OrderedDictionary]([System.StringComparer]::OrdinalIgnoreCase)
È stato utile?

Soluzione

Per prima cosa ho inizierà chiedendo - Perché non li hanno?

mi viene in mente un caso d'uso nel mio progetto in cui noi usiamo gli script PowerShell per creare e implementare e yml per config (utilizzando https: // github.com/scottmuc/PowerYaml )

La configurazione da yml viene letto come tabelle hash. I compiti sono specificati nel yml come implementare nel database, distribuire a IIS, il servizio implementare e così via. Mi piacerebbe fare il deploy del database e quindi implementare il sito in modo che possa evitare iisreset dopo. Attualmente devo guardare in modo esplicito a questo. Ora, posso avere una tabella hash ordinato e specificare il database Deploy prima e, quindi, succede prima.

Snippet:

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

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

$hash =@{} Ora il $hash=[ordered]@{} diventare

Non so come questo significa per un prodotto gonfio. OrderedDictionary c'è in .NET (ho un sacco di casi d'uso per esso in programmazione) e hanno appena aggiunto un acceleratore per esso.

Altri suggerimenti

Questo è in realtà particolarmente utile per la creazione on-the-fly oggetti sorta come come si usa ExpandoObject in C # o oggetti dinamici in JavaScript. Il problema di questa operazione nelle versioni precedenti di PowerShell è che @{} (che diventa HashTable regolare) perde vostra ordinazione di chiavi, quindi è un enorme valle di lacrime per visualizzare questi per lo schermo.

Si consideri questo.

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, l'ordine delle colonne è imprevedibile perché il Hashtable non mantiene l'ordine delle chiavi. In PowerShell v3, se è stato utilizzato il tipo [Ordered], l'ordine chiave viene mantenuto, rendendo la sintassi rapido e sporco PowerShell quasi così conveniente come JSON per costruire rapidamente strutture oggetto senza tutti i problemi ambientali e di prestazioni associati Add-Member o Select-Object.

Non a caso, v'è un'altra aggiunta alla PowerShell v3. Simile a [Ordered] si può effettivamente indicare [PSCustomObject] invece. Questo creerà un diritto reale PSObject dall'inizio invece di richiedere una chiamata separata a New-Object. Non posso dire per certo, ma io sono abbastanza sicuro che [Ordered] era un effetto collaterale dei cambiamenti che hanno fatto per il parser per realizzare questo obiettivo. Se fossero solo facendo una conversione da un Hashtable regolare, non ci sarebbe alcun modo per ripristinare l'ordine originale delle chiavi.

Questa funzione è utile per fare uno SQL join (aka la fusione o zippare) due file di dati. Forse i file sono in formato CSV o JSON.

Che ci si vuole costruire una tabella hash dal primo file, unione in uso o dati dal secondo file, quindi lo streaming le modifiche indietro al disco o alla fase successiva dello script.

Con [ordinata] è possibile mantenere lo stesso ordine del file originale, ma ancora utilizzarlo come una tabella hash.

l'ho visto usato in script PowerShell che le schede di compilazione di informazioni e di ordinamento delle schede. Ad esempio, il recupero delle informazioni sul disco rigido da più server, ogni server nella propria scheda, quindi l'ordinamento le schede in base al nome del server prima di salvare. Gli sguardi di codice "scheda tipo" come questo:

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

-Gill

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top