Condividi tramite


6. Conversioni

Nota editoriale

Importante

La specifica del linguaggio Windows PowerShell 3.0 è stata pubblicata nel dicembre 2012 ed è basata su Windows PowerShell 3.0. Questa specifica non riflette lo stato corrente di PowerShell. Non è previsto l'aggiornamento di questa documentazione per riflettere lo stato corrente. Questa documentazione è presentata qui per riferimento cronologico.

Il documento di specifica è disponibile come documento Word di Microsoft nell'Area download Microsoft all'indirizzo: https://www.microsoft.com/download/details.aspx?id=36389. Il documento di Word è stato convertito per la presentazione qui su Microsoft Learn. Durante la conversione sono state apportate alcune modifiche editoriali per supportare la formattazione per la piattaforma Docs. Sono stati corretti alcuni errori di digitazioni e errori secondari.

Una conversione di tipo viene eseguita quando un valore di un tipo viene utilizzato in un contesto che richiede un tipo diverso. Se tale conversione avviene automaticamente, è nota come conversione implicita . Un esempio comune è costituito da alcuni operatori che devono convertire uno o più dei valori designati dai relativi operandi. La conversione implicita è consentita a condizione che il senso del valore di origine venga mantenuto, ad esempio senza perdita di precisione di un numero quando viene convertito.

L'operatore cast (§7.2.9) consente conversione esplicita.

Le conversioni sono illustrate di seguito, con informazioni supplementari fornite in base alle esigenze nella descrizione di ogni operatore in §6.19.

La conversione esplicita di un valore al tipo che ha già non provoca alcuna modifica a tale valore o alla sua rappresentazione.

Le regole per la conversione quando il valore di un'espressione viene associato a un parametro sono trattate in §6.17.

6.1 Conversione in void

Un valore di qualsiasi tipo può essere scartato in modo esplicito effettuando un cast al tipo void. Non c'è alcun risultato.

6.2 Conversione in bool

Le regole per la conversione di qualsiasi valore in tipo bool sono le seguenti:

  • Un valore numerico o char pari a zero viene convertito in False; un valore numerico o char diverso da zero viene convertito in True.
  • Un valore di tipo Null viene convertito in False.
  • Una stringa di lunghezza 0 viene convertita in False; una stringa di lunghezza > 0 viene convertita in True.
  • Un parametro switch con valore $true viene convertito in True e uno con valore $false viene convertito in False.
  • Tutti gli altri valori di tipo riferimento non Null vengono convertiti in True.

Se il tipo implementa IList:

  • Se la lunghezza dell'oggetto è > 2, il valore viene convertito in "True".
  • Se la lunghezza dell'oggetto è 1 e il primo elemento non è un IList, se il valore dell'elemento è vero, il valore viene convertito in True.
  • In caso contrario, se il conteggio del primo elemento >= 1, il valore viene convertito in Vero.
  • In caso contrario, il valore viene convertito in False.

6.3 Conversione in char

Le regole per la conversione di qualsiasi valore nel tipo char sono le seguenti:

  • La conversione di un valore di tipo bool, decimal, float o double è in errore.
  • Un valore di tipo Null viene convertito nel carattere null (U+0000).
  • Valore di tipo integer il cui valore può essere rappresentato nel tipo char ha tale valore; in caso contrario, la conversione è in errore.
  • La conversione di un valore stringa con lunghezza diversa da 1 è in errore.
  • Un valore di stringa di lunghezza 1 viene convertito in un carattere che ha quel valore.
  • Valore di tipo numerico il cui valore dopo l'arrotondamento di qualsiasi parte frazionaria può essere rappresentato nel tipo di destinazione ha tale valore arrotondato; in caso contrario, la conversione è in errore.
  • Per altri valori di tipo riferimento, se il tipo riferimento supporta tale conversione, tale conversione viene utilizzata; in caso contrario, la conversione è in errore.

6.4 Conversione in numero intero

