about_Calculated_Properties

Descrizione breve

PowerShell consente di aggiungere dinamicamente nuove proprietà e di modificare la formattazione dell'output degli oggetti nella pipeline.

Descrizione lunga

Diversi cmdlet di PowerShell trasformano, raggruppano o elaborano oggetti di input in oggetti di output usando parametri che consentono l'aggiunta di nuove proprietà a tali oggetti di output. È possibile usare questi parametri per generare nuove proprietà calcolate sugli oggetti di output in base ai valori degli oggetti di input. La proprietà calcolata è definita da una tabella hash contenente coppie chiave-valore che specificano il nome della nuova proprietà, un'espressione per calcolare il valore e le informazioni di formattazione facoltative.

Cmdlet supportati

I cmdlet seguenti supportano i valori delle proprietà calcolate per il parametro Property . I Format-* cmdlet supportano anche i valori calcolati per il parametro GroupBy .

Nell'elenco seguente vengono elencati i cmdlet che supportano le proprietà calcolate e le coppie chiave-valore supportate da ogni cmdlet.

  • Compare-Object

    • expression
  • ConvertTo-Html

    • name/label - Facoltativo (aggiunto in PowerShell 6.x)
    • expression
    • width -Opzionale
    • alignment -Opzionale
  • Format-Custom

    • expression
    • depth -Opzionale
  • Format-List

    • name/label -Opzionale
    • expression
    • formatstring -Opzionale

    Questo stesso set di coppie chiave-valore si applica anche ai valori delle proprietà calcolati passati al parametro GroupBy per tutti i Format-* cmdlet.

  • Format-Table

    • name/label -Opzionale
    • expression
    • formatstring -Opzionale
    • width -Opzionale
    • alignment -Opzionale
  • Format-Wide

    • expression
    • formatstring -Opzionale
  • Group-Object

    • expression
  • Measure-Object

    • Supporta solo un blocco di script per l'espressione, non una tabella hash.
    • Non supportato in PowerShell 5.1 e versioni precedenti.
  • Select-Object

    • name/label -Opzionale
    • expression
  • Sort-Object

    • expression
    • ascending/descending -Opzionale

Nota

Il valore di expression può essere un blocco di script anziché una tabella hash. Per altre informazioni, vedere la sezione Note .

Definizioni di chiave hashtable

  • name/label - Specifica il nome della proprietà da creare. È possibile usare name o il relativo alias, label, in modo intercambiabile.
  • expression - Stringa o blocco di script utilizzato per calcolare il valore della nuova proprietà. expression Se è una stringa, il valore viene interpretato come nome di proprietà nell'oggetto di input. Si tratta di un'opzione più breve di expression = { $_.<PropertyName> }.
  • alignment - Usato dai cmdlet che producono output tabulare per definire la modalità di visualizzazione dei valori in una colonna. Il valore deve essere 'left', 'center'o 'right'.
  • formatstring - Specifica una stringa di formato che definisce la modalità di formattazione del valore per l'output. Per altre informazioni sulle stringhe di formato, vedere Tipi di formato in .NET.
  • width - Specifica la colonna di larghezza massima in una tabella quando viene visualizzato il valore. Il valore deve essere maggiore di 0.
  • depth - Il parametro Depth di Format-Custom specifica la profondità di espansione per tutte le proprietà. La depth chiave consente di specificare la profondità di espansione per ogni proprietà.
  • ascending / descending - Consente di specificare l'ordinamento per una o più proprietà. Si tratta di valori booleani.

Non è necessario specificare le chiavi hashtable purché il prefisso del nome specificato non sia ambiguo. Ad esempio, è possibile usare n anziché Name e e anziché Expression.

Esempi

Compare-Object

Con le proprietà calcolate, è possibile controllare il modo in cui vengono confrontate le proprietà degli oggetti di input. In questo esempio, anziché confrontare direttamente i valori, i valori vengono confrontati con il risultato dell'operazione aritmetica (modulo di 2).

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

ConvertTo-Html

