Delen via


6. Conversies

Redactionele notitie

Belangrijk

De Windows PowerShell Language Specification 3.0 is gepubliceerd in december 2012 en is gebaseerd op Windows PowerShell 3.0. Deze specificatie geeft niet de huidige status van PowerShell weer. Er is geen plan om deze documentatie bij te werken om de huidige status weer te geven. Deze documentatie wordt hier gepresenteerd voor historische naslaginformatie.

Het specificatiedocument is beschikbaar als een Microsoft Word-document in het Microsoft Downloadcentrum op: https://www.microsoft.com/download/details.aspx?id=36389 Dat Word-document hier is geconverteerd voor presentatie in Microsoft Learn. Tijdens de conversie zijn enkele redactionele wijzigingen aangebracht om opmaak voor het Docs-platform mogelijk te maken. Sommige typfouten en kleine fouten zijn gecorrigeerd.

Een typeconversie wordt uitgevoerd wanneer een waarde van één type wordt gebruikt in een context waarvoor een ander type is vereist. Als een dergelijke conversie automatisch plaatsvindt, wordt dit impliciete conversiegenoemd. (Een veelvoorkomend voorbeeld hiervan is bij sommige operators die een of meer waarden moeten converteren die zijn aangewezen door hun operanden.) Impliciete conversie is toegestaan, mits het gevoel van de bronwaarde behouden blijft, zoals verlies van precisie van een getal wanneer deze wordt geconverteerd.

De cast-operator (§7.2.9) maakt expliciete conversie mogelijk.

Hieronder worden de conversies besproken, met aanvullende informatie die nodig is in de beschrijving van elke exploitant in §6.19.

Expliciete conversie van een waarde naar het type dat deze al heeft, veroorzaakt geen wijziging in die waarde of de weergave ervan.

De regels voor de handeling van de conversie wanneer de waarde van een expressie wordt gebonden aan een parameter, worden behandeld in §6.17.

6.1 Conversie naar ongeldige waarde

Een waarde van elk type kan expliciet worden genegeerd door het te casten naar het type void. Er is geen resultaat.

6.2 Conversie naar bool

De regels voor het converteren van een waarde naar het type bool zijn als volgt:

  • Een numerieke waarde of tekenwaarde van nul wordt geconverteerd naar Onwaar; een numerieke waarde of tekenwaarde van niet-nul wordt geconverteerd naar Waar.
  • Een waarde van het null-type wordt geconverteerd naar False.
  • Een tekenreeks van lengte 0 wordt geconverteerd naar Onwaar; een tekenreeks met lengte > 0 wordt geconverteerd naar Waar.
  • Een schakelparameter met waarde $true wordt geconverteerd naar Waar en één met waarde $false wordt geconverteerd naar Onwaar.
  • Alle andere niet-nul referentiewaarden van het type worden geconverteerd naar True.

Als het type IList implementeert:

  • Als de lengte van het object > gelijk is aan 2, wordt de waarde geconverteerd naar waar.
  • Als de lengte van het object 1 is en dat eerste element zelf geen IList is, wordt de waarde van dat element geconverteerd naar Waar als de waarde van dat element waar is.
  • Anders, als het aantal van het eerste element >= 1, wordt de waarde geconverteerd naar Waarde.
  • Anders wordt de waarde geconverteerd naar Onwaar.

6.3 Conversie naar char

De regels voor het omzetten van een waarde naar het type teken zijn als volgt:

  • De conversie van een waarde van het type bool, decimaal, float of dubbel is fout.
  • Een waarde van het type null wordt geconverteerd naar het null-teken (U+0000).
  • Een waarde van een geheel getal type waarvan de waarde kan worden weergegeven in het type char, heeft die waarde; anders is de conversie fout.
  • De conversie van een tekenreekswaarde met een andere lengte dan 1 is fout.
  • Een tekenreekswaarde met een lengte van 1 wordt omgezet naar een teken met dezelfde tekenwaarde.
  • Een numeriek typewaarde waarvan de waarde, na afronding van een breukdeel, kan worden weergegeven als het bestemmingstype heeft die afgeronde waarde; anders is de conversie foutief.
  • Voor andere referentietypewaarden, als het verwijzingstype een dergelijke conversie ondersteunt, wordt die conversie gebruikt; anders is de conversie onjuist.

6.4 Conversie naar geheel getal