Le regole per la conversione di qualsiasi valore in tipo byte, int o long sono le seguenti:

  • Il valore bool False viene convertito in zero; il valore bool True viene convertito in 1.
  • Valore di tipo char il cui valore può essere rappresentato nel tipo di destinazione ha tale valore; in caso contrario, la conversione è in errore.
  • Valore di tipo numerico il cui valore dopo l'arrotondamento di qualsiasi parte frazionaria può essere rappresentato nel tipo di destinazione ha tale valore arrotondato; in caso contrario, la conversione è in errore.
  • Un valore di tipo Null viene convertito in zero.
  • Una stringa che rappresenta un numero viene convertita come descritto in §6.16. Se dopo il troncamento della parte frazionaria il risultato può essere rappresentato nel tipo di destinazione, la stringa è ben formata e ha il tipo di destinazione; in caso contrario, la conversione è in errore. Se la stringa non rappresenta un numero, la conversione è in errore.
  • Per altri valori di tipo riferimento, se il tipo riferimento supporta tale conversione, tale conversione viene utilizzata; in caso contrario, la conversione è in errore.

6.5 Conversione a float e double

Le regole per la conversione di qualsiasi valore in tipo float o double sono le seguenti:

  • Il valore bool False viene convertito in zero; il valore bool True viene convertito in 1.
  • Un valore char è rappresentato esattamente.
  • Un valore di tipo numerico è rappresentato esattamente, se possibile; tuttavia, per le conversioni da int, long e decimal a float, e per le conversioni da long e decimal a double, alcuni dei bit meno significativi del valore intero possono essere persi.
  • Un valore di tipo Null viene convertito in zero.
  • Una stringa che rappresenta un numero viene convertita come viene descritto in §6.16; in caso contrario, la conversione risulta in errore.
  • Per altri valori di tipo riferimento, se il tipo riferimento supporta tale conversione, tale conversione viene utilizzata; in caso contrario, la conversione è in errore.

6.6 Conversione in decimale

Le regole per la conversione di qualsiasi valore in tipo decimal sono le seguenti:

  • Il valore bool False viene convertito in zero; il valore bool True viene convertito in 1.
  • Un valore del tipo char è rappresentato in maniera precisa.
  • Un valore di tipo numerico è rappresentato esattamente; Tuttavia, se tale valore è troppo grande o troppo piccolo per adattarsi al tipo di destinazione, la conversione è in errore.
  • Un valore di tipo Null viene convertito in zero.
  • Una stringa che rappresenta un numero viene convertita come viene descritto in §6.16; in caso contrario, la conversione risulta in errore.
  • Per altri valori di tipo riferimento, se il tipo riferimento supporta tale conversione, tale conversione viene utilizzata; in caso contrario, la conversione è in errore.
  • La scala del risultato di una conversione riuscita è tale che la parte frazionaria non ha zeri finali.

6.7 Conversione in oggetto

Il valore di qualsiasi tipo tranne il tipo Null (4.1.2) può essere convertito in oggetto di tipo. Il valore mantiene il tipo e la rappresentazione.

6.8 Conversione in stringa

Le regole per la conversione di qualsiasi valore in stringa di tipo sono le seguenti:

  • Il valore bool $false viene convertito in "False"; il valore bool $true viene convertito in "True".
  • Un valore di tipo char viene convertito in una stringa di 1 caratteri contenente tale carattere.
  • Un valore di tipo numerico viene convertito in una stringa con il formato di un valore letterale numerico corrispondente. Tuttavia, il risultato non ha spazi iniziali o finali, nessun segno più iniziale, i numeri interi hanno base 10 e non presenta alcun suffisso di tipo. Per una conversione decimale, la scala viene mantenuta. Per i valori -∞, +∞ e NaN, le stringhe risultanti sono rispettivamente "-Infinity", "Infinity" e "NaN".
  • Un valore di tipo Null viene convertito nella stringa vuota.
  • Per una matrice tridimensionale, il risultato è una stringa contenente il valore di ogni elemento della matrice, dall'inizio alla fine, convertito in stringa, con elementi separati dal separatore di campo di output corrente (§2.3.2.2). Per una matrice con elementi che sono stessi matrici, vengono convertiti solo gli elementi di primo livello. La stringa utilizzata per rappresentare il valore di un elemento che è una matrice è definita dall'implementazione. Per una matrice multidimensionale, viene appiattita (§9.12) e quindi considerata come matrice 1 dimensionale.
  • Un valore di tipo Null viene convertito nella stringa vuota.
  • Un valore del tipo scriptblock viene convertito in una stringa contenente il testo del blocco senza i caratteri { e } delimitatori.
  • Per un valore di tipo di enumerazione, il risultato è una stringa contenente il nome di ogni costante di enumerazione codificata in tale valore, separati da virgole.
  • Per altri valori di tipo riferimento, se il tipo riferimento supporta tale conversione, tale conversione viene utilizzata; in caso contrario, la conversione è in errore.

