I casi d'uso di [ordinata], la nuova funzionalità di PowerShell 3.0
-
22-10-2019 - |
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 ??p>
$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)
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