Pregunta

PowerShell 3.0 CTP1 presenta una nueva característica [ordered] que es algo atajo para OrderedDictionary. No puedo imaginar casos de uso prácticos de ello. ¿Por qué esta característica es realmente útil? ¿Alguien puede proporcionar algunos ejemplos útiles?

Ejemplo: este es, en mi humilde opinión, más bien un caso de demostración que práctico:

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

(No me importa si todavía es útil, entonces solo estoy buscando otros casos útiles).

No estoy buscando casos de uso de OrderedDictionary, es útil, de hecho. Pero podemos usarlo directamente en v2.0 (y hago mucho). Estoy tratando de entender por qué esta nueva característica es [ordered] necesario además.


Casos de uso recopilados de respuestas:

$hash = [ordered]@{}

es más corto que

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

nótese bien ordered no es un atajo real para el tipo. New-Object ordered No funciona.

NB 2: Pero este sigue siendo un buen atajo porque (creo, no puedo intentarlo) crea típico para el diccionario insensible de PowerShell Case. El comando equivalente en v2.0 es demasiado largo, de hecho:

New-Object System.Collections.Specialized.OrderedDictionary]([System.StringComparer]::OrdinalIgnoreCase)
¿Fue útil?

Solución

Primero comenzaré preguntando: ¿por qué no tenerlos?

Puedo pensar en un caso de uso en mi proyecto donde utilizamos scripts de PowerShell para la compilación e implementación y YML para la configuración (usando https://github.com/scottmuc/poweryaml )

La configuración de YML se lee como hashtable. Las tareas se especifican en el YML como implementar en la base de datos, implementarse en IIS, implementar el servicio, etc. Me gustaría hacer la implementación de la base de datos y luego implementar el sitio web para poder evitar IISRESET después. Actualmente tengo que mirar explícitamente eso. Ahora, puedo tener una tabla hash ordenada y especificar la base de datos de implementación primero y, por lo tanto, sucede primero.

Retazo:

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

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

Ahora el $hash =@{} convertirse en $hash=[ordered]@{}

No sé cómo significa esto para un producto hinchado. OrderDdictionary está allí en .NET (tengo muchos casos de uso para ello en la programación) y acaban de agregar un acelerador para ello.

Otros consejos

Esto es realmente particularmente útil para crear objetos sobre la marcha como cómo usaría expandoObject en C# o objetos dinámicos en JavaScript. El problema de hacer esto en versiones anteriores de PowerShell es que @{} (que se convierte en un regular HashTable) pierde su pedido de llaves para que sea una gran pita mostrarlas en la pantalla.

Considera esto.

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

}

En PowerShell V2, el orden de la columna es impredecible porque el Hashtable no retiene el orden de las claves. En PowerShell V3, si usaste el [Ordered] Tipo, se conserva el orden de claves, lo que hace que la sintaxis de PowerShell rápida y sucia sea casi tan conveniente como JSON para construir rápidamente estructuras de objetos sin todos los problemas de sobrecarga y rendimiento asociados con Add-Member o Select-Object.

No coincidiendo, hay otra adición a PowerShell V3. Similar a [Ordered] realmente puedes especificar [PSCustomObject] en cambio. Esto creará un real PSObject desde el principio en lugar de requerir una llamada separada a New-Object. No puedo decir con certeza, pero estoy bastante seguro de que [Ordered] fue un efecto secundario de los cambios que hicieron en el analizador para que eso sucediera. Si solo estuvieran haciendo una conversión de un regular Hashtable, no habría forma de restaurar el orden original de las llaves.

Esto es útil para hacer una unión SQL (también conocida como fusionar o crecer) dos archivos de datos. Tal vez los archivos son CSV o JSON.

Desea construir una hashtable desde el primer archivo, fusionar o usar datos del segundo archivo, luego transmitir los cambios nuevamente al disco o al siguiente paso del script.

Con [ordenado] puede mantener el mismo orden del archivo original, pero aún así usarlo como un hashtable.

Lo he visto utilizado en scripts de PowerShell que crean pestañas de información y ordenan las pestañas. Por ejemplo, recuperar información del disco duro de varios servidores, cada servidor en su propia pestaña, luego ordenando las pestañas por nombre del servidor antes de guardar. El código de "sort de pestaña" se ve así:

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

-Branquia

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top