Stringa utilizzata per rappresentare il valore di un elemento che è una matrice ha il formato System.Type[], System.Type[,]e così via. Per altri tipi di riferimento, viene chiamato il metodo ToString. Per altri tipi enumerabili, il valore di origine viene considerato come una matrice bidimensionale.

6.9 Conversione in matrice

Le regole per la conversione di qualsiasi valore in un tipo di matrice sono le seguenti:

  • Il tipo di destinazione non può essere una matrice multidimensionale.
  • Un valore di tipo Null viene mantenuto così come è.
  • Per un valore scalare diverso da $null o un valore di tipo hashtable, viene creata una nuova matrice a 1 elemento il cui valore è scalare dopo la conversione al tipo di elemento di destinazione.
  • Per un valore di matrice 1 dimensionale, viene creata una nuova matrice del tipo di destinazione e ogni elemento viene copiato con la conversione dalla matrice di origine all'elemento corrispondente nella matrice di destinazione.
  • Per un valore di matrice multidimensionale, tale matrice viene prima appiattita (§9,12) e quindi considerata come valore di matrice 1 dimensionale.
  • Un valore stringa viene convertito in un array di caratteri con la stessa lunghezza, con i caratteri successivi della stringa che occupano le posizioni corrispondenti nell'array.

Per altri tipi enumerabili, viene creata una nuova matrice di 1 elemento il cui valore è l'elemento corrispondente dopo la conversione al tipo di elemento di destinazione, se tale conversione esiste. In caso contrario, la conversione è sbagliata.

6.10 Conversione in xml

L'oggetto viene convertito in stringa di tipo e quindi in un oggetto Document XML di tipo xml.

6.11 Conversione in espressione regolare

Un'espressione che definisce un valore di tipo string può essere convertita nel tipo regex.

6.12 Conversione in scriptblock

Di seguito sono riportate le regole per la conversione di qualsiasi valore nel tipo scriptblock:

  • Un valore stringa viene trattato come il nome di un comando, seguito facoltativamente da argomenti per una chiamata a quel comando.

6.13 Conversione in tipi di enumerazione

Le regole per la conversione di qualsiasi valore in un tipo di enumerazione sono le seguenti:

  • Un valore di tipo string che contiene uno dei valori denominati (per quanto riguarda il caso) per un tipo di enumerazione viene convertito in tale valore denominato.
  • Un valore di tipo string che contiene un elenco delimitato da virgole di valori denominati (per quanto riguarda il caso) per un tipo di enumerazione viene convertito nell'OR bit per bit di tutti i valori denominati.

6.14 Conversione in altri tipi di riferimento

Di seguito sono riportate le regole per la conversione di qualsiasi valore in un tipo riferimento diverso da un tipo di matrice o una stringa:

  • Un valore di tipo Null viene mantenuto così come è.
  • In caso contrario, il comportamento è definito dall'implementazione.

Un certo numero di componenti entrano in gioco qui; questi includono il possibile uso di costruttori con un singolo argomento o costruttori predefiniti se il valore è una tabella hash, operatori di conversione impliciti ed espliciti e metodi Parse per il tipo di destinazione; l'uso di Convert.ConvertTo; e il meccanismo di conversione ETS.

6.15 Conversioni aritmetiche consuete