De regels voor het converteren van een waarde naar type byte, int of lang zijn als volgt:

  • De boolwaarde False wordt geconverteerd naar nul; de boolwaarde True wordt geconverteerd naar 1.
  • Een tekentypewaarde waarvan de waarde kan worden weergegeven in het doeltype heeft die waarde; anders is de conversie onjuist.
  • Een numeriek typewaarde waarvan de waarde, na afronding van een breukdeel, kan worden weergegeven als het bestemmingstype heeft die afgeronde waarde; anders is de conversie foutief.
  • Een waarde van het null-type wordt geconverteerd naar nul.
  • Een tekenreeks die een getal vertegenwoordigt, wordt geconverteerd zoals beschreven in §6.16. Als na het afkappen van het breukdeel het resultaat kan worden weergegeven in het doeltype, is de tekenreeks goed gevormd en komt deze overeen met het doeltype; anders is er sprake van een conversiefout. Als de tekenreeks geen getal vertegenwoordigt, heeft de conversie een fout.
  • Voor andere referentietypewaarden, als het verwijzingstype een dergelijke conversie ondersteunt, wordt die conversie gebruikt; anders is de conversie onjuist.

6.5 Conversie naar float en double

De regels voor het converteren van een waarde naar het type float of double zijn als volgt:

  • De boolwaarde False wordt geconverteerd naar nul; de boolwaarde True wordt geconverteerd naar 1.
  • Een tekenwaarde wordt exact weergegeven.
  • Een numerieke typewaarde wordt, indien mogelijk, exact weergegeven; voor int-, long- en decimale conversies naar float, en voor long- en decimale conversies naar double, kunnen sommige van de minst significante bits van de gehele waarde verloren gaan.
  • Een waarde van het null-type wordt geconverteerd naar nul.
  • Een tekenreeks die een getal vertegenwoordigt, wordt geconverteerd zoals beschreven in §6.16; anders is de conversie onjuist.
  • Voor andere referentietypewaarden, als het verwijzingstype een dergelijke conversie ondersteunt, wordt die conversie gebruikt; anders is de conversie onjuist.

6,6 Conversie naar decimaal

De regels voor het converteren van een waarde naar het type decimaal zijn als volgt:

  • De boolwaarde False wordt geconverteerd naar nul; de boolwaarde True wordt geconverteerd naar 1.
  • Een waarde voor het tekentype wordt exact weergegeven.
  • Een numerieke typewaarde wordt exact weergegeven; Als deze waarde echter te groot of te klein is om in het doeltype te passen, treedt de conversie fout op.
  • Een waarde van het null-type wordt geconverteerd naar nul.
  • Een tekenreeks die een getal vertegenwoordigt, wordt geconverteerd zoals beschreven in §6.16; anders is de conversie onjuist.
  • Voor andere referentietypewaarden, als het verwijzingstype een dergelijke conversie ondersteunt, wordt die conversie gebruikt; anders is de conversie onjuist.
  • De schaal van het resultaat van een geslaagde conversie is zodanig dat het breukdeel geen aanvullende nullen heeft.

6.7 Conversie naar object

De waarde van elk type behalve het null-type (4.1.2) kan worden geconverteerd naar het typeobject. De waarde behoudt het type en de weergave.

6.8 Conversie naar tekenreeks

De regels voor het converteren van een waarde naar een tekenreeks zijn als volgt:

  • De boolwaarde $false wordt geconverteerd naar onwaar; de boolwaarde $true wordt geconverteerd naar waar.
  • Een tekentypewaarde wordt geconverteerd naar een tekenreeks van één teken die dat teken bevat.
  • Een numerieke typewaarde wordt geconverteerd naar een tekenreeks met de vorm van een bijbehorende numerieke letterlijke waarde. Het resultaat heeft echter geen voorloop- of volgspaties, er is geen voorloopplusteken, gehele getallen hebben een decimale basis en er is geen typeachtervoegsel. Voor een decimale conversie blijft de schaal behouden. Voor waarden van -∞, +∞ en NaN zijn de resulterende tekenreeksen respectievelijk '-Infinity', 'Infinity' en 'NaN'.
  • Een waarde van het null-type wordt geconverteerd naar de lege tekenreeks.
  • Voor een 1dimensionale matrix is het resultaat een tekenreeks met de waarde van elk element in die matrix, van begin tot eind, geconverteerd naar tekenreeks, waarbij elementen worden gescheiden door het huidige scheidingsteken voor uitvoervelden (§2.3.2.2). Voor een matrix met elementen die zelf matrices zijn, worden alleen de elementen op het hoogste niveau geconverteerd. De tekenreeks die wordt gebruikt om de waarde weer te geven van een element dat een matrix is, wordt gedefinieerd door de implementatie. Voor een multidimensionale matrix wordt deze afgevlakt (§9,12) en vervolgens behandeld als een 1dimensionale matrix.
  • Een waarde van het null-type wordt geconverteerd naar de lege tekenreeks.
  • Een scriptblocktypewaarde wordt geconverteerd naar een tekenreeks die de tekst van dat blok bevat zonder het scheidingsteken { en } tekens.
  • Voor een opsommingstypewaarde is het resultaat een tekenreeks met de naam van elke opsommingsconstante die in die waarde is gecodeerd, gescheiden door komma's.
  • Voor andere referentietypewaarden, als het verwijzingstype een dergelijke conversie ondersteunt, wordt die conversie gebruikt; anders is de conversie onjuist.

