6. Konverteringar

Redaktionell anteckning

Viktig

Windows PowerShell Language Specification 3.0 publicerades i december 2012 och baseras på Windows PowerShell 3.0. Den här specifikationen återspeglar inte det aktuella tillståndet för PowerShell. Det finns ingen plan för att uppdatera den här dokumentationen för att återspegla det aktuella tillståndet. Den här dokumentationen presenteras här för historisk referens.

Specifikationsdokumentet är tillgängligt som ett Microsoft Word dokument från Microsoft Download Center på: https://www.microsoft.com/download/details.aspx?id=36389 Det Word dokumentet har konverterats för presentation här på Microsoft Learn. Under konverteringen har vissa redaktionella ändringar gjorts för att anpassa formateringen för Docs-plattformen. Vissa stavfel och mindre fel har korrigerats.

En typkonvertering utförs när ett värde av en typ används i en kontext som kräver en annan typ. Om en sådan konvertering sker automatiskt kallas den implicit konvertering. (Ett vanligt exempel på detta är med vissa operatorer som behöver konvertera ett eller flera av de värden som anges av deras operander.) Implicit konvertering tillåts förutsatt att källvärdets känsla bevaras, till exempel ingen förlust av precision för ett tal när det konverteras.

Type casting-operatorn (§7.2.9) tillåter explicit konvertering.

Konverteringar beskrivs nedan, med kompletterande information som lämnas vid behov i beskrivningen av varje operatör i §6.19.

Explicit konvertering av ett värde till den typ som det redan har medför ingen ändring av det värdet eller dess representation.

Reglerna för att överlämna konvertering när värdet för ett uttryck är bundet till en parameter omfattas av §6.17.

6.1 Konvertering till ogiltig

Ett värde av vilken typ som helst kan ignoreras explicit genom att konvertera det till typ void. Det finns inget resultat.

6.2 Konvertering till bool

Reglerna för att konvertera valfritt värde till typbool är följande:

  • Ett numeriskt värde eller teckenvärde på noll konverteras till False. ett numeriskt värde eller teckenvärde på icke-noll konverteras till Sant.
  • Värdet null konverteras till False.
  • En sträng med längd 0 konverteras till False. en sträng med längd > 0 konverteras till Sant.
  • En [switch] parameter med värde $true konverteras till True och en med värdet $false konverteras till False.
  • Alla andra referenstypvärden som inte är null konverteras till Sant.

Om typen implementerar IList:

  • Om objektets längd > 2 konverteras värdet till Sant.
  • Om objektets längd är 1 och det första elementet inte i sig är en IList konverteras värdet till Sant om elementets värde är sant.
  • Annars konverteras värdet till Sant om det första elementets Antal >= 1.
  • Annars konverteras värdet till Falskt.

6.3 Konvertering till tecken

Reglerna för att konvertera valfritt värde till typtecken är följande:

  • Konverteringen av ett värde av typen bool, decimal, float eller double är ett fel.
  • Värdet null konverteras till nulltecknet (U+0000).
  • Ett heltalstypvärde vars värde kan representeras i typtecken har det värdet. annars är konverteringen fel.
  • Konverteringen av ett strängvärde med en annan längd än 1 är ett fel.
  • Ett strängvärde som har en längd 1 konverteras till ett tecken med det tecknets värde.
  • Ett numeriskt typvärde vars värde efter avrundning av valfri del kan representeras i måltypen har det avrundade värdet. annars är konverteringen fel.
  • För andra referenstypsvärden används konverteringen om referenstypen stöder en sådan konvertering. annars är konverteringen fel.

6.4 Konvertering till heltal

Reglerna för att konvertera valfritt värde till typ byte, int eller long är följande:

  • Bool-värdet False konverteras till noll. bool-värdet True konverteras till 1.
  • Ett teckentypvärde vars värde kan representeras i måltypen har det värdet. annars är konverteringen fel.
  • Ett numeriskt typvärde vars värde efter avrundning av valfri del kan representeras i måltypen har det avrundade värdet. annars är konverteringen fel.
  • Värdet null konverteras till noll.
  • En sträng som representerar ett tal konverteras enligt beskrivningen i §6.16. Om resultatet efter trunkeringen av bråkdelen kan representeras i måltypen är strängen väl utformad och har den önskade typen; annars är konverteringen felaktig. Om strängen inte representerar ett tal är konverteringen fel.
  • För andra referenstypsvärden används konverteringen om referenstypen stöder en sådan konvertering. annars är konverteringen fel.

6.5 Konvertering till flyttal och dubbel

