Propiedades calculadas, acerca deAbout calculated properties

Descripción breveShort Description

PowerShell proporciona la capacidad de agregar dinámicamente nuevas propiedades y modificar el formato de los resultados de los objetos en la canalización.PowerShell provides the ability to dynamically add new properties and alter the formatting of objects output to the pipeline.

Descripción largaLong Description

Varios cmdlets de PowerShell transforman, agregan o procesan objetos de entrada en objetos de salida mediante parámetros que permiten agregar nuevas propiedades a esos objetos de salida.A number of PowerShell cmdlets transform, aggregate, or process input objects into output objects using parameters that allow the addition of new properties to those output objects. Estos parámetros se pueden usar para generar nuevas propiedades calculadas en los objetos de salida en función de los valores de los objetos de entrada.These parameters can be used to generate new, calculated properties on output objects based on the values of input objects. La propiedad calculada se define mediante una tabla hash que contiene pares clave-valor que especifican el nombre de la nueva propiedad, una expresión para calcular el valor e información de formato opcional.The calculated property is defined by a hashtable containing key-value pairs that specify the name of the new property, an expression to calculate the value, and optional formatting information.

Cmdlets compatiblesSupported cmdlets

Los siguientes cmdlets admiten valores de propiedad calculados para el parámetro Property .The following cmdlets support calculated property values for the Property parameter. Los Format-* cmdlets también admiten valores calculados para el parámetro GroupBy .The Format-* cmdlets also support calculated values for the GroupBy parameter.

En la lista siguiente se detallan los cmdlets que admiten propiedades calculadas y los pares de clave y valor que se admiten en cada cmdlet.The following list itemizes the cmdlets that support calculated properties and the key-value pairs that are supported by each cmdlet.

  • Compare-Object

    • expression
  • ConvertTo-Html

    • name/label -opcional (agregado en PowerShell 6. x)name/label - optional (added in PowerShell 6.x)
    • expression
    • width -opcionalwidth - optional
    • alignment -opcionalalignment - optional
  • Format-Custom

    • expression
    • depth -opcionaldepth - optional
  • Format-List

    • name/label -opcionalname/label - optional
    • expression
    • formatstring -opcionalformatstring - optional

    Este mismo conjunto de pares clave-valor también se aplica a los valores de propiedad calculados que se pasan al parámetro GroupBy para todos los Format-* cmdlets.This same set of key-value pairs also apply to calculated property values passed to the GroupBy parameter for all Format-* cmdlets.

  • Format-Table

    • name/label -opcionalname/label - optional
    • expression
    • formatstring -opcionalformatstring - optional
    • width -opcionalwidth - optional
    • alignment -opcionalalignment - optional
  • Format-Wide

    • expression
    • formatstring -opcionalformatstring - optional
  • Group-Object

    • expression
  • Measure-Object

    • Solo admite un bloque de script para la expresión, no una tabla hash.Only supports a script block for the expression, not a hashtable.
    • No se admite en PowerShell 5,1 y versiones anteriores.Not supported in PowerShell 5.1 and older.
  • Select-Object

    • name/label -opcionalname/label - optional
    • expression
  • Sort-Object

    • expression
    • ascending/descending -opcionalascending/descending - optional

Nota

El valor de expression puede ser un bloque de script en lugar de una tabla hash.The value of the expression can be a script block instead of a hashtable. Para obtener más información, vea la sección notas .For more information, see the Notes section.