De tekenreeks die wordt gebruikt om de waarde weer te geven van een element dat een matrix is, heeft de vorm System.Type[], System.Type[,]enzovoort. Voor andere referentietypen wordt de methode ToString aangeroepen. Voor andere enumerable typen wordt de bronwaarde behandeld als een 1-dimensionale matrix.

6.9 Conversie naar array

De regels voor het converteren van een waarde naar een matrixtype zijn als volgt:

  • Het doeltype mag geen multidimensionale array zijn.
  • Een waarde van het null-type wordt behouden zoals is.
  • Voor een andere scalaire waarde dan $null of een waarde van het type hashtabel wordt een nieuwe matrix met één element gemaakt waarvan de waarde de scalaire waarde is na conversie naar het type doelelement.
  • Voor een 1-dimensionale matrixwaarde wordt een nieuwe matrix van het doeltype gemaakt en wordt elk element gekopieerd met conversie van de bronmatrix naar het bijbehorende element in de doelmatrix.
  • Voor een multidimensionale matrixwaarde wordt die matrix eerst afgevlakt (§9,12) en vervolgens behandeld als een 1-dimensionale matrixwaarde.
  • Een tekenreekswaarde wordt geconverteerd naar een matrix van tekens met dezelfde lengte als opeenvolgende tekens uit de tekenreeks die overeenkomende posities in de matrix bezetten.

Voor andere enumerable typen wordt een nieuwe matrix met één element gemaakt waarvan de waarde het bijbehorende element is na de conversie naar het doelelementtype, als er een dergelijke conversie bestaat. Anders is de conversie fout.

6.10 Conversie naar XML

Het object wordt geconverteerd naar een tekenreeks en vervolgens naar een XML-documentobject van het type xml.

6.11 Conversie naar regex

Een uitdrukking die een waarde van het stringtype aanwijst, kan worden geconverteerd naar type regex.

6.12 Conversie naar scriptblock

De regels voor het converteren van een waarde naar het type scriptblock zijn als volgt:

  • Een tekenreekswaarde wordt behandeld als de naam van een opdracht, eventueel gevolgd door argumenten voor een aanroep naar die opdracht.

6.13 Conversie naar opsommingstypen

De regels voor het converteren van een waarde naar een opsommingstype zijn als volgt:

  • Een waarde van het type tekenreeks die een van de benoemde waarden bevat (met inachtneming van hoofdlettergebruik) voor een enumeratietype, wordt geconverteerd naar die benoemde waarde.
  • Een waarde van het type tekenreeks die een door komma's gescheiden lijst met benoemde waarden (met inachtneming van hoofdletters) voor een enumeratie bevat, wordt geconverteerd naar de bitwise-OR van al deze benoemde waarden.

6.14 Conversie naar andere referentietypen

De regels voor het converteren van een waarde naar een ander verwijzingstype dan een matrixtype of tekenreeks zijn als volgt:

  • Een waarde van het null-type wordt behouden zoals is.
  • Anders is het gedrag implementatie-afhankelijk gedefinieerd.

Een aantal onderdelen van machines komen hier aan het spelen; deze omvatten het mogelijke gebruik van constructors met één argument of standaardconstructors als de waarde een hashtabel, impliciete en expliciete conversieoperators en parseringsmethoden voor het doeltype is; het gebruik van Convert.ConvertTo; en het ETS-conversiemechanisme.