Reglerna för att konvertera ett värde till typen float eller double är följande:

  • Bool-värdet False konverteras till noll. bool-värdet True konverteras till 1.
  • Ett teckenvärde representeras exakt.
  • Ett numeriskt typvärde representeras exakt, om möjligt; emellertid, vid konverteringar av int, long och decimal till float, samt vid konverteringar av long och decimal till double, kan vissa av de minst signifikanta bitarna i heltalsvärdet gå förlorade.
  • Värdet null konverteras till noll.
  • En sträng som representerar ett tal konverteras enligt beskrivningen i §6.16; annars är konverteringen fel.
  • För andra referenstypsvärden används konverteringen om referenstypen stöder en sådan konvertering. annars är konverteringen fel.

6,6 Konvertering till decimal

Reglerna för att konvertera valfritt värde till att skriva decimaler är följande:

  • Bool-värdet False konverteras till noll. bool-värdet True konverteras till 1.
  • Ett teckentypvärde representeras exakt.
  • Ett numeriskt typvärde representeras exakt. Men om värdet är för stort eller för litet för att få plats i måltypen är konverteringen fel.
  • Värdet null konverteras till noll.
  • En sträng som representerar ett tal konverteras enligt beskrivningen i §6.16; annars är konverteringen fel.
  • För andra referenstypsvärden används konverteringen om referenstypen stöder en sådan konvertering. annars är konverteringen fel.
  • Skalan för resultatet av en lyckad konvertering är sådan att bråkdelen inte har några avslutande nollor.

6.7 Konvertering till objekt

Värdet för alla typer utom null-typen (4.1.2) kan konverteras till typobjekt. Värdet behåller sin typ och representation.

6.8 Konvertering till sträng

Reglerna för att konvertera valfritt värde till typsträng är följande:

  • Bool-värdet $false konverteras till "False"; bool-värdet $true konverteras till "True".
  • Ett teckentypvärde konverteras till en sträng med 1 tecken som innehåller det teckenet.
  • Ett numeriskt typvärde konverteras till en sträng som har formen av en motsvarande numerisk literal. Resultatet har dock inga inledande eller avslutande blanksteg, inget plustecken i början, heltal har bas 10 och det finns inget typsuffix. För en decimalkonvertering bevaras skalan. För värden för -∞, +∞ och NaN är de resulterande strängarna "-Infinity", "Infinity" respektive "NaN".
  • Värdet null konverteras till den tomma strängen.
  • För en 1-dimensionell matris är resultatet en sträng som innehåller värdet för varje element i matrisen, från början till slut, konverterad till sträng, med element som avgränsas av den aktuella utdatafältavgränsaren (§2.3.2.2). För en matris med element som själva är matriser konverteras endast de översta elementen. Den sträng som används för att representera värdet för ett element som är en matris definieras som implementering. För en flerdimensionell matris plattas den ut (§9.12) och behandlas sedan som en 1-dimensionell matris.
  • Värdet null konverteras till den tomma strängen.
  • Ett skriptblockstypvärde konverteras till en sträng som innehåller texten i blocket utan de avgränsande { och } tecknen.
  • För ett uppräkningstypvärde är resultatet en sträng som innehåller namnet på varje uppräkningskonstant som kodas i det värdet, avgränsat med kommatecken.
  • För andra referenstypsvärden används konverteringen om referenstypen stöder en sådan konvertering. annars är konverteringen fel.

Strängen som används för att representera värdet för ett element som är en matris har formuläret System.Type[], System.Type[,]och så vidare. För andra referenstyper anropas metoden ToString. För andra uppräkningsbara typer behandlas källvärdet som en 1-dimensionell matris.

6.9 Konvertering till matris

Reglerna för att konvertera valfritt värde till en matristyp är följande:

  • Måltypen kanske inte är en flerdimensionell matris.
  • Ett värde av null-typ behålls som det är.
  • För ett annat skalärt värde än $null eller ett värde av typen hashtable skapas en ny 1-elementmatris vars värde är skalären efter konverteringen till målelementtypen.
  • För ett 1-dimensionellt matrisvärde skapas en ny matris av måltypen och varje element kopieras med konvertering från källmatrisen till motsvarande element i målmatrisen.
  • För ett flerdimensionellt matrisvärde plattas den matrisen först ut (§9.12) och behandlas sedan som ett 1-dimensionellt matrisvärde.
  • Ett strängvärde konverteras till en matris med tecken med samma längd med efterföljande tecken från strängen som upptar motsvarande positioner i matrisen.

