about_Hash_Tables
Descripción breve
Describe cómo crear, usar y ordenar tablas hash en PowerShell.
Descripción larga
Un hashtable, también conocido como diccionario o matriz asociativa, es una estructura de datos compacta que almacena uno o varios pares clave-valor. Por ejemplo, una tabla hash puede contener una serie de direcciones IP y nombres de equipo, donde las direcciones IP son las claves y los nombres de equipo son los valores, o viceversa.
En PowerShell, cada uno hashtable es un [System.Collections.Hashtable]
objeto . Puede usar las propiedades y los métodos de Hashtable objetos en PowerShell.
A partir de PowerShell 3.0, puede usar el [ordered]
acelerador de tipos para crear un [System.Collections.Specialized.OrderedDictionary]
objeto en PowerShell.
Los diccionarios ordenados difieren de las tablas hash en que las claves siempre aparecen en el orden en que se enumeran. El orden de las claves de un hashtable no es determinista.
Las claves y el valor de las tablas hash también son objetos .NET. Suelen ser cadenas o enteros, pero pueden tener cualquier tipo de objeto. También puede crear tablas hash anidadas, en las que el valor de una clave es otro hashtable.
Las tablas hash se usan con frecuencia porque son eficaces para buscar y recuperar datos. Puede usar tablas hash para almacenar listas y crear propiedades calculadas en PowerShell. Además, el ConvertFrom-StringData
cmdlet convierte los datos de cadena estructurados en un hashtable.
Sintaxis
La sintaxis de es hashtable la siguiente:
@{ <name> = <value>; [<name> = <value> ] ...}
La sintaxis de un diccionario ordenado es la siguiente:
[ordered]@{ <name> = <value>; [<name> = <value> ] ...}
El [ordered]
acelerador de tipos se introdujo en PowerShell 3.0.
Para crear un hashtable, siga estas instrucciones:
- hashtable Comience con un signo (
@
). - Encierre las hashtable llaves (
{}
). - Escriba uno o varios pares clave-valor para el contenido de hashtable.
- Use un signo igual (
=
) para separar cada clave de su valor. - Use un punto y coma (
;
) o un salto de línea para separar los pares clave-valor. - Las claves que contienen espacios deben incluirse entre comillas. Los valores deben ser expresiones de PowerShell válidas. Las cadenas deben aparecer entre comillas, aunque no incluyan espacios.
- Para administrar , hashtableguárdelo en una variable.
- Al asignar un pedido hashtable a una variable, coloque el
[ordered]
tipo delante del@
símbolo. Si lo coloca antes del nombre de la variable, se produce un error en el comando.
Puede usar diccionarios ordenados de la misma manera que se usan tablas hash. Cualquier tipo se puede usar como el valor de los parámetros que toman objetos hashtable de tipo o diccionario (iDictionary).
Creación de tablas hash y diccionarios ordenados
Tenga en cuenta los ejemplos de diccionarios siguientes hashtable y ordenados:
$hash = @{
1 = 'one'
2 = 'two'
'three' = 3
}
$hash
Name Value
---- -----
three 3
2 two
1 one
Como puede ver, los pares clave-valor de un hashtable no se presentan en el orden en que se definieron.
La manera más fácil de crear un diccionario ordenado es usar el [ordered]
atributo . Coloque el atributo inmediatamente antes del @
símbolo.
$dictionary = [ordered]@{
1 = 'one'
2 = 'two'
'three' = 3
}
$dictionary
Name Value
---- -----
1 one
2 two
three 3
A diferencia de las tablas hash, los diccionarios ordenados mantienen el orden del valor de clave.
Conversión de tablas hash y diccionarios ordenados
No se puede usar el [ordered]
acelerador de tipos para convertir o convertir un hashtable.
Si coloca el atributo ordenado antes del nombre de la variable, se produce un error en el comando con el siguiente mensaje de error.
[ordered]$orderedhash = @{}
ParserError:
Line |
1 | [ordered]$orderedhash = @{}
| ~~~~~~~~~~~~~~
| The ordered attribute can be specified only on a hash literal node.
Para corregir la expresión, mueva el atributo [ordenado].
$orderedhash = [ordered]@{}
Puede convertir un diccionario ordenado en un hashtable, pero no puede garantizar el orden de los miembros.
[hashtable]$newhash = [ordered]@{
Number = 1
Shape = "Square"
Color = "Blue"
}
$newhash
Name Value
---- -----
Color Blue
Shape Square
Number 1
Hashtable propiedades de diccionario y
Las tablas hash y los diccionarios ordenados comparten varias propiedades. Tenga en cuenta las $hash
variables y $dictionary
definidas en los ejemplos anteriores.
$hash | Get-Member -MemberType Properties, ParameterizedProperty
TypeName: System.Collections.Hashtable
Name MemberType Definition
---- ---------- ----------
Item ParameterizedProperty System.Object Item(System.Object key) {get;set;}
Count Property int Count {get;}
IsFixedSize Property bool IsFixedSize {get;}
IsReadOnly Property bool IsReadOnly {get;}
IsSynchronized Property bool IsSynchronized {get;}
Keys Property System.Collections.ICollection Keys {get;}
SyncRoot Property System.Object SyncRoot {get;}
Values Property System.Collections.ICollection Values {get;}
$dictionary | Get-Member -MemberType Properties, ParameterizedProperty
TypeName: System.Collections.Specialized.OrderedDictionary
Name MemberType Definition
---- ---------- ----------
Item ParameterizedProperty System.Object Item(int index) {get;set;},
System.Object Item(System.Object key) {get;set;}
Count Property int Count {get;}
IsFixedSize Property bool IsFixedSize {get;}
IsReadOnly Property bool IsReadOnly {get;}
IsSynchronized Property bool IsSynchronized {get;}
Keys Property System.Collections.ICollection Keys {get;}
SyncRoot Property System.Object SyncRoot {get;}
Values Property System.Collections.ICollection Values {get;}
Las propiedades más usadas son Count, Keys, Values y Item.
Propiedad Count que indica el número de pares clave-valor del objeto.
La propiedad Keys es una colección de los nombres de clave del hashtable diccionario o .
PS> $hash.Keys three 2 1 PS> $dictionary.Keys 1 2 three
La propiedad Values es una colección de los valores del hashtable diccionario o .
PS> $hash.Values 3 two one PS> $dictionary.Values one two 3
La propiedad Item es una propiedad parametrizada que devuelve el valor del elemento que especifique. Las tablas hash usan la clave como parámetro para la propiedad parametrizada, mientras que los diccionarios usan el índice de forma predeterminada. Esta diferencia afecta a cómo se accede a los valores de cada tipo.
Acceso a valores
Hay dos maneras comunes de acceder a los valores de un hashtable diccionario o : notación de miembros o notación de índice de matriz.
Notación de miembro: se puede tener acceso a los valores mediante el nombre de clave como una propiedad miembro del objeto. Por ejemplo:
PS> $hash.1 one PS> $dictionary.2 two
Notación de índice de matriz : se puede tener acceso a los valores mediante la notación de índice. PowerShell convierte esa notación en una llamada a la propiedad parametrizada Item del objeto .
Cuando se usa la notación de índice con tablas hash, el valor dentro de los corchetes es el nombre de clave. Si la clave es un valor de cadena, escriba el nombre de clave entre comillas. Por ejemplo:
PS> $hash['three'] 3 PS> $hash[2] 2
En este ejemplo, el valor
2
de clave no es un índice en la colección de valores. Es el valor de la clave en el par clave-valor. Puede probarlo indizando en la colección de valores.PS> ([array]$hash.Values)[2] one
Cuando se usa la notación de índice con diccionarios, el valor dentro de los corchetes se interpreta en función de su tipo. Si el valor es un entero, se trata como un índice en la colección de valores. Si el valor no es un entero, se trata como nombre de clave. Por ejemplo:
PS> $dictionary[1] two PS> ([array]$dictionary.Values)[1] two PS> $dictionary[[object]1] one PS> $dictionary['three'] 3
En este ejemplo, el valor
[1]
de matriz es un índice en la colección de valores mediante la sobrecarga de laItem(int index)
propiedad parametrizada. El valor[[object]1]
de la matriz no es un índice, sino un valor de clave mediante laItem(System.Object key)
sobrecarga.Nota:
Este comportamiento puede resultar confuso cuando el valor de clave es un entero. Siempre que sea posible, debe evitar el uso de valores de clave enteros en diccionarios.
Control de colisiones de nombres de propiedad
Si el nombre de clave entra en conflicto con uno de los nombres de propiedad del HashTable tipo, puede usar el miembro intrínseco psbase para acceder a esas propiedades. Por ejemplo, si el nombre de clave es keys
y desea devolver la colección de claves HashTable , use esta sintaxis:
$hashtable.psbase.Keys
Este requisito se aplica a otros tipos que implementan la System.Collections.IDictionary interfaz, como OrderedDictionary.
Iteración de claves y valores
Puede iterar por las claves de para hashtable procesar los valores de varias maneras. Cada uno de los ejemplos de esta sección tiene una salida idéntica. Recorren en iteración la $hash
variable definida aquí:
$hash = [ordered]@{ Number = 1; Shape = "Square"; Color = "Blue"}
Nota:
En estos ejemplos, $hash
se define como un diccionario ordenado para asegurarse de que la salida siempre está en el mismo orden. Estos ejemplos funcionan igual para tablas hash estándar, pero el orden de la salida no es predecible.
Cada ejemplo devuelve un mensaje para cada clave y su valor:
The value of 'Number' is: 1
The value of 'Shape' is: Square
The value of 'Color' is: Blue
En este ejemplo se usa un foreach
bloque para iterar las claves.
foreach ($Key in $hash.Keys) {
"The value of '$Key' is: $($hash[$Key])"
}
En este ejemplo se usa ForEach-Object
para iterar las claves.
$hash.Keys | ForEach-Object {
"The value of '$_' is: $($hash[$_])"
}
En este ejemplo se usa el GetEnumerator()
método para enviar cada par clave-valor a través de la canalización a ForEach-Object
.
$hash.GetEnumerator() | ForEach-Object {
"The value of '$($_.Key)' is: $($_.Value)"
}
En este ejemplo se usan los GetEnumerator()
métodos y ForEach()
para iterar en cada par clave-valor.
$hash.GetEnumerator().ForEach({"The value of '$($_.Key)' is: $($_.Value)"})
Agregar y quitar claves y valores
Normalmente, cuando se crea un hashtable , se incluyen los pares clave-valor en la definición. Sin embargo, puede agregar y quitar pares clave-valor de en hashtable cualquier momento. En el ejemplo siguiente se crea un objeto vacío hashtable.
$hash = @{}
Puede agregar pares clave-valor mediante la notación de matriz. Por ejemplo, en el ejemplo siguiente se agrega una Time
clave con un valor de Now
a hashtable.
$hash["Time"] = "Now"
También puede agregar claves y valores a mediante hashtable el Add()
método del System.Collections.Hashtable objeto . El método Add()
tiene la siguiente sintaxis:
Add(Key, Value)
Por ejemplo, para agregar una Time
clave con un valor de Now
a hashtable, use el siguiente formato de instrucción.
$hash.Add("Time", "Now")
Además, puede agregar claves y valores a un hashtable mediante el operador de suma (+
) para agregar un hashtable objeto a un existente hashtable. Por ejemplo, la siguiente instrucción agrega una Time
clave con un valor de Now
a en hashtable la $hash
variable .
$hash = $hash + @{Time="Now"}
También puede agregar valores almacenados en variables.
$t = "Today"
$now = (Get-Date)
$hash.Add($t, $now)
No puede usar un operador de resta para quitar un par clave-valor de una tabla hash, pero puede usar el Remove()
método del hashtable objeto . El método Remove
tiene la siguiente sintaxis:
$object.Remove(<key>)
En el ejemplo siguiente se quita el Time
par clave-valor de $hash
.
$hash.Remove("Time")
Tipos de objeto en HashTables
Las claves y los valores de un hashtable puede tener cualquier tipo de objeto de .NET, y un solo hashtable puede tener claves y valores de varios tipos.
La instrucción siguiente crea una hashtable de cadenas de nombre de proceso y valores de objeto de proceso y la guarda en la $p
variable .
$p = @{
"PowerShell" = (Get-Process PowerShell)
"Notepad" = (Get-Process notepad)
}
Puede mostrar en hashtable $p
y usar las propiedades de nombre de clave para mostrar los valores.
PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (PowerShell)
Notepad System.Diagnostics.Process (notepad)
PS> $p.PowerShell
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
441 24 54196 54012 571 5.10 1788 PowerShell
PS> $p.keys | ForEach-Object {$p.$_.handles}
441
251
Las claves de un hashtable puede ser cualquier tipo de .NET. La siguiente instrucción agrega un par clave-valor a en hashtable la $p
variable . La clave es un objeto Service que representa el servicio WinRM y el valor es el estado actual del servicio.
$p = $p + @{
(Get-Service WinRM) = ((Get-Service WinRM).Status)
}
Puede mostrar y acceder al nuevo par clave-valor mediante los mismos métodos que se usan para otros pares en .hashtable
PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (powershell)
Notepad System.Diagnostics.Process (Notepad)
WinRM Running
PS> $p.keys
PowerShell
Notepad
Status Name DisplayName
------ ---- -----------
Running winrm Windows Remote Management (WS-Manag...
PS> $p.keys | ForEach-Object {$_.name}
WinRM
Las claves y los valores de un hashtable elemento también pueden ser Hashtable objetos . La siguiente instrucción agrega el par clave-valor a en hashtable la $p
variable en la que la clave es una cadena, Hash2 y el valor es un hashtable con tres pares clave-valor.
$p = $p + @{
"Hash2"= @{a=1; b=2; c=3}
}
Puede mostrar y acceder a los nuevos valores mediante los mismos métodos.
PS> $p
Name Value
---- -----
PowerShell System.Diagnostics.Process (powershell)
Notepad System.Diagnostics.Process (Notepad)
WinRM Running
Hash2 {c, b, a}
PS> $p.Hash2
Name Value
---- -----
c 3
b 2
a 1
PS> $p.Hash2.b
2
Ordenar claves y valores
Los elementos de un hashtable elemento son intrínsecamente no ordenados. Los pares clave-valor pueden aparecer en un orden diferente cada vez que los muestre.
Aunque no se puede ordenar , hashtablepuede usar el GetEnumerator()
método de tablas hash para enumerar las claves y los valores y, a continuación, usar el Sort-Object
cmdlet para ordenar los valores enumerados para mostrar.
Por ejemplo, los siguientes comandos enumeran las claves y los valores de la tabla hash de la $p
variable y, a continuación, ordenan las claves en orden alfabético.
PS> $p.GetEnumerator() | Sort-Object -Property key
Name Value
---- -----
Hash2 {c, b, a}
Notepad System.Diagnostics.Process (Notepad)
PowerShell System.Diagnostics.Process (powershell)
WinRM Running
El comando siguiente usa el mismo procedimiento para ordenar los valores hash en orden descendente.
PS> $p.GetEnumerator() | Sort-Object -Property Value -Descending
Name Value
---- -----
PowerShell System.Diagnostics.Process (powershell)
Notepad System.Diagnostics.Process (Notepad)
Hash2 {c, b, a}
WinRM Running
Creación de objetos a partir de tablas hash
A partir de PowerShell 3.0, puede crear un objeto a partir de una hashtable de propiedades y valores de propiedad.
La sintaxis es la siguiente:
[<class-name>]@{
<property-name>=<property-value>
<property-name>=<property-value>
}
Este método solo funciona para las clases que tienen un constructor que no tiene parámetros. Las propiedades del objeto deben ser públicas y configurables.
Para obtener más información, consulte about_Object_Creation.
ConvertFrom-StringData
El ConvertFrom-StringData
cmdlet convierte una cadena o una cadena here-string de pares clave-valor en un hashtable. Puede usar el ConvertFrom-StringData
cmdlet de forma segura en la sección Datos de un script y puede usarlo con el Import-LocalizedData
cmdlet para mostrar los mensajes de usuario en la referencia cultural de la interfaz de usuario (UI) del usuario actual.
Las cadenas aquí son especialmente útiles cuando los valores de las hashtable comillas incluyen. Para obtener más información sobre las cadenas aquí, consulte about_Quoting_Rules.
En el ejemplo siguiente se muestra cómo crear una cadena aquí de los mensajes de usuario en el ejemplo anterior y cómo usar ConvertFrom-StringData
para convertirlos de una cadena en .hashtable
El siguiente comando crea una cadena aquí de los pares clave-valor y, a continuación, la guarda en la $string
variable .
$string = @"
Msg1 = Type "Windows".
Msg2 = She said, "Hello, World."
Msg3 = Enter an alias (or "nickname").
"@
Este comando usa el ConvertFrom-StringData
cmdlet para convertir la cadena aquí en un hashtable.
ConvertFrom-StringData $string
Name Value
---- -----
Msg3 Enter an alias (or "nickname").
Msg2 She said, "Hello, World."
Msg1 Type "Windows".
Para obtener más información sobre las cadenas aquí, consulte about_Quoting_Rules.