Se nessuno degli operandi designa un valore con tipo numerico,

  • Se l'operando sinistro definisce un valore di tipo bool, la conversione è in errore.
  • In caso contrario, tutti gli operandi che designano il valore $null vengono convertiti in zero di tipo int e il processo continua con le conversioni numeriche elencate di seguito.
  • In caso contrario, se l'operando sinistro designa un valore di tipo char e l'operando destro designa un valore di tipo bool, la conversione è in errore.
  • In caso contrario, se l'operando sinistro designa un valore di tipo string ma non rappresenta un numero (§6.16), la conversione è in errore.
  • In caso contrario, se l'operando destro designa un valore di tipo string ma non rappresenta un numero (§6.16), la conversione è in errore.
  • In caso contrario, tutti gli operandi che designano valori di tipo string vengono convertiti in numeri (§6.16) e il processo continua con le conversioni numeriche elencate di seguito.
  • In caso contrario, la conversione è sbagliata.

Conversioni numeriche:

  • Se un operando designa un valore di tipo decimal, il valore designato dall'altro operando viene convertito in tale tipo, se necessario. Il risultato è di tipo decimale.
  • In caso contrario, se un operando designa un valore di tipo double, il valore designato dall'altro operando viene convertito in tale tipo, se necessario. Il risultato è di tipo doppio.
  • In caso contrario, se un operando designa un valore di tipo float, i valori designati da entrambi gli operandi vengono convertiti in tipo double, se necessario. Il risultato è di tipo doppio.
  • In caso contrario, se un operando designa un valore di tipo long, il valore designato dall'altro valore operando viene convertito in tale tipo, se necessario. Il risultato ha il primo tipo nella sequenza, long o double, che può rappresentare il suo valore.
  • In caso contrario, i valori designati da entrambi gli operandi vengono convertiti in tipo int, se necessario. Il risultato ha il primo nella sequenza int, long, double che può rappresentare il valore senza troncamento.

6.16 Conversione da stringa a tipo numerico

A seconda del contenuto, una stringa può essere convertita in modo esplicito o implicito in un valore numerico. Specificamente

  • Una stringa vuota viene convertita nel valore zero.
  • Gli spazi iniziali e finali vengono ignorati; Tuttavia, una stringa potrebbe non essere costituita solo da spazi.
  • Una stringa contenente solo spazi vuoti e/o caratteri di terminazione riga viene convertita nel valore zero.
  • È consentito un segno iniziale + o - .
  • Un numero intero può avere un prefisso esadecimale (0x o 0X).
  • Un esponente firmato facoltativamente è consentito.
  • I suffissi di tipo e i moltiplicatori non sono consentiti.
  • Le stringhe "-Infinity", "Infinity" e "NaN" vengono riconosciute rispettivamente come valori -∞, +∞ e NaN.

6.17 Conversione durante l'associazione di parametri

Per informazioni sull'associazione di parametri, vedere §8.14.

Quando il valore di un'espressione viene associato a un parametro, esistono considerazioni aggiuntive sulla conversione, come descritto di seguito:

  • Se il tipo di parametro è switch (§4.2.5, §8.10.5) e il parametro non ha alcun argomento, il valore del parametro nel comando chiamato è impostato su $true. Se il tipo di parametro è diverso da switch, un parametro senza argomento è un errore.
  • Se il tipo di parametro è switch e il valore dell'argomento è $null, il valore del parametro viene impostato su $false.
  • Se il tipo di parametro è object o è uguale al tipo dell'argomento, il valore dell'argomento viene passato senza conversione.
  • Se il tipo di parametro non è un oggetto o uno scriptblock, un argomento di tipo scriptblock viene valutato e il suo risultato viene passato come valore dell'argomento. Questa operazione è nota come associazione di blocchi di script ritardata .) Se il tipo di parametro è object o scriptblock, un argomento con tipo scriptblock viene passato così come è.
  • Se il tipo di parametro è una raccolta di tipo T2 e l'argomento è scalare di tipo T1, tale scalare viene convertito in una raccolta di tipo T2 contenente un elemento. Se necessario, il valore scalare viene convertito in tipo T2 usando le regole di conversione di questa sezione.
  • Se il tipo di parametro è un tipo scalare diverso dall'oggetto e l'argomento è una raccolta, l'argomento è in errore.
  • Se il tipo di parametro previsto è una raccolta di tipo T2 e l'argomento è una raccolta di tipo T1, l'argomento viene convertito in una raccolta di tipo T2 con la stessa lunghezza della raccolta di argomenti. Se necessario, i valori degli elementi della raccolta di argomenti vengono convertiti nel tipo T2 usando le regole di conversione di questa sezione.
  • Se i passaggi precedenti e le conversioni specificate in precedenza in questo capitolo non sono sufficienti, vengono applicate le regole in §6.18. Se questi falliscono, il binding dei parametri fallisce.