6.15 Gebruikelijke rekenkundige conversies

Als geen van beide operanden een waarde aanwijst met een numeriek type, dan

  • Als de linkeroperand een waarde van het type bool aanwijst, is de conversie onjuist.
  • Anders worden alle operanden die de waarde aanwijzen $null geconverteerd naar nul van het type int en wordt het proces voortgezet met de onderstaande numerieke conversies.
  • Als de linkeroperand een waarde van het type karakter aanwijst en de rechteroperand een waarde van het type bool aanwijst, dan is de conversie een fout.
  • Als de linkeroperand anders een waarde van het type tekenreeks aanwijst, maar geen getal vertegenwoordigt (§6,16), is de conversie fout.
  • Als de rechteroperand anders een waarde van het type tekenreeks aanwijst, maar geen getal vertegenwoordigt (§6,16), is de conversie fout.
  • Anders worden alle operanden die waarden van type string aanwijzen omgezet naar getallen (§6.16) en gaat het proces verder met de onderstaande numerieke conversies.
  • Anders is de conversie fout.

Numerieke conversies:

  • Als één operand een waarde van het type decimaal aanwijst, wordt de waarde die door de andere operand is aangewezen, indien nodig geconverteerd naar dat type. Het resultaat heeft het type decimaal.
  • Als een operand anders een waarde van het type double aanwijst, wordt de waarde die door de andere operand is aangewezen, indien nodig geconverteerd naar dat type. Het resultaat heeft het type "double" (dubbel).
  • Als één operand anders een waarde van het type float aanwijst, worden de waarden die door beide operanden zijn aangewezen, geconverteerd naar het type double, indien nodig. Het resultaat heeft het type "double" (dubbel).
  • Als een operand anders een waarde van het type lang aanwijst, wordt de waarde die door de andere operandwaarde is aangewezen, indien nodig geconverteerd naar dat type. Het resultaat heeft het type dat als eerste in de reeks zowel long als double zijn waarde kan vertegenwoordigen.
  • Anders worden de waarden die door beide operanden zijn aangewezen, geconverteerd naar type int, indien nodig. Het resultaat heeft het eerste datatype in de reeks int, long, double dat zijn waarde kan vertegenwoordigen zonder afkapping.

6.16 Conversie van tekenreeks naar numeriek type

Afhankelijk van de inhoud kan een tekenreeks expliciet of impliciet worden geconverteerd naar een numerieke waarde. In het bijzonder

  • Een lege tekenreeks wordt geconverteerd naar de waarde nul.
  • Voorloop- en volgspaties worden genegeerd; een tekenreeks mag echter niet alleen uit spaties bestaan.
  • Een tekenreeks met alleen witruimte en/of regeleindtekens wordt geconverteerd naar de waarde nul.
  • Eén voorafgaand + of - teken is toegestaan.
  • Een geheel getal kan een hexadecimaal voorvoegsel (0x of 0X) hebben.
  • Een optioneel ondertekende exponent is toegestaan.
  • Typeachtervoegsels en vermenigvuldigers zijn niet toegestaan.
  • De hoofdletters "-Infinity", "Infinity" en "NaN" worden herkend als respectievelijk de waarden -∞, +∞ en NaN.

6.17 Conversie tijdens parameterbinding

Zie §8.14voor informatie over parameterbinding.

Wanneer de waarde van een expressie wordt gebonden aan een parameter, zijn er extra conversieoverwegingen, zoals hieronder wordt beschreven:

  • Als het parametertype overschakelt (§4.2.5, §8.10.5) en de parameter geen argument heeft, wordt de waarde van de parameter in de aangeroepen opdracht ingesteld op $true. Als het parametertype anders is dan een schakelaar, is een parameter zonder argument een fout.
  • Als het parametertype 'switch' is en de argumentwaarde $nullis, wordt de parameterwaarde ingesteld op $false.
  • Als het parametertype object is of hetzelfde is als het type van het argument, wordt de waarde van het argument zonder conversie doorgegeven.
  • Als het parametertype geen object of scriptblock is, wordt een argument met het type scriptblock geëvalueerd en wordt het resultaat doorgegeven als de waarde van het argument. (Dit staat bekend als vertraagde scriptblokbinding.) Als het parametertype object of scriptblock is, wordt een argument met het type scriptblock doorgegeven zoals is.
  • Als het parametertype een verzameling van het type T2 is en het argument een scalaire waarde van het type T1 is, wordt die scalaire waarde geconverteerd naar een verzameling van het type T2 die één element bevat. Indien nodig wordt de scalaire waarde geconverteerd naar type T2 met behulp van de conversieregels van deze sectie.
  • Als het parametertype een ander scalair type is dan object en het argument een verzameling is, is het argument fout.
  • Als het verwachte parametertype een verzameling van het type T2 is en het argument een verzameling van het type T1 is, wordt het argument geconverteerd naar een verzameling van het type T2 met dezelfde lengte als de argumentverzameling. Indien nodig worden de waarden van het argumentverzamelingselement geconverteerd naar type T2 met behulp van de conversieregels van deze sectie.
  • Als de bovenstaande stappen en de eerder in dit hoofdstuk opgegeven conversies niet volstaan, worden de regels in §6.18 toegepast. Als deze mislukken, mislukt de parameterbinding.