Definiciones de clave de HashtableHashtable key definitions

  • name/label : Especifica el nombre de la propiedad que se va a crear.name/label - Specifies the name of the property being created. Puede usar name o su alias, label indistintamente.You can use name or its alias, label, interchangeably.
  • expression : Un bloque de script que se usa para calcular el valor de la nueva propiedad.expression - A script block used to calculate the value of the new property.
  • alignment : Lo usan los cmdlets que generan resultados tabulares para definir cómo se muestran los valores en una columna.alignment - Used by cmdlets that produce tabular output to define how the values are displayed in a column. El valor debe ser 'left' , 'center' o 'right' .The value must be 'left', 'center', or 'right'.
  • formatstring : Especifica una cadena de formato que define cómo se da formato al valor para la salida.formatstring - Specifies a format string that defines how the value is formatted for output. Para obtener más información sobre las cadenas de formato, vea tipos de formato en .net.For more information about format strings, see Format types in .NET.
  • width : Especifica la columna de ancho máximo de una tabla cuando se muestra el valor.width - Specifies the maximum width column in a table when the value is displayed. El valor debe ser mayor que 0 .The value must be greater than 0.
  • depth -El parámetro Depth de Format-Custom especifica la profundidad de expansión para todas las propiedades.depth - The Depth parameter of Format-Custom specifies the depth of expansion for all properties. La depth clave permite especificar la profundidad de expansión por propiedad.The depth key allows you to specify the depth of expansion per property.
  • ascending / descending : Permite especificar el orden de ordenación de una o más propiedades.ascending / descending - Allows you to specify the order of sorting for one or more properties. Estos son valores booleanos.These are boolean values.

No es necesario que las claves de tabla hash estén escritas mientras el prefijo de nombre especificado no sea ambiguo.The hashtable keys need not be spelled out as long as the specified name prefix is unambiguous. Por ejemplo, n se puede usar en lugar de Name y e se puede usar en lugar de Expression .For example, n can be used in lieu of Name and e can be used in lieu of Expression.

EjemplosExamples

Compare-ObjectCompare-Object

Con las propiedades calculadas, puede controlar cómo se comparan las propiedades de los objetos de entrada.With calculated properties, you can control how the properties of the input objects are compared. En este ejemplo, en lugar de comparar los valores directamente, los valores se comparan con el resultado de la operación aritmética (módulo de 2).In this example, rather than comparing the values directly, the values are compared to the result of the arithmetic operation (modulus of 2).

Compare-Object @{p=1} @{p=2} -property @{ Expression = { $_.p % 2 } }
 $_.p % 2  SideIndicator
---------- -------------
         0 =>
         1 <=

ConvertTo-HtmlConvertTo-Html

ConvertTo-Html puede convertir una colección de objetos en una tabla HTML.ConvertTo-Html can convert a collection of objects to an HTML table. Las propiedades calculadas le permiten controlar cómo se presenta la tabla.Calculated properties allow you to control how the table is presented.

Get-Alias |
  ConvertTo-Html Name,
                 Definition,
                 @{
                    name='ParameterCount'
                    expr={$_.Parameters.Keys.Count}
                    align='center'
                 } |
    Out-File .\aliases.htm -Force

En este ejemplo se crea una tabla HTML que contiene una lista de alias de PowerShell y los parámetros de número de cada comando con alias.This example creates an HTML table containing a list of PowerShell aliases and the number parameters for each aliased command. Los valores de la columna ParameterCount están centrados.The values of ParameterCount column are centered.

Format-CustomFormat-Custom

Format-Custom proporciona una vista personalizada de un objeto en un formato similar a una definición de clase.Format-Custom provides a custom view of an object in a format similar to a class definition. Los objetos más complejos pueden contener miembros que están profundamente anidados con tipos complejos.More complex objects can contain members that are deeply nested with complex types. El parámetro Depth de Format-Custom especifica la profundidad de expansión para todas las propiedades.The Depth parameter of Format-Custom specifies the depth of expansion for all properties. La depth clave permite especificar la profundidad de expansión por propiedad.The depth key allows you to specify the depth of expansion per property.

En este ejemplo, la depth clave simplifica la salida personalizada del Get-Date cmdlet.In this example, the depth key simplifies the custom output for the Get-Date cmdlet. Get-Date Devuelve un objeto DateTime .Get-Date returns a DateTime object. La propiedad Date de este objeto también es un objeto DateTime , por lo que el objeto está anidado.The Date property of this object is also a DateTime object, so the object is nested.

