5. Variabler

En variabel representerar en lagringsplats för ett värde och det värdet har en typ. Traditionella programmeringsspråk är statiskt typade. Det innebär att körningstypen för en variabel är den som den deklarerades med vid kompileringen. Objektorienterade språk lägger till idén om arv, vilket gör att körningstypen för en variabel kan vara den som den deklarerades med vid kompileringen eller någon typ som härletts från den typen. Eftersom PowerShells variabler är ett dynamiskt typindelad språk har de inga typer i sig. I själva verket definieras inte variabler. de blir bara till när de först tilldelas ett värde. Och även om en variabel kan vara begränsad (·5.3) till att innehålla ett värde av en viss typ, kan typinformation i en tilldelning inte alltid verifieras statiskt.

Vid olika tidpunkter kan en variabel associeras med värden av olika typer antingen via tilldelning (·7.11) ++ ‑‑ eller användningen av operatorerna och (·7.1.5, -7.2.6). När värdet som är associerat med en variabel ändras kan värdets typ ändras. Exempel:

$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

All användning av en variabel som inte har skapats resulterar i värdet $null. Om du vill se om en variabel har definierats använder du cmdleten Test-Path .

5.1 Skrivbar plats

En skrivbar plats är ett uttryck som anger en resurs som ett kommando har både läs- och skrivåtkomst till. En skrivbar plats kan vara en variabel (#5), ett matriselement (#9), ett associerat värde i en hash-tabell som nås via ett uppsänkt skript (quot%10), en egenskap (!)7.1.2) eller lagring som hanteras av en provider (!)3.1).

5.2 Variabelkategorier

PowerShell definierar följande kategorier av variabler: statiska variabler, instansvariabler, matriselement, nyckel/värde-par för hash-tabell, parametrar, vanliga variabler och variabler på providerenheter. De underavsnitt som följer beskriver var och en av dessa kategorier.

I följande exempel

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] är en statisk variabel
  • $date.Month är en instansvariabel
  • $values[2] är ett matriselement
  • $h1.FirstName är en Hashtable nyckel vars motsvarande värde är $h 1['FirstName']'
  • $p1 och $p2 är parametrar
  • $radius, $circumference, $date, $month``$values, $value, och $h1 är vanliga variabler
  • $Alias:A, $Env:MyPath, ${E:output.txt}och är $function:F variabler på motsvarande providerenheter.
  • $Variable:v är i själva verket en vanlig variabel som skrivits med dess fullständigt kvalificerade providerenhet.

5.2.1 Statiska variabler

En datamedlem i ett objekt som tillhör objektets typ i stället för den specifika instansen av typen kallas för en statisk variabel. Några exempel finns i 4.2.3, 4.2.4.1 och 4.3.8 .

Med PowerShell kan du inte skapa nya typer som innehåller statiska variabler. Objekt av sådana typer kan dock tillhandahållas av värdmiljön.

Minne för att skapa och ta bort objekt som innehåller statiska variabler hanteras av värdmiljön och skräpinsamlingssystemet.

Se 7.1.2 för information om åtkomst till en statisk variabel.

En statisk datamedlem kan vara ett fält eller en egenskap.

5.2.2 Instansvariabler

En datamedlem i ett objekt som tillhör en viss instans av objektets typ i stället för själva typen kallas för en instansvariabel. Se 4.3.1, 4.3.2 och 4.3.3 för några exempel.

En PowerShell-värdmiljö kan vara ett sätt att skapa nya typer som innehåller instansvariabler eller lägga till nya instansvariabler till befintliga typer.

Minne för att skapa och ta bort objekt som innehåller statiska variabler hanteras av värdmiljön och skräpinsamlingssystemet.

Mer information om hur du kommer åt en instansvariabel finns i .7.1.2 .

En instansdatamedlem kan vara ett fält eller en egenskap.

5.2.3 Matriselement

En matris kan skapas via enära kommateckenoperator (7.2.1), ett underuttryck (7.1.6), ett matrisuttryck (7.1.7), en binär kommaoperator (7.3), intervalloperatorn (7.4) eller cmdleten New-Object .

Minne för att skapa och ta bort matriser hanteras av värdmiljön och skräpinsamlingssystemet.

Matriser och matriselement beskrivs i -9.

5.2.4 Hashtable-nyckel/värde-par

En hash-tabell skapas via en hash-literal (·2.3.5.6) eller cmdleten New-Object . Ett nytt nyckel/värde-par kan läggas till via [] operatorn (–7.1.4.3).

Minne för att skapa och ta bort hash-tabeller hanteras av värdmiljön och skräpinsamlingssystemet.

Hash-tabeller beskrivs i -10.

5.2.5 Parametrar

En parameter skapas när dess överordnade kommando anropas och initieras med värdet för argumentet som anges i anropet eller av värdmiljön. En parameter upphör att existera när dess överordnade kommando avslutas.

Parametrar beskrivs i -8.10.

5.2.6 Vanliga variabler

En vanlig variabel definieras av ett tilldelningsuttryck (·7.11) eller en foreach-instruktion (·8.4.4). Vissa vanliga variabler är fördefinierade av värdmiljön medan andra är tillfälliga och kommer och går enligt behov vid körning.

Livslängden för en vanlig variabel är den del av programkörningen där lagring garanterat är reserverad för den. Den här livslängden börjar vid inmatning i det omfång som den är associerad med och slutar tidigast i slutet av körningen av det omfånget. Om det överordnade omfånget anges rekursivt eller iterativt skapas en ny instans av den lokala variabeln varje gång.

Den lagring som en vanlig variabel refererar till återtas oberoende av livslängden för variabeln.

En vanlig variabel kan namnges explicit med prefixet Variable: namespace (#5.2.7).

5.2.7 Variabler på providerenheter

Begreppet providers och enheter introduceras i 3.1, där varje leverantör kan ange sina egna namnområdesenheter. På så sätt kan resurser på dessa enheter nås som om de vore vanliga variabler (5.2.6). I själva verket lagras en vanlig variabel på filsystemproviderenheten Variabel: (·3.1.5) och kan nås med dess vanliga namn eller dess fullständigt kvalificerade namnområdesnamn.

Vissa typer av namnområdesvariabler är implicit begränsade (–5.3).

5.3 Begränsade variabler

Som standard kan en variabel ange ett värde av vilken typ som helst. En variabel kan dock begränsas till att ange värden för en viss typ genom att ange den typen som en typlitteral före dess namn i en tilldelning eller parameter. Exempel:

[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) { ... }

Any variable belonging to the namespace Env:, Alias:, or to the file system namespace (§2.3.2, §3.1) is constrained implicitly to the type string. Alla variabler som hör till namnområdesfunktionen: (·2.3.2, -3.1) är implicit begränsade till typen scriptblock.