Delen via


5. Variabelen

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 variabele vertegenwoordigt een opslaglocatie voor een waarde en die waarde heeft een type. Traditionele procedurele programmeertalen worden statisch getypt; Dat wil gezegd, het runtimetype van een variabele is waarmee deze tijdens het compileren is gedeclareerd. Objectgeoriënteerde talen voegen het idee van overname toe, waardoor het runtimetype van een variabele kan zijn waarmee deze tijdens het compileren is gedeclareerd of een type dat is afgeleid van dat type. Omdat PowerShell een dynamisch getypte taal is, hebben de variabelen geen vaste typen. In feite worden variabelen niet gedefinieerd; ze komen gewoon tot stand wanneer ze voor het eerst een waarde krijgen toegewezen. En hoewel een variabele kan worden beperkt (§5.3) om een waarde van een bepaald type vast te houden, kan het type informatie in een toewijzing niet altijd statisch worden geverifieerd.

Op verschillende momenten kan een variabele worden gekoppeld aan waarden van verschillende typen via toewijzing (§7.11) of het gebruik van de operatoren ++ en ‑‑ (§7.1.5, §7.2.6). Wanneer de waarde die is gekoppeld aan een variabele wordt gewijzigd, kan het type van die waarde worden gewijzigd. Bijvoorbeeld

$i = "abc"        # $i holds a value of type string
$i = 2147483647   # $i holds a value of type int
++$i              # $i now holds a value of type double because
                  # 2147483648 is too big to fit in type int

Elk gebruik van een variabele die niet is gemaakt, resulteert in de waarde $null. Als u wilt zien of er een variabele is gedefinieerd, gebruikt u de cmdlet Test-Path.

5.1 Schrijfbare locatie

Een schrijfbare locatie is een expressie die een resource aanwijst waaraan een opdracht zowel lees- als schrijftoegang heeft. Een schrijfbare locatie kan een variabele zijn (§5), een matrixelement (§9), een gekoppelde waarde in een Hashtabel die toegankelijk is via een subscript (§10), een eigenschap (§7.1.2) of opslag die wordt beheerd door een provider (§3.1).

5.2 Variabele categorieën

PowerShell definieert de volgende categorieën variabelen: statische variabelen, instantievariabelen, matrixelementen, hashtabelsleutel-waardeparen, parameters, gewone variabelen en variabelen op providerstations. In de volgende subsecties wordt elk van deze categorieën beschreven.

In het volgende voorbeeld

function F ($p1, $p2) {
    $radius = 2.45
    $circumference = 2 * ([Math]::PI) * $radius

    $date = Get-Date -Date "2010-2-1 10:12:14 pm"
    $month = $date.Month

    $values = 10, 55, 93, 102
    $value = $values[2]

    $h1 = @{ FirstName = "James"; LastName = "Anderson" }
    $h1.FirstName = "Smith"

    $Alias:A = "Help"
    $Env:MyPath = "E:\Temp"
    ${E:output.txt} = 123
    $Function:F = { "Hello there" }
    $Variable:v = 10
}
  • [Math::PI] is een statische variabele
  • $date.Month is een exemplaarvariabele
  • $values[2] is een array-element
  • $h1.FirstName is een Hashtable sleutel waarvan de bijbehorende waarde is $h 1['FirstName']'
  • $p1 en $p2 zijn parameters
  • $radius, $circumference, $date, $month, $values, $valueen $h1 zijn gewone variabelen
  • $Alias:A, $Env:MyPath, ${E:output.txt}en $Function:F zijn variabelen op de bijbehorende providerschijven.
  • $Variable:v is eigenlijk een gewone variabele die is geschreven met zijn volledig gekwalificeerde provider drive.

5.2.1 Statische variabelen

Een gegevenslid van een object dat behoort tot het type van het object in plaats van dat specifieke exemplaar van het type, wordt een statische variabelegenoemd. Zie §4.2.3, §4.2.4.1en §4.3.8 voor enkele voorbeelden.

PowerShell biedt geen manier om nieuwe typen te maken die statische variabelen bevatten; objecten van dergelijke typen kunnen echter worden verstrekt door de hostomgeving.

Geheugen voor het maken en verwijderen van objecten met statische variabelen wordt beheerd door de hostomgeving en het garbagecollectionsysteem.

Zie §7.1.2 voor informatie over het openen van een statische variabele.

Een statisch gegevenslid kan een veld of eigenschap zijn.

5.2.2 Instantievariabelen