6.18 .NET-conversie

Voor een impliciete conversie worden de ingebouwde conversies van PowerShell eerst geprobeerd. Als ze de conversie niet kunnen omzetten, worden de onderstaande aangepaste .NET-conversieprogramma's geprobeerd, in volgorde van boven naar beneden. Als er een conversie wordt gevonden, maar er een uitzondering optreedt, is de conversie mislukt.

  • PSTypeConverter: er zijn twee manieren om de implementatie van de PSType Converter klasse te koppelen aan de doelklasse: via het typeconfiguratiebestand (types.ps1xml) of door het kenmerk System.ComponentModel.TypeConverterAttribute toe te passen op de doelklasse. Raadpleeg de PowerShell SDK-documentatie voor meer informatie.

  • TypeConverter: dit CLR-type biedt een uniforme manier om typen waarden te converteren naar andere typen, en voor toegang tot standaardwaarden en subeigenschappen. Het meest voorkomende type converter is er een die converteert naar en van een tekstweergave. Het typeconversieprogramma voor een klasse is gebonden aan de klasse met een System.ComponentModel.TypeConverterAttribute. Tenzij dit kenmerk wordt overschreven, gebruiken alle klassen die overnemen van deze klasse hetzelfde typeconversieprogramma als de basisklasse. Raadpleeg de PowerShell SDK en de Microsoft .NET Framework-documentatie voor meer informatie.

  • parseringsmethode: als het brontype tekenreeks is en het doeltype een methode heeft met de naam Parse, wordt die methode aangeroepen om de conversie uit te voeren.

  • Constructors: Als het doeltype een constructor heeft met één argument waarvan het type dat van het brontype is, wordt die constructor aangeroepen om de conversie uit te voeren.

  • impliciete cast-operator: als het brontype een impliciete cast-operator heeft die naar het doeltype wordt geconverteerd, wordt die operator aangeroepen om de conversie uit te voeren.

  • expliciete cast-operator: als het brontype een expliciete cast-operator heeft die naar het doeltype converteert, wordt die operator aangeroepen om de conversie uit te voeren. Als het doeltype een expliciete cast-operator heeft die converteert van het brontype, wordt die operator aangeroepen om de conversie uit te voeren.

  • IConvertable: System.Convert.ChangeType wordt aangeroepen om de conversie uit te voeren.

6.19 Conversie naar besteld

De regels voor het converteren van een waarde naar het geordende pseudotype zijn als volgt:

  • Als de waarde een letterlijke hash is (§2.3.5.6), is het resultaat een object met een gedefinieerd implementatietype dat zich gedraagt als een hashtabel en de volgorde van de sleutels overeenkomt met de volgorde die is opgegeven in de letterlijke hash.
  • Anders is het gedrag implementatie-afhankelijk gedefinieerd.

Alleen hash-literalen (§2.3.5.6) kan worden geconverteerd naar volgorde. Het resultaat is een exemplaar van System.Collections.Specialized.OrderedDictionary.

6.20 Conversie naar pscustomobject

De regels voor het converteren van een waarde naar het pseudo-type pscustomobject zijn als volgt:

  • Een waarde van het type hashtable wordt geconverteerd naar een PowerShell-object. Elke sleutel in de hashtabel wordt een NoteProperty met de bijbehorende waarde.
  • Anders is het gedrag implementatie-afhankelijk gedefinieerd.

De conversie is altijd toegestaan, maar wijzigt niet het type van de waarde.