ConvertTo-Html può convertire una raccolta di oggetti in una tabella HTML. Le proprietà calcolate consentono di controllare la modalità di presentazione della tabella.

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

In questo esempio viene creata una tabella HTML contenente un elenco di alias di PowerShell e i parametri numerici per ogni comando con alias. I valori della colonna ParameterCount sono centrati.

Format-Custom

Format-Custom fornisce una visualizzazione personalizzata di un oggetto in un formato simile a una definizione di classe. Gli oggetti più complessi possono contenere membri annidati in modo approfondito con tipi complessi. Il parametro Depth di Format-Custom specifica la profondità di espansione per tutte le proprietà. La depth chiave consente di specificare la profondità di espansione per ogni proprietà.

In questo esempio la depth chiave semplifica l'output personalizzato per il Get-Date cmdlet. Get-Date restituisce un oggetto DateTime . La proprietà Date di questo oggetto è anche un oggetto DateTime , quindi l'oggetto è annidato.

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-List

In questo esempio vengono usate proprietà calcolate per modificare il nome e il formato dell'output da 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-Table

In questo esempio, la proprietà calcolata aggiunge una proprietà Type utilizzata per classificare i file in base al tipo di contenuto.

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-Wide

Il Format-Wide cmdlet consente di visualizzare il valore di una proprietà per gli oggetti in una raccolta come elenco a più colonne.

Per questo esempio, si vogliono visualizzare il nome file e le dimensioni (in kilobyte) come elenco completo. Poiché Format-Wide non visualizza più proprietà, viene usata una proprietà calcolata per combinare il valore di due proprietà in un singolo valore.

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-Object

Il Group-Object cmdlet visualizza gli oggetti in gruppi in base al valore di una proprietà specificata. In questo esempio, la proprietà calcolata conta il numero di file di ogni tipo di contenuto.

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-Object

Il Measure-Object cmdlet calcola le proprietà numeriche degli oggetti. In questo esempio viene usata una proprietà calcolata per ottenere il conteggio (somma) dei numeri, compreso tra 1 e 10, divisibile in modo uniforme per 3.

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

Nota

A differenza degli altri cmdlet, Measure-Object non accetta una tabella hash per le proprietà calcolate. È necessario usare un blocco di script.

Select-Object

È possibile usare le proprietà calcolate per aggiungere altri membri all'output degli oggetti con il Select-Object cmdlet . In questo esempio vengono elencati gli alias di PowerShell che iniziano con la lettera C. Usando Select-Object, viene restituito l'alias, il cmdlet a cui viene eseguito il mapping e un conteggio per il numero di parametri definiti per il cmdlet. Usando una proprietà calcolata, è possibile creare la proprietà ParameterCount .

$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-Object

Usando le proprietà calcolate, è possibile ordinare i dati in ordini diversi per proprietà. Questo esempio ordina i dati da un file CSV in ordine crescente in base a Date. Ma all'interno di ogni data, ordina le righe in ordine decrescente in base a 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

Note

  • È possibile specificare direttamente il blocco di script dell'espressione, come argomento, anziché specificarlo come Expression voce in una tabella hash. Ad esempio:

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

    Questo esempio è utile per i cmdlet che non richiedono (o supportano) la denominazione di una proprietà tramite la Name chiave, ad esempio Sort-Object, Group-Objecte Measure-Object.

    Per i cmdlet che supportano la denominazione della proprietà, il blocco di script viene convertito in una stringa e usato come nome della proprietà nell'output.

  • Expression I blocchi di script vengono eseguiti negli ambiti figlio , vale a dire che le variabili del chiamante non possono essere modificate direttamente.

  • La logica della pipeline viene applicata all'output dai Expression blocchi di script. Ciò significa che l'output di una matrice a singolo elemento causa l'annullamento del wrapping della matrice.

  • Per la maggior parte dei cmdlet, gli errori all'interno dei blocchi di script di espressione vengono ignorati in modalità non interattiva. Per Sort-Object, gli errori di terminazione dell'istruzione e di terminazione dello script vengono restituiti , ma non terminano l'istruzione.

Vedi anche