about_Object_Creation

Descrizione breve

Viene illustrato come creare oggetti in PowerShell.

Descrizione lunga

È possibile creare oggetti in PowerShell e usare gli oggetti creati in comandi e script.

Esistono molti modi per creare oggetti, questo elenco non è definitivo:

  • New-Object: crea un'istanza di un oggetto .NET Framework o di un oggetto COM.
  • Import-Csv ConvertFrom-CSV/: crea oggetti personalizzati (PSCustomObject) dagli elementi definiti come valori separati da caratteri.
  • ConvertFrom-Json: crea oggetti personalizzati definiti in JSON (JavaScript Object Notation).
  • ConvertFrom-StringData: crea oggetti personalizzati definiti come coppie chiave-valore.
  • Add-Type: consente di definire una classe nella sessione di PowerShell di cui è possibile creare un'istanza con New-Object.
  • New-Module: il parametro AsCustomObject crea un oggetto personalizzato definito usando il blocco di script.
  • Add-Member: aggiunge proprietà agli oggetti esistenti. È possibile usare Add-Member per creare un oggetto personalizzato da un tipo semplice, ad esempio [System.Int32].
  • Select-Object: seleziona le proprietà di un oggetto. È possibile usare Select-Object per creare proprietà personalizzate e calcolate su un oggetto già creato.

In questo articolo sono illustrati i metodi aggiuntivi seguenti:

  • Chiamando il costruttore di un tipo usando un metodo statico new()
  • Tramite il typecasting di tabelle hash di nomi di proprietà e valori di proprietà

Metodo static new()

Tutti i tipi .NET hanno un new() metodo che consente di costruire più facilmente istanze. È anche possibile visualizzare tutti i costruttori disponibili per un determinato tipo.

Per visualizzare i costruttori per un tipo, specificare il nome del new metodo dopo il nome del tipo e premere <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)

È ora possibile creare un System.Uri specificando il costruttore appropriato.

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

È possibile usare l'esempio seguente per determinare i tipi .NET attualmente caricati per creare un'istanza.

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

Gli oggetti creati con il new() metodo potrebbero non avere le stesse proprietà degli oggetti dello stesso tipo creati dai cmdlet di PowerShell. I cmdlet, i provider e il sistema di tipi estesi di PowerShell possono aggiungere proprietà aggiuntive all'istanza.

Ad esempio, il provider FileSystem in PowerShell aggiunge sei valori NoteProperty all'oggetto DirectoryInfo restituito da 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

Quando si crea direttamente un oggetto DirectoryInfo , questi sei valori NoteProperty non sono disponibili.

$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

Per altre informazioni sul sistema di tipi estesi, vedere about_Types.ps1xml.

Questa funzionalità è stata aggiunta in PowerShell 5.0

Creare oggetti da tabelle hash

È possibile creare un oggetto da una tabella hash di proprietà e valori di proprietà.

La sintassi è la seguente:

[<class-name>]@{
  <property-name>=<property-value>
  <property-name>=<property-value>
}

Questo metodo funziona solo per le classi con un costruttore senza parametri. Le proprietà dell'oggetto devono essere pubbliche e impostabili.

Questa funzionalità è stata aggiunta in PowerShell versione 3.0

Creare oggetti personalizzati da tabelle hash

Gli oggetti personalizzati sono molto utili e sono facili da creare usando il metodo della tabella hash. La classe PSCustomObject è progettata in modo specifico per questo scopo.

Gli oggetti personalizzati sono un ottimo modo per restituire l'output personalizzato da una funzione o uno script. Questa operazione è più utile rispetto alla restituzione di un output formattato che non può essere riformattato o inviato tramite pipe ad altri comandi.

I comandi nell'insieme Test-Object function impostano alcuni valori di variabile e quindi usano tali valori per creare un oggetto personalizzato. È possibile visualizzare questo oggetto in uso nella sezione di esempio dell'argomento della Guida dei 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

L'output di questa funzione è una raccolta di oggetti personalizzati formattati come tabella per impostazione predefinita.

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

Gli utenti possono gestire le proprietà degli oggetti personalizzati esattamente come fanno con gli oggetti standard.

(Test-Object).ModuleName
 PSScheduledJob
 PSWorkflow

Gli oggetti tipo PSObject mantengono l'elenco dei membri nell'ordine in cui i membri sono stati aggiunti all'oggetto. Anche se gli oggetti Hashtable non garantiscono l'ordine delle coppie chiave-valore, eseguire il cast di una tabella hash letterale per [pscustomobject] mantenere l'ordine.

La tabella hash deve essere un valore letterale. Se si esegue il wrapping della tabella hash tra parentesi o se si esegue il cast di una variabile contenente una tabella hash, non è garantito che l'ordine venga mantenuto.

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

Creare oggetti non personalizzati da tabelle hash

È anche possibile usare tabelle hash per creare oggetti per classi non personalizzate. Quando si crea un oggetto per una classe non personalizzata, è necessario il nome del tipo qualificato dallo spazio dei nomi, anche se è possibile omettere qualsiasi componente dello spazio dei nomi system iniziale.

Ad esempio, il comando seguente crea un oggetto opzione di sessione.

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

I requisiti della funzionalità tabella hash, in particolare il requisito del costruttore senza parametri, eliminano molte classi esistenti. Tuttavia, la maggior parte delle classi di opzioni di PowerShell è progettata per funzionare con questa funzionalità, nonché altre classi molto utili, ad esempio la classe 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
...

È anche possibile usare la funzionalità tabella hash quando si impostano i valori dei parametri. Ad esempio, il valore del parametro SessionOption dell'oggetto New-PSSession. il cmdlet può essere una tabella hash.

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

Oggetti generici

È anche possibile creare oggetti generici in PowerShell. I generics sono classi, strutture, interfacce e metodi dotati di segnaposto (parametri di tipo) per uno o più dei tipi archiviati o usati.

Nell'esempio seguente viene creato un oggetto Dictionary .

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

Per altre informazioni sui generics, vedere Generics in .NET.

Vedi anche