Get-Date | Format-Custom @{expr={$_.Date};depth=1},TimeOfDay
class DateTime
{
  $_.Date =
    class DateTime
    {
      Date = 8/7/2020 12:00:00 AM
      Day = 7
      DayOfWeek = Friday
      DayOfYear = 220
      Hour = 0
      Kind = Local
      Millisecond = 0
      Minute = 0
      Month = 8
      Second = 0
      Ticks = 637323552000000000
      TimeOfDay = 00:00:00
      Year = 2020
      DateTime = Friday, August 07, 2020 12:00:00 AM
    }
  TimeOfDay =
    class TimeSpan
    {
      Ticks = 435031592302
      Days = 0
      Hours = 12
      Milliseconds = 159
      Minutes = 5
      Seconds = 3
      TotalDays = 0.503508787386574
      TotalHours = 12.0842108972778
      TotalMilliseconds = 43503159.2302
      TotalMinutes = 725.052653836667
      TotalSeconds = 43503.1592302
    }
}

Format-ListFormat-List

En este ejemplo, usamos propiedades calculadas para cambiar el nombre y el formato de la salida de Get-ChildItem .In this example, we use calculated properties to change the name and format of the output from Get-ChildItem.

Get-ChildItem *.json -File |
  Format-List Fullname,
              @{
                 name='Modified'
                 expression={$_.LastWriteTime}
                 formatstring='O'
              },
              @{
                 name='Size'
                 expression={$_.Length/1KB}
                 formatstring='N2'
              }
FullName : C:\Git\PS-Docs\PowerShell-Docs\.markdownlint.json
Modified : 2020-07-23T10:26:28.4092457-07:00
Size     : 2.40

FullName : C:\Git\PS-Docs\PowerShell-Docs\.openpublishing.publish.config.json
Modified : 2020-07-23T10:26:28.4092457-07:00
Size     : 2.25

FullName : C:\Git\PS-Docs\PowerShell-Docs\.openpublishing.redirection.json
Modified : 2020-07-27T13:05:24.3887629-07:00
Size     : 324.60

Format-TableFormat-Table

En este ejemplo, la propiedad calculada agrega una propiedad Type utilizada para clasificar los archivos por el tipo de contenido.In this example, the calculated property adds a Type property used to classify the files by the content type.

Get-ChildItem -File |
  Sort-Object extension |
    Format-Table Name, Length -GroupBy @{
      name='Type'
      expression={
        switch ($_.extension) {
          '.md'   {'Content'}
          ''      {'Metacontent'}
          '.ps1'  {'Automation'}
          '.yml'  {'Automation'}
          default {'Configuration'}
        }
      }
    }
   Type: Metacontent

Name              Length
----              ------
ThirdPartyNotices   1229
LICENSE-CODE        1106
LICENSE            19047

   Type: Configuration

Name                                Length
----                                ------
.editorconfig                          183
.gitattributes                         419
.gitignore                             228
.markdownlint.json                    2456
.openpublishing.publish.config.json   2306
.openpublishing.redirection.json    332394
.localization-config                   232

   Type: Content

Name            Length
----            ------
README.md         3355
CONTRIBUTING.md    247

   Type: Automation

Name                      Length
----                      ------
.openpublishing.build.ps1    796
build.ps1                   7495
ci.yml                       645
ci-steps.yml                2035
daily.yml                   1271

Format-WideFormat-Wide

El Format-Wide cmdlet permite mostrar el valor de una propiedad para los objetos de una colección como una lista de varias columnas.The Format-Wide cmdlet allows you to display the value of one property for objects in a collection as a multi-column list.

En este ejemplo, queremos ver el nombre de archivo y el tamaño (en kilobytes) como una lista extensa.For this example, we want to see the filename and the size (in kilobytes) as a wide listing. Puesto que no Format-Wide muestra más de una propiedad, usamos una propiedad calculada para combinar el valor de dos propiedades en un solo valor.Since Format-Wide does not display more than one property, we use a calculated property to combine the value of two properties into a single value.

Get-ChildItem -File |
  Format-Wide -Property @{e={'{0} ({1:N2}kb)' -f $_.name,($_.length/1kb)}}
