about_Object_Creation

Descripción breve

Explica cómo crear objetos en PowerShell.

Descripción larga

Puede crear objetos en PowerShell y usar los objetos que cree en comandos y scripts.

Hay muchas maneras de crear objetos, esta lista no es definitiva:

  • New-Object: crea una instancia de un objeto de .NET Framework o un objeto COM.
  • Import-Csv/ConvertFrom-CSV: crea objetos personalizados (PSCustomObject) a partir de los elementos definidos como valores separados por caracteres.
  • ConvertFrom-Json: crea objetos personalizados definidos en notación de objetos JavaScript (JSON).
  • ConvertFrom-StringData: crea objetos personalizados definidos como pares clave-valor.
  • Tipo de complemento: permite definir una clase en la sesión de PowerShell que puede crear instancias con New-Object.
  • New-Module: el parámetro AsCustomObject crea un objeto personalizado que se define mediante el bloque de scripts.
  • Add-Member: agrega propiedades a objetos existentes. Puede usar Add-Member para crear un objeto personalizado fuera de un tipo simple, como [System.Int32].
  • Select-Object: selecciona las propiedades de un objeto. Puede usar Select-Object para crear propiedades personalizadas y calculadas en un objeto ya creado por instancias.

En este artículo se tratan los siguientes métodos adicionales:

  • Mediante una llamada al constructor de un tipo mediante un método estático new()
  • Mediante la difusión de tipos de tablas hash de nombres de propiedad y valores de propiedad

Método new() estático

Todos los tipos de .NET tienen un new() método que permite construir instancias más fácilmente. También puede ver todos los constructores disponibles para un tipo determinado.

Para ver los constructores de un tipo, especifique el nombre del new método después del nombre de tipo y presione <ENTER>.

[System.Uri]::new
OverloadDefinitions
-------------------
uri new(string uriString)
uri new(string uriString, bool dontEscape)
uri new(uri baseUri, string relativeUri, bool dontEscape)
uri new(string uriString, System.UriKind uriKind)
uri new(uri baseUri, string relativeUri)
uri new(uri baseUri, uri relativeUri)

Ahora, puede crear un System.Uri especificando el constructor adecuado.

[System.Uri]::new("https://www.bing.com")
AbsolutePath   : /
AbsoluteUri    : https://www.bing.com/
LocalPath      : /
Authority      : www.bing.com
...

Puede usar el ejemplo siguiente para determinar qué tipos de .NET se cargan actualmente para crear instancias.

[AppDomain]::CurrentDomain.GetAssemblies() |
  ForEach-Object {
    $_.GetExportedTypes() |
      ForEach-Object { $_.FullName }
  }

Es posible que los objetos creados con el new() método no tengan las mismas propiedades que los objetos del mismo tipo creados por los cmdlets de PowerShell. Los cmdlets, proveedores y sistema de tipos extendidos de PowerShell pueden agregar propiedades adicionales a la instancia.

Por ejemplo, el proveedor FileSystem de PowerShell agrega seis valores NoteProperty al objeto DirectoryInfo devuelto por Get-Item.

$PSDirInfo = Get-Item /
$PSDirInfo | Get-Member | Group-Object MemberType | Select-Object Count, Name
Count Name
----- ----
    4 CodeProperty
   13 Property
    6 NoteProperty
    1 ScriptProperty
   18 Method

Cuando se crea un objeto DirectoryInfo directamente, no tiene esos seis valores NoteProperty .

$NewDirInfo = [System.IO.DirectoryInfo]::new('/')
$NewDirInfo | Get-Member | Group-Object MemberType | Select-Object Count, Name
Count Name
----- ----
    4 CodeProperty
   13 Property
    1 ScriptProperty
   18 Method

Para obtener más información sobre el sistema de tipos extendidos, vea about_Types.ps1xml.

Esta característica se agregó en PowerShell 5.0

Creación de objetos a partir de tablas hash

Puede crear un objeto a partir de una tabla hash 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 sin parámetros. Las propiedades del objeto deben ser públicas y configurables.

Esta característica se agregó en la versión 3.0 de PowerShell

Creación de objetos personalizados a partir de tablas hash

Los objetos personalizados son muy útiles y son fáciles de crear mediante el método de tabla hash. La clase PSCustomObject está diseñada específicamente para este propósito.

Los objetos personalizados son una excelente manera de devolver la salida personalizada de una función o script. Esto es más útil que devolver la salida con formato que no se puede volver a formatear ni canalizar a otros comandos.

