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
-opzionalealignment
-opzionale
Format-Custom
expression
depth
-opzionale
Format-List
name
/label
-opzionaleexpression
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
-opzionaleexpression
formatstring
-opzionalewidth
-opzionalealignment
-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
-opzionaleexpression
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 usarename
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 diexpression = { $_.<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 di0
.depth
- Il parametro Depth diFormat-Custom
specifica la profondità di espansione per tutte le proprietà. Ladepth
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,
@{
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
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 esempioSort-Object
,Group-Object
eMeasure-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.