.editorconfig (0.18kb)                          .gitattributes (0.41kb)
.gitignore (0.22kb)                             .localization-config (0.23kb)
.markdownlint.json (2.40kb)                     .openpublishing.build.ps1 (0.78kb)
.openpublishing.publish.config.json (2.25kb)    .openpublishing.redirection.json (324.60kb)
build.ps1 (7.32kb)                              ci.yml (0.63kb)
ci-steps.yml (1.99kb)                           CONTRIBUTING.md (0.24kb)
daily.yml (1.24kb)                              LICENSE (18.60kb)
LICENSE-CODE (1.08kb)                           README.md (3.28kb)
ThirdPartyNotices (1.20kb)

Group-ObjectGroup-Object

El Group-Object cmdlet muestra objetos en grupos basados en el valor de una propiedad especificada.The Group-Object cmdlet displays objects in groups based on the value of a specified property. En este ejemplo, la propiedad calculada cuenta el número de archivos de cada tipo de contenido.In this example, the calculated property counts the number of files of each content type.

Get-ChildItem -File |
  Sort-Object extension |
    Group-Object -NoElement -Property @{
      expression={
        switch ($_.extension) {
          '.md'   {'Content'}
          ''      {'Metacontent'}
          '.ps1'  {'Automation'}
          '.yml'  {'Automation'}
          default {'Configuration'}
        }
      }
    }
Count Name
----- ----
    5 Automation
    7 Configuration
    2 Content
    3 Metacontent

Measure-ObjectMeasure-Object

El Measure-Object cmdlet calcula las propiedades numéricas de los objetos.The Measure-Object cmdlet calculates the numeric properties of objects. En este ejemplo, se usa una propiedad calculada para obtener el recuento ( suma ) de los números, entre 1 y 10, que se pueden dividir uniformemente por 3.In this example, we use a calculated property to get the count ( Sum ) of the numbers, between 1 and 10, that are evenly divisible by 3.

1..10 | Measure-Object -Property {($_ % 3) -eq 0} -Sum
Count             : 10
Average           :
Sum               : 3
Maximum           :
Minimum           :
StandardDeviation :
Property          : ($_ % 3) -eq 0

Nota

A diferencia de los demás cmdlets, no Measure-Object acepta una tabla hash para las propiedades calculadas.Unlike the other cmdlets, Measure-Object does not accept a hashtable for calculated properties. Debe usar un bloque de script.You must use a script block.

Select-ObjectSelect-Object

Puede usar propiedades calculadas para agregar miembros adicionales a los resultados de los objetos con el Select-Object cmdlet.You can use calculated properties to add additional members to the objects output with the Select-Object cmdlet. En este ejemplo, se enumeran los alias de PowerShell que comienzan por la letra C .In this example, we are listing the PowerShell aliases that begin with the letter C. Con Select-Object , se genera el alias, el cmdlet al que está asignado y un recuento del número de parámetros definidos para el cmdlet.Using Select-Object, we output the alias, the cmdlet it's mapped to, and a count for the number of parameters defined for the cmdlet. Mediante el uso de una propiedad calculada, se puede crear la propiedad ParameterCount .Using a calculated property, we can create the ParameterCount property.

$aliases = Get-Alias c* |
  Select-Object Name,
                Definition,
                @{
                    name='ParameterCount'
                    expr={$_.Parameters.Keys.Count}
                }
$aliases | Get-Member
$aliases
   TypeName: Selected.System.Management.Automation.AliasInfo

Name           MemberType   Definition
----           ----------   ----------
Equals         Method       bool Equals(System.Object obj)
GetHashCode    Method       int GetHashCode()
GetType        Method       type GetType()
ToString       Method       string ToString()
Definition     NoteProperty string Definition=Get-Content
Name           NoteProperty string Name=cat
ParameterCount NoteProperty System.Int32 ParameterCount=21