Los comandos del Test-Object function conjunto de algunos valores de variable y, a continuación, usan esos valores para crear un objeto personalizado. Puede ver este objeto en uso en la sección de ejemplo del tema de ayuda del Update-Help cmdlet.

function Test-Object {
  $ModuleName = "PSScheduledJob"
  $HelpCulture = "en-us"
  $HelpVersion = "3.1.0.0"
  [PSCustomObject]@{
    "ModuleName"=$ModuleName
    "UICulture"=$HelpCulture
    "Version"=$HelpVersion
  }
  $ModuleName = "PSWorkflow"
  $HelpCulture = "en-us"
  $HelpVersion = "3.0.0.0"
  [PSCustomObject]@{
    "ModuleName"=$ModuleName
    "UICulture"=$HelpCulture
    "Version"=$HelpVersion
  }
}
Test-Object

La salida de esta función es una colección de objetos personalizados con formato de tabla de forma predeterminada.

ModuleName        UICulture      Version
---------         ---------      -------
PSScheduledJob    en-us          3.1.0.0
PSWorkflow        en-us          3.0.0.0

Los usuarios pueden administrar las propiedades de los objetos personalizados igual que con los objetos estándar.

(Test-Object).ModuleName
 PSScheduledJob
 PSWorkflow

Los objetos de tipo PSObject mantienen la lista de miembros en el orden en que los miembros se agregaron al objeto . Aunque los objetos Hashtable no garantizan el orden de los pares clave-valor, convierta una tabla hash literal para [pscustomobject] mantener el orden.

La tabla hash debe ser un literal. Si encapsula la tabla hash entre paréntesis o si convierte una variable que contiene una tabla hash, no hay ninguna garantía de que se conserve el orden.

$hash = @{
    Name      = "Server30"
    System    = "Server Core"
    PSVersion = "4.0"
}
$Asset = [pscustomobject]$hash
$Asset
System      Name     PSVersion
------      ----     ---------
Server Core Server30 4.0

Creación de objetos no personalizados a partir de tablas hash

También puede usar tablas hash para crear objetos para clases no personalizadas. Al crear un objeto para una clase no personalizada, se requiere el nombre de tipo calificado para el espacio de nombres, aunque puede omitir cualquier componente inicial del espacio de nombres system .

Por ejemplo, el comando siguiente crea un objeto de opción de sesión.

[System.Management.Automation.Remoting.PSSessionOption]@{
  IdleTimeout=43200000
  SkipCnCheck=$True
}

Los requisitos de la característica de tabla hash, especialmente el requisito de constructor sin parámetros, eliminan muchas clases existentes. Sin embargo, la mayoría de las clases de opciones de PowerShell están diseñadas para trabajar con esta característica, así como con otras clases muy útiles, como la clase ProcessStartInfo.

[System.Diagnostics.ProcessStartInfo]@{
  CreateNoWindow="$true"
  Verb="run as"
}
Arguments               :
ArgumentList            : {}
CreateNoWindow          : True
EnvironmentVariables    : {OneDriveConsumer, PROCESSOR_ARCHITECTURE,
                           CommonProgramFiles(x86), APPDATA...}
Environment             : {[OneDriveConsumer, C:\Users\user1\OneDrive],
                           [PROCESSOR_ARCHITECTURE, AMD64],
                           [CommonProgramFiles(x86),
                           C:\Program Files (x86)\Common Files],
                           [APPDATA, C:\Users\user1\AppData\Roaming]...}
RedirectStandardInput   : False
RedirectStandardOutput  : False
RedirectStandardError   : False
...

También puede usar la característica de tabla hash al establecer valores de parámetro. Por ejemplo, el valor del parámetro SessionOption de New-PSSession. cmdlet puede ser una tabla hash.

New-PSSession -ComputerName Server01 -SessionOption @{
  IdleTimeout=43200000
  SkipCnCheck=$True
}
Register-ScheduledJob Name Test -FilePath .\Get-Inventory.ps1 -Trigger @{
  Frequency="Daily"
  At="15:00"
}

Objetos genéricos

También puede crear objetos genéricos en PowerShell. Los genéricos son clases, estructuras, interfaces y métodos que tienen marcadores de posición (parámetros de tipo) para uno o varios de los tipos que almacenan o utilizan.

En el ejemplo siguiente se crea un objeto Dictionary .

$dict = New-Object 'System.Collections.Generic.Dictionary[String,Int]'
$dict.Add("One", 1)
$dict
Key Value
--- -----
One     1

Para obtener más información sobre los genéricos, vea Genéricos en .NET.

Consulte también