6.18 Conversione .NET

Per una conversione implicita, vengono tentate prima le conversioni predefinite di PowerShell. Se non è possibile risolvere la conversione, vengono provati i convertitori personalizzati .NET seguenti, in ordine dall'alto verso il basso. Se viene trovata una conversione, ma genera un'eccezione, la conversione non è riuscita.

  • PSTypeConverter: esistono due modi per associare l'implementazione della classe PSTypeConverter alla relativa classe di destinazione: tramite il file di configurazione del tipo (types.ps1xml) o applicando l'attributo System.ComponentModel.TypeConverterAttribute alla classe di destinazione. Per altre informazioni, vedere la documentazione di PowerShell SDK.

  • TypeConverter: questo tipo CLR offre un modo unificato per convertire i tipi di valori in altri tipi, nonché per accedere ai valori standard e alle sottoproprietà. Il tipo di convertitore più comune è quello che converte in e da una rappresentazione di testo. Il convertitore di tipi per una classe è legato alla classe con un System.ComponentModel.TypeConverterAttribute. A meno che questo attributo non venga sottoposto a override, tutte le classi che ereditano da questa classe usano lo stesso convertitore di tipi della classe base. Per altre informazioni, vedere PowerShell SDK e la documentazione di Microsoft .NET Framework.

  • Metodo parse: se il tipo di origine è stringa e il tipo di destinazione ha un metodo denominato Parse, viene chiamato tale metodo per eseguire la conversione.

  • Costruttori: se il tipo di destinazione ha un costruttore che accetta un singolo argomento il cui tipo è quello del tipo di origine, tale costruttore viene chiamato per eseguire la conversione.

  • Operatore cast implicito: se il tipo di origine dispone di un operatore cast implicito che esegue la conversione nel tipo di destinazione, tale operatore viene chiamato per eseguire la conversione.

  • Operatore cast esplicito: Se il tipo di origine dispone di un operatore cast esplicito che converte nel tipo di destinazione, viene chiamato tale operatore per eseguire la conversione. Se il tipo di destinazione dispone di un operatore cast esplicito che esegue la conversione dal tipo di origine, tale operatore viene chiamato per eseguire la conversione.

  • IConvertable: System.Convert.ChangeType viene chiamato per eseguire la conversione.

Conversione a un ordine specifico

Le regole per la conversione di qualsiasi valore al pseudotipo ordinato sono le seguenti:

  • Se il valore è un hash letterale (§2.3.5.6), il risultato è un oggetto con un tipo definito dall'implementazione che funziona come una tabella hash e l'ordine delle chiavi corrisponde all'ordine specificato nel hash letterale.
  • In caso contrario, il comportamento è definito dall'implementazione.

Solo i valori letterali hash (§2.3.5.6) possono essere convertiti in ordinati. Il risultato è un'istanza di System.Collections.Specialized.OrderedDictionary.

6.20 Conversione in pscustomobject

Di seguito sono riportate le regole per la conversione di qualsiasi valore nell'oggetto pscustomobject di tipo pseudotipo:

  • Un valore di tipo hashtable viene convertito in un oggetto PowerShell. Ogni chiave nella tabella hash diventa noteProperty con il valore corrispondente.
  • In caso contrario, il comportamento è definito dall'implementazione.

La conversione è sempre consentita, ma non modifica il tipo del valore.