Name    Definition         ParameterCount
----    ----------         --------------
cat     Get-Content                    21
cd      Set-Location                   15
cdd     Push-MyLocation                 1
chdir   Set-Location                   15
clc     Clear-Content                  20
clear   Clear-Host                      0
clhy    Clear-History                  17
cli     Clear-Item                     20
clp     Clear-ItemProperty             22
cls     Clear-Host                      0
clv     Clear-Variable                 19
cnsn    Connect-PSSession              29
compare Compare-Object                 20
copy    Copy-Item                      24
cp      Copy-Item                      24
cpi     Copy-Item                      24
cpp     Copy-ItemProperty              23
cvpa    Convert-Path                   13

Sort-ObjectSort-Object

Con las propiedades calculadas, puede ordenar los datos en diferentes pedidos por propiedad.Using the calculated properties, you can sort data in different orders per property. Este ejemplo ordena los datos de un archivo CSV en orden ascendente por fecha.This example sorts data from a CSV file in ascending order by Date. Pero dentro de cada fecha, ordena las filas en orden descendente por UnitsSold.But within each date, it sorts the rows in descending order by UnitsSold.

Import-Csv C:\temp\sales-data.csv |
  Sort-Object Date, @{expr={$_.UnitsSold}; desc=$true}, Salesperson  |
    Select-Object Date, Salesperson, UnitsSold
Date       Salesperson UnitsSold
----       ----------- ---------
2020-08-01 Sally       3
2020-08-01 Anne        2
2020-08-01 Fred        1
2020-08-02 Anne        6
2020-08-02 Fred        2
2020-08-02 Sally       0
2020-08-03 Anne        5
2020-08-03 Sally       3
2020-08-03 Fred        1
2020-08-04 Anne        2
2020-08-04 Fred        2
2020-08-04 Sally       2

NotasNotes

  • Puede especificar el bloque de script de expresión directamente , como argumento, en lugar de especificarlo como la Expression entrada en una tabla hash.You may specify the expression script block directly , as an argument, rather than specifying it as the Expression entry in a hashtable. Por ejemplo:For example:

    '1', '10', '2' | Sort-Object { [int] $_ }
    

    Este ejemplo es práctico para los cmdlets que no requieren (o admiten) el nombre de una propiedad a través de la Name clave, como Sort-Object , Group-Object y Measure-Object .This example is convenient for cmdlets that do not require (or support) naming a property via the Name key, such as Sort-Object, Group-Object, and Measure-Object.

    En el caso de los cmdlets que admiten el nombre de la propiedad, el bloque de script se convierte en una cadena y se usa como nombre de la propiedad en el resultado.For cmdlets that support naming the property, the script block is converted to a string and used as the name of the property in the output.

  • Expression los bloques de script se ejecutan en ámbitos secundarios , lo que significa que las variables del llamador no se pueden modificar directamente.Expression script blocks run in child scopes, meaning that the caller's variables cannot be directly modified.

  • La lógica de canalización se aplica a la salida de los Expression bloques de scripts.Pipeline logic is applied to the output from Expression script blocks. Esto significa que la salida de una matriz de un solo elemento hace que esa matriz se desajuste.This means that outputting a single-element array causes that array to be unwrapped.

  • Para la mayoría de los cmdlets, los errores incluidos en los bloques de scripts de expresión se omiten en silencio.For most cmdlets, errors inside expression script blocks are quietly ignored. Para Sort-Object , los errores de finalización de instrucciones y de output finalización de scripts se generan, pero no finalizan la instrucción.For Sort-Object, statement-terminating and script-terminating errors are output but they do not terminate the statement.

Consulte tambiénSee Also

about_Hash_Tablesabout_Hash_Tables

Compare-ObjectCompare-Object

ConvertTo-HtmlConvertTo-Html

Format-CustomFormat-Custom

Format-ListFormat-List

Format-TableFormat-Table

Format-WideFormat-Wide

Group-ObjectGroup-Object

Measure-ObjectMeasure-Object

Select-ObjectSelect-Object

Sort-ObjectSort-Object

Tipos de formato en .NETFormat types in .NET