För andra uppräkningsbara typer skapas en ny 1-elementmatris vars värde är motsvarande element efter konvertering till målelementtypen, om det finns en sådan konvertering. Annars är konverteringen fel.

6.10 Konvertering till xml

Objektet konverteras till typsträng och sedan till ett XML-dokumentobjekt av typen xml.

6.11 Konvertering till regex

Ett uttryck som anger ett värde av typen sträng kan konverteras till typ regex.

6.12 Konvertering till scriptblock

Reglerna för att konvertera valfritt värde till typ scriptblock är följande:

  • Ett strängvärde betraktas som namnet på ett kommando, och kan följas av argument i ett anrop till det kommandot.

6.13 Konvertering till uppräkningstyper

Reglerna för att konvertera ett värde till en uppräkningstyp är följande:

  • Ett strängvärde som innehåller ett av de namngivna värdena (med hänsyn till skiftläge) för en uppräkningstyp konverteras till det namngivna värdet.
  • Ett värde av typen sträng som innehåller en kommaavgränsad lista med namngivna värden (med avseende på skiftläge) för en uppräkningstyp konverteras till bitwise-OR för alla dessa namngivna värden.

6.14 Konvertering till andra referenstyper

Reglerna för att konvertera ett värde till en annan referenstyp än en matristyp eller sträng är följande:

  • Ett värde av null-typ behålls som det är.
  • I annat fall definieras beteendet för implementeringen.

Ett antal mekanismer spelar en roll här; Dessa omfattar möjlig användning av enkla argumentkonstruktorer eller standardkonstruktorer om värdet är en hashtable, implicita och explicita konverteringsoperatorer, användningen av parsningsmetoder för måltypen; användning av Convert.ConvertTo; samt ETS-konverteringsmekanismen.

6.15 Vanliga aritmetiska konverteringar

Om ingen av operanderna anger ett värde med numerisk typ,

  • Om den vänstra operanden anger ett värde av typen bool, är konverteringen fel.
  • Annars konverteras alla operander som anger värdet $null till noll av typen int och processen fortsätter med de numeriska konverteringar som anges nedan.
  • Annars, om den vänstra operanden anger ett värde av typen char och den högra operanden anger ett värde av typen bool, är konverteringen i fel.
  • Annars, om den vänstra operanden anger ett värde av typen sträng men inte representerar ett tal (§6.16), är konverteringen i fel.
  • Annars, om den högra operanden anger ett värde av typen sträng men inte representerar ett tal (§6.16), är konverteringen i fel.
  • I annat fall konverteras alla operander som anger värden av typsträngen till tal (§6.16), och processen fortsätter med de numeriska konverteringar som anges nedan.
  • Annars är konverteringen fel.

Numeriska konverteringar:

  • Om en operande anger ett värde av typen decimal konverteras det värde som anges av den andra operanden till den typen, om det behövs. Resultatet har typen decimal.
  • Annars, om en operande anger ett värde av typen double, konverteras värdet som anges av den andra operanden till den typen, om det behövs. Resultatet har typen double.
  • Annars, om en operand anger ett värde av typen float, konverteras värdena som anges av båda operanderna till typen dubbel, om det behövs. Resultatet har typen double.
  • Annars, om en operande anger ett värde av typen long, konverteras värdet som anges av det andra operandvärdet till den typen, om det behövs. Resultatet har den första typen i sekvensen long och double som kan representera dess värde.
  • Annars konverteras de värden som anges av båda operanderna till typ int, om det behövs. Resultatet har den första av typen int, long eller double i sekvensen som kan representera dess värde utan avkortning.

6.16 Konvertering från sträng till numerisk typ

Beroende på innehållet kan en sträng konverteras explicit eller implicit till ett numeriskt värde. Specifikt

  • En tom sträng konverteras till värdet noll.
  • Inledande och avslutande blanksteg ignoreras, men en sträng får inte enbart bestå av blanksteg.
  • En sträng som endast innehåller blanksteg och/eller radavgränsare konverteras till värdet noll.
  • Ett inledande + eller - tecken är tillåtet.
  • Ett heltalsnummer kan ha ett hexadecimalt prefix (0x eller 0X).
  • En eventuellt signerad exponent tillåts.
  • Typsuffix och multiplikatorer är inte tillåtna.
  • De skiftlägesspecifika strängarna "-Infinity", "Infinity" och "NaN" identifieras som värdena -∞, +∞ respektive NaN.

6.17 Konvertering under parameterbindning

Information om parameterbindning finns i §8.14.