Een gegevenslid van een object dat deel uitmaakt van een bepaald exemplaar van het objecttype in plaats van het type zelf, wordt een exemplaarvariabelegenoemd. Zie §4.3.1, §4.3.2en §4.3.3 voor enkele voorbeelden.

Een PowerShell-hostomgeving kan een manier bieden om nieuwe typen te maken die exemplaarvariabelen bevatten of om nieuwe exemplaarvariabelen toe te voegen aan bestaande typen.

Geheugen voor het maken en verwijderen van objecten met statische variabelen wordt beheerd door de hostomgeving en het garbagecollectionsysteem.

Zie §7.1.2 voor informatie over het openen van een exemplaarvariabele.

Een exemplaargegevenslid kan een veld of een eigenschap zijn.

5.2.3 Matrixelementen

Een matrix kan worden gemaakt via een unaire kommaoperator (§7.2.1), subexpressie (§7.1.6), matrixexpressie (§7.1.7), binaire kommaoperator (§7.3), bereikoperator (§7.4) of cmdlet New-Object.

Geheugen voor het maken en verwijderen van arrays wordt beheerd door de hostomgeving en het garbagecollectionsysteem.

Matrices en matrixelementen worden besproken in §9.

5.2.4 Hashtable-sleutel-/waardeparen

Een hashtabel wordt gemaakt via een letterlijke hash (§2.3.5.6) of de cmdlet New-Object. Een nieuw sleutel-waardepaar kan worden toegevoegd via de operator [] (§7.1.4.3).

Geheugen voor het maken en verwijderen van Hashtables wordt beheerd door de hostomgeving en het garbagecollectionsysteem.

Hashtabellen worden besproken in §10.

5.2.5 Parameters

Er wordt een parameter gemaakt wanneer de bovenliggende opdracht wordt aangeroepen en deze wordt geïnitialiseerd met de waarde van het argument dat is opgegeven in de aanroep of door de hostomgeving. Er bestaat geen parameter meer wanneer de bovenliggende opdracht wordt beëindigd.

Parameters worden besproken in §8.10.

5.2.6 Gewone variabelen

Een gewone variabele wordt gedefinieerd door een toewijzingsexpressie (§7.11) of een foreach-statement (§8.4.4). Sommige gewone variabelen zijn vooraf gedefinieerd door de hostomgeving, terwijl andere tijdelijk zijn en naar behoefte komen en gaan tijdens de uitvoering.

De levensduur van een gewone variabele is dat onderdeel van de uitvoering van programma's waarvoor opslag gegarandeerd wordt gereserveerd. Deze levensduur begint bij het invoeren van het bereik waaraan het is gekoppeld en eindigt niet eerder dan het einde van de uitvoering van dat bereik. Als het bovenliggende bereik recursief of iteratief wordt ingevoerd, wordt elke keer een nieuw exemplaar van de lokale variabele gemaakt.

De opslag waarnaar wordt verwezen door een gewone variabele wordt onafhankelijk van de levensduur van die variabele vrijgemaakt.

Een gewone variabele kan expliciet worden benoemd met een Variabele: naamruimtevoorvoegsel (§5.2.7).

5.2.7 Variabelen op providerstations

Het concept van providers en stations wordt geïntroduceerd in §3.1, waarbij elke provider zijn eigen naamruimtestation(s) kan leveren. Hierdoor kunnen middelen op deze schijven worden geopend alsof het gewone variabelen zijn (§5.2.6). In feite wordt een gewone variabele opgeslagen op de schijf van de bestandssysteemprovider: (§3.1.5) en kan worden geopend met zijn gewone naam of zijn volledig gekwalificeerde naamruimtenaam.

Sommige typen naamruimtevariabelen worden impliciet beperkt (§5.3).

5.3 Beperkte variabelen

Standaard kan een variabele een waarde van elk type aanwijzen. Een variabele kan echter worden beperkt tot het aanwijzen van waarden van een bepaald type door dat type op te geven als een typeliter vóór de naam in een toewijzing of parameter. Bijvoorbeeld

[int]$i = 10   # constrains $i to designating ints only
$i = "Hello"   # error, no conversion to int
$i = "0x10"    # ok, conversion to int
$i = $true     # ok, conversion to int

function F ([int]$p1, [switch]$p2, [regex]$p3) { ... }

Elke variabele die hoort bij de naamruimte Env:, Alias:of aan de naamruimte van het bestandssysteem (§2.3.2, §3.1) is impliciet beperkt tot het type string. Elke variabele die hoort bij de naamruimte Functie: (§2.3.2, §3.1) is impliciet beperkt tot het type scriptblock.