När värdet för ett uttryck är bundet till en parameter finns det extra konverteringsöverväganden enligt beskrivningen nedan:

  • Om parametertypen är switch (§4.2.5, §8.10.5) och parametern inte har något argument, anges värdet för parametern i det anropade kommandot till $true. Om parametertypen är något annat än en switch, är det ett fel om en parameter saknar argument.
  • Om parametertypen är switch och argumentvärdet är $nullanges parametervärdet till $false.
  • Om parametertypen är objekt eller är samma som typen av argument skickas argumentets värde utan konvertering.
  • Om parametertypen inte är objekt eller scriptblock utvärderas ett argument med typ scriptblock och resultatet skickas som argumentets värde. (Detta kallas fördröjd skriptblockbindning.) Om parametertypen är objekt eller scriptblock skickas ett argument med typ scriptblock som det är.
  • Om parametertypen är en samling av typen T2 och argumentet är en skalär av typen T1 konverteras skalären till en samling av typen T2 som innehåller ett element. Vid behov konverteras det skalära värdet till typ T2 med hjälp av konverteringsreglerna i det här avsnittet.
  • Om parametertypen är en annan skalär typ än objektet och argumentet är en samling, är argumentet fel.
  • Om den förväntade parametertypen är en samling av typen T2 och argumentet är en samling av typen T1 konverteras argumentet till en samling av typen T2 som har samma längd som argumentsamlingen. Om det behövs konverteras elementvärdena för argumentsamlingen till typ T2 med hjälp av konverteringsreglerna i det här avsnittet.
  • Om stegen ovan och de konverteringar som anges tidigare i detta kapitel inte räcker tillämpas reglerna i §6.18. Om dessa misslyckas misslyckas parameterbindningen.

6.18 .NET konvertering

För en implicit konvertering provas PowerShells inbyggda konverteringar först. Om de inte kan lösa konverteringen provas de .NET anpassade konverterarna nedan i ordning uppifrån och ned. Om en konvertering hittas, men det utlöser ett undantag, har konverteringen misslyckats.

  • PSTypeConverter: Det finns två sätt att associera implementeringen av PSTypeConverter-klassen med dess målklass: genom typkonfigurationsfilen (types.ps1xml) eller genom att tillämpa attributet System.ComponentModel.TypeConverterAttribute på målklassen. Mer information finns i PowerShell SDK-dokumentationen.

  • TypeConverter: Den här CLR-typen ger ett enhetligt sätt att konvertera typer av värden till andra typer, samt för åtkomst till standardvärden och underegenskaper. Den vanligaste typen av konverterare är en som konverterar till och från en textrepresentation. Typkonverteraren för en klass är bunden till klassen med en System.ComponentModel.TypeConverterAttribute. Om inte det här attributet åsidosätts använder alla klasser som ärver från den här klassen samma typkonverterare som basklassen. Mer information finns i Dokumentationen om PowerShell SDK och Microsoft .NET Framework.

  • Parse-metoden: Om källtypen är sträng och måltypen har en metod som heter Parseanropas metoden för att utföra konverteringen.

  • Konstruktorer: Om måltypen har en konstruktor med ett enda argument vars typ är av källtypen anropas konstruktorn för att utföra konverteringen.

  • Implicit cast-operator: Om källtypen har en implicit cast-operator som konverterar till måltypen anropas operatorn för att utföra konverteringen.

  • Explicit Cast Operator: Om källtypen har en explicit cast-operator som konverterar till måltypen anropas operatorn för att utföra konverteringen. Om måltypen har en explicit cast-operator som konverterar från källtypen anropas operatorn för att utföra konverteringen.

  • IConvertable: System.Convert.ChangeType anropas för att utföra konverteringen.

6.19 Konvertering till beställd

Reglerna för att konvertera valfritt värde till den ordnade pseudotypen är följande:

  • Om värdet är en hashlitral (§2.3.5.6) är resultatet ett objekt med en implementeringsdefinierad typ som beter sig som en hashtable och nycklarnas ordning matchar den ordning som anges i hash-literalen.
  • I annat fall definieras beteendet för implementeringen.

Endast hashlitraler (§2.3.5.6) kan konverteras till ordnade. Resultatet är en instans av System.Collections.Specialized.OrderedDictionary.

6.20 Konvertering till pscustomobject

Reglerna för att konvertera ett värde till pseudotypen pscustomobject är följande:

  • Ett värde av typen hashtable konverteras till ett PowerShell-objekt. Varje nyckel i hashtabellen blir en NoteProperty med motsvarande värde.
  • I annat fall definieras beteendet för implementeringen.

Konverteringen tillåts alltid men ändrar inte värdetypen.