Delen via


3. Basisconcepten

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.

3.1 Aanbieders en stations

Een provider biedt toegang tot gegevens en onderdelen die anders niet eenvoudig toegankelijk zouden zijn op de opdrachtregel. De gegevens worden weergegeven in een consistente indeling die lijkt op een bestandssysteemstation.

De gegevens die een provider beschikbaar stelt, verschijnen op een station , en de gegevens zijn toegankelijk via een pad , net als bij een schijfstation. Ingebouwde cmdlets voor elke provider beheren de gegevens op het providerstation.

PowerShell bevat de volgende set ingebouwde providers voor toegang tot de verschillende typen gegevensarchieven:

Provider schijfnaam beschrijving Referentie
Schuilnaam Alias: PowerShell-aliassen §3.1.1
Milieu Omgeving: Omgevingsvariabelen §3.1.2
Bestandssysteem A:, B:, C:, ... Schijven, mappen en bestanden §3.1.3
Functie Functie: PowerShell-functies §3.1.4
Veranderlijk Veranderlijk: PowerShell-variabelen §3.1.5

Windows PowerShell:

Provider schijfnaam beschrijving
Certificaat Certificaat: x509-certificaten voor digitale handtekeningen
Registerbestand HKLM: (HKEY_LOCAL_MACHINE), HKCU: (HKEY_CURRENT_USER) Windows-register
WSMan WSMan: configuratiegegevens WS-Management

De volgende cmdlets hebben betrekking op providers en drives:

Het type object dat een provider vertegenwoordigt, wordt beschreven in §4.5.1. Het objecttype dat een station vertegenwoordigt, wordt beschreven in §4.5.2.

3.1.1 Aliassen

Een alias is een alternatieve naam voor een opdracht. Een opdracht kan meerdere aliassen hebben en de oorspronkelijke naam en alle aliassen kunnen door elkaar worden gebruikt. Een alias kan opnieuw worden toegewezen. Een alias is een item (§3.3).

Een alias kan worden toegewezen aan een andere alias; de nieuwe alias is echter geen alias van de oorspronkelijke opdracht.

De provideralias is een platte naamruimte die alleen objecten bevat die de aliassen vertegenwoordigen. De variabelen hebben geen onderliggende items.

PowerShell wordt geleverd met een set ingebouwde aliassen.

De volgende cmdlets hebben betrekking op aliassen:

  • New-Alias: Maakt een alias aan
  • Set-Alias: Een of meer aliassen maken of wijzigen
  • Get-Alias-: haalt informatie op over een of meer aliassen
  • Export-Alias: hiermee exporteert u een of meer aliassen naar een bestand

Wanneer een alias wordt gemaakt voor een opdracht met behulp van New-Alias, kunnen parameters voor die opdracht niet worden opgenomen in die alias. Directe toewijzing aan een variabele in de Alias: naamruimte staat echter toe dat parameters worden opgenomen.

Notitie

Het is echter een eenvoudige zaak om een functie te maken die niets meer doet dan de aanroep van die opdracht met alle gewenste parameters bevatten en om een alias toe te wijzen aan die functie.

Het type object dat een alias vertegenwoordigt, wordt beschreven in §4.5.4.

Aliasobjecten worden opgeslagen op de schijfalias: (§3.1).

3.1.2 Omgevingsvariabelen

Met de PowerShell Environment-provider kunnen omgevingsvariabelen van het besturingssysteem worden opgehaald, toegevoegd, gewijzigd, gewist en verwijderd.

De provideromgeving is een platte naamruimte die alleen objecten bevat die de omgevingsvariabelen vertegenwoordigen. De variabelen hebben geen onderliggende items.

De naam van een omgevingsvariabele kan het gelijkteken (=) niet bevatten.

Wijzigingen in de omgevingsvariabelen zijn alleen van invloed op de huidige sessie.

Een omgevingsvariabele is een item (§3.3).

Het type object dat een omgevingsvariabele vertegenwoordigt, wordt beschreven in §4.5.6.

Omgevingsvariabeleobjecten worden opgeslagen op de schijf Env: (§3.1).

3.1.3 Bestandssysteem

Met de PowerShell FileSystem-provider kunnen mappen en bestanden worden gemaakt, geopend, gewijzigd en verwijderd.

De Bestandssysteemprovider is een hiërarchische naamruimte die objecten bevat die het onderliggende bestandssysteem vertegenwoordigen.

Bestanden worden opgeslagen op stations met namen zoals A:, B:, C:, enzovoort (§3.1). Mappen en bestanden worden geopend met behulp van pad-notatie (§3.4).

Een map of bestand is een item (§3.3).

3.1.4 Functies

Met de PowerShell-functieprovider kunnen functies (§8.10) en filters (§8.10.1) worden opgehaald, toegevoegd, gewijzigd, gewist en verwijderd.

De providerfunctie is een platte naamruimte die alleen de functie en filterobjecten bevat. Functies en filters hebben geen onderliggende items.

Wijzigingen in de functies zijn alleen van invloed op de huidige sessie.

Een functie is een item (§3.3).

Het type object dat een functie vertegenwoordigt, wordt beschreven in §4.5.10. Het type object dat een filter vertegenwoordigt, wordt beschreven in §4.5.11.

Functieobjecten worden opgeslagen op drive Function (§3.1).

3.1.5 Variabelen

Variabelen kunnen rechtstreeks in de PowerShell-taal worden gedefinieerd en bewerkt.

De providervariabele is een platte naamruimte die alleen objecten bevat die de variabelen vertegenwoordigen. De variabelen hebben geen onderliggende items.

De volgende cmdlets hebben ook betrekking op variabelen:

Aangezien een variabele een item is (§3.3), kan het worden bewerkt door de meeste itemgerelateerde cmdlets.

Het type object dat een variabele vertegenwoordigt, wordt beschreven in §4.5.3.

Variabele objecten worden opgeslagen op station Variabele: (§3.1).

3.2 Werklocaties

De huidige werklocatie is de standaardlocatie waarnaar opdrachten verwijzen. Dit is de locatie die wordt gebruikt als een expliciet pad (§3.4) niet wordt opgegeven wanneer een opdracht wordt aangeroepen. Deze locatie omvat de huidige schijf.

Een PowerShell-host heeft mogelijk meerdere stations, en in dat geval heeft elk station zijn eigen huidige locatie.

Wanneer een schijfnaam wordt opgegeven zonder een directory, wordt de huidige locatie van die schijf bedoeld.

De huidige werklocatie kan op een stapel worden opgeslagen en vervolgens worden ingesteld op een nieuwe locatie. Later kan die opgeslagen locatie vanuit die stapel worden hersteld en als huidige werklocatie worden ingesteld. Er zijn twee soorten locatiestapels: de standaardwerklocatiestapel en nul of meer gebruikersgedefinieerde benoemde werklocatiestapels. Wanneer een sessie begint, is de standaardwerklocatiestack ook de huidige werklocatiestack. Elke benoemde werklocatiestack kan echter de huidige werklocatiestack worden.

De volgende cmdlets hebben betrekking op locaties:

  • Set-Location: stelt de huidige locatie in
  • Get-Location: bepaalt de huidige werklocatie voor de opgegeven stations of de werklocaties voor de opgegeven stack(s)
  • Push-Location: slaat de huidige werklocatie bovenaan de opgegeven stapel van locaties op
  • Pop-Locatie: Herstelt de huidige werklocatie vanaf de bovenkant van een opgegeven stapel locaties

De objecttypen die een werklocatie en een stapel werklocaties vertegenwoordigen, worden beschreven in §4.5.5.

3.3 Artikelen

Een item is een alias (§3.1.1), een variabele (§3.1.5), een functie (§3.1.4), een omgevingsvariabele (§3.1.2), of een bestand of map in een bestandssysteem (§3.1.3).

De volgende cmdlets hebben betrekking op items:

  • Nieuw-Item: Maak een nieuw item
  • Set-Item: Wijzigt de waarde van een of meer items
  • Get-Item: Haalt de items op de opgegeven locatie op
  • Get-ChildItem: Hiermee haalt u de items en onderliggende items op de opgegeven locatie op.
  • Copy-Item: Kopieert een of meer items van de ene locatie naar de andere.
  • Verplaats-Item: Verplaatst een of meer items van de ene locatie naar een andere.
  • Hernoem-Item: de naam van een item hernoemen
  • Invoke-Item: voert de standaardactie uit op een of meer items
  • Clear-Item: Hiermee verwijdert u de inhoud van een of meer items, maar verwijdert u de items zelf niet (zie
  • Verwijderen-Item: Verwijdert de opgegeven items

De volgende cmdlets hebben betrekking op de inhoud van items:

Het type object dat een map vertegenwoordigt, wordt beschreven in §4.5.17. Het type object dat een bestand vertegenwoordigt, wordt beschreven in §4.5.18.

3.4 Padnamen

Alle items in een gegevensarchief die toegankelijk zijn via een PowerShell-provider, kunnen uniek worden geïdentificeerd door hun padnamen. Een padnaam is een combinatie van de naam van het item, de container en subcontainers waarin het item zich bevindt, en het PowerShell-station waarmee de containers worden geopend.

Padnamen zijn onderverdeeld in een van twee typen: volledig gekwalificeerde en relatieve. Een volledig gekwalificeerde padnaam bestaat uit alle elementen waaruit een pad bestaat. De volgende syntaxis toont de elementen in een volledig gekwalificeerde padnaam:

Tip

De ~opt~ notatie in de syntaxisdefinities geeft aan dat de lexicale entiteit optioneel is in de syntaxis.

path:
    provider~opt~   drive~opt~   containers~opt~   item

provider:
    module~opt~   provider   ::

module:
    module-name   \

drive:
    drive-name   :

containers:
    container   \
    containers container   \

modulenaam verwijst naar de bovenliggende module.

provider verwijst naar de PowerShell-provider waarmee toegang wordt verkregen tot de data-opslag.

drive verwijst naar de PowerShell-drive die wordt ondersteund door een bepaalde PowerShell-provider.

Een container andere containers kan bevatten, die andere containers kunnen bevatten, enzovoort, waarbij de uiteindelijke container een itembevat. Containers moeten worden opgegeven in de hiërarchische volgorde waarin ze aanwezig zijn in het gegevensarchief.

Hier volgt een voorbeeld van een padnaam:

E:\Accounting\InvoiceSystem\Production\MasterAccount\MasterFile.dat

Als het laatste element in een pad andere elementen bevat, is het een containerelement; anders is het een bladelement.

In sommige gevallen is er geen volledig gekwalificeerde padnaam nodig; een relatieve padnaam volstaat. Een relatieve padnaam is gebaseerd op de huidige werklocatie. Met PowerShell kan een item worden geïdentificeerd op basis van de locatie ten opzichte van de huidige werklocatie. Een relatieve padnaam omvat het gebruik van enkele speciale tekens. In de volgende tabel worden al deze tekens beschreven en worden voorbeelden gegeven van relatieve padnamen en volledig gekwalificeerde padnamen. De voorbeelden in de tabel zijn gebaseerd op de huidige werkmap die wordt ingesteld op C:\Windows:

symbool beschrijving relatief pad volledig gekwalificeerd pad
. Huidige werklocatie .\System C:\Windows\System
.. Bovenliggende map van de huidige werklocatie ..\Program Files C:\Program Files
\ Root van het huidige werkstation \Program Files C:\Program Files
geen Geen speciale tekens System C:\Windows\System

Als u een padnaam in een opdracht wilt gebruiken, voert u die naam in als een volledig gekwalificeerde of relatieve padnaam.

De volgende cmdlets hebben betrekking op paden:

  • Convert-Path: converteert een PowerShell-pad naar een PowerShell-providerpad
  • Join-Path: combineert een pad en een subpad in één pad
  • Resolve-Path: lost de jokertekens in een pad op
  • Split-Path: retourneert het opgegeven deel van een pad
  • testpad: bepaalt of de elementen van een pad bestaan of dat een pad goed is gevormd

Sommige cmdlets (zoals add-content en Copy-Item bestandsfilters gebruiken. Een bestandsfilter is een mechanisme voor het opgeven van de criteria voor het selecteren uit een set paden.

Het objecttype dat een opgelost pad vertegenwoordigt, wordt beschreven in §4.5.5. Paden worden vaak gemanipuleerd als tekenreeksen.

3.5 Bereiken

3.5.1 Inleiding

Een naam kan duiden op een variabele, een functie, een alias, een omgevingsvariabele of een station. Dezelfde naam kan verschillende items op verschillende plaatsen in een script aanduken. Voor elk verschillend item dat een naam aanduidt, is die naam alleen zichtbaar binnen het scripttekstbereik genaamd scope. Verschillende items die met dezelfde naam worden aangeduid, hebben verschillende bereiken of bevinden zich in verschillende naamgebieden.

Bereiken kunnen genest zijn; in dat geval wordt het buitenste bereik aangeduid als een bovenliggend bereik, en worden geneste bereiken onderliggende bereiken van dat bovenliggende bereik genoemd. Het bereik van een naam is het bereik waarin deze is gedefinieerd en alle onderliggende bereiken, tenzij het privé gemaakt wordt. Binnen een onderliggend bereik verbergt een daar gedefinieerde naam alle items die dezelfde naam hebben in bovenliggende bereiken.

Tenzij dot source-notatie (§3.5.5) wordt gebruikt, creëert elk van de volgende een nieuw scope:

  • Een scriptbestand
  • Een scriptblok
  • Een functie of filter

Bekijk het volgende voorbeeld:

# Start of script
$x = 2; $y = 3
Get-Power $x $y

# Function defined in script
function Get-Power([int]$x, [int]$y) {
    if ($y -gt 0) {
        return $x * (Get-Power $x (--$y))
    } else {
        return 1
    }
}
# End of script

Het bereik van de variabelen $x en $y die in het script zijn gemaakt, is de hoofdtekst van dat script, inclusief de functie die erin is gedefinieerd. Functie Get-Power definieert twee parameters met dezelfde namen. Omdat elke functie een eigen bereik heeft, zijn deze variabelen anders dan die zijn gedefinieerd in het bovenliggende bereik en verbergen ze die van het bovenliggende bereik. Het functiebereik is genest binnen het scriptbereik.

Houd er rekening mee dat de functie zichzelf recursief aanroept. Telkens wanneer dit gebeurt, wordt er nog een geneste scope gemaakt, ieder met zijn eigen variabelen $x en $y.

Hier is een complexer voorbeeld, waarin ook geneste reikwijdtes worden weergegeven en namen opnieuw worden gebruikt.

# start of script scope
$x = 2              # top-level script-scope $x created
                    # $x is 2
F1                  # create nested scope with call to function F1
                    # $x is 2
F3                  # create nested scope with call to function F3
                    # $x is 2

function F1 {       # start of function scope
                    # $x is 2
    $x = $true      # function-scope $x created
                    # $x is $true

    & {             # create nested scope with script block
                    # $x is $true
        $x = 12.345 # scriptblock-scope $x created
                    # $x is 12.345
    }               # end of scriptblock scope, local $x goes away

                    # $x is $true
    F2              # create nested scope with call to function F2
                    # $x is $true
}                   # end of function scope, local $x goes away

function F2 {       # start of function scope
                    # $x is $true
    $x = "red"      # function-scope $x created
                    # $x is "red"
}                   # end of function scope, local $x goes away

function F3 {       # start of function scope
                    # $x is 2
    if ($x -gt 0) {
                    # $x is 2
        $x = "green"
                    # $x is "green"
    }               # end of block, but not end of any scope
                    # $x is still "green"
}                   # end of function scope, local $x goes away
# end of script scope

3.5.2 Bereiknamen en -getallen

PowerShell ondersteunt de volgende bereiken:

  • Globaal: dit is het hoogste niveaubereik. Alle automatische variabelen en voorkeursvariabelen worden in dit bereik gedefinieerd. Het wereldwijd bereik is het hoofdbereik van alle andere bereiken, en alle andere bereiken zijn subbereiken van het wereldwijd bereik.

  • Lokaal: dit is het huidige bereik op elk uitvoeringspunt binnen een script, scriptblok of functie. Elke scope kan lokaal zijn.

  • Script: Dit bereik bestaat voor elk scriptbestand dat wordt uitgevoerd. Het scriptbereik is het bovenliggende bereik van alle bereiken die er vanuit zijn gemaakt. Een scriptblok heeft geen eigen scriptbereik; in plaats daarvan is het scriptbereik dat van het nauwstbijzijnde bovenliggende scriptbestand. Hoewel er geen modulebereik bestaat, biedt het scriptbereik het equivalent.

Namen kunnen privé worden gedeclareerd. In dat geval zijn ze niet zichtbaar buiten hun ouderbereik, zelfs niet voor onderliggende bereiken. Het concept "privé" is geen afzonderlijk bereik; het is een alias voor lokaal bereik, met de toevoeging dat de naam wordt verborgen als deze wordt gebruikt als schrijfbare locatie.

Bereiken kunnen worden verwezen door een getal, waarmee de relatieve positie van het ene bereik naar het andere wordt beschreven. Scope 0 geeft het lokale bereik aan, scope 1 geeft een bovenliggend bereik van de 1 generatie aan, scope 2 geeft een bovenliggend bereik van de tweede generatie aan, enzovoort. (Bereiknummers worden gebruikt door cmdlets die variabelen manipuleren.)

Bereik van variabelenaam

Zoals blijkt uit het volgende voorbeeld, kan een variabelenaam worden opgegeven met een van de zes verschillende scopes:

variable-scope:
    Global:
    Local:
    Private:
    Script:
    Using:
    Workflow:
    variable-namespace

Het bereik is optioneel. In de volgende tabel ziet u de betekenis van elk in alle mogelijke contexten. Ook wordt het bereik weergegeven wanneer er expliciet geen bereik is opgegeven:

bereik wijzigen in een scriptbestand binnen een scriptblok binnen een functie
Globaal Globaal bereik Globaal bereik Globaal bereik
Script Het bereik van het dichtstbijzijnde bovenliggende scriptbestand of globaal als er geen dichtstbijzijnde bovenliggende scriptbestand is. Het bereik van het dichtstbijzijnde bovenliggende scriptbestand of globaal als er geen dichtstbijzijnde bovenliggende scriptbestand is. Het bereik van het dichtstbijzijnde bovenliggende scriptbestand of globaal als er geen dichtstbijzijnde bovenliggende scriptbestand is.
Privé Globaal/script/lokaal bereik Lokaal bereik Lokaal bereik
Lokaal Globaal/script/lokaal bereik Lokaal bereik Lokaal bereik
Gebruiken Implementatie gedefinieerd Implementatie gedefinieerd Implementatie gedefinieerd
Workflow Implementatie gedefinieerd Implementatie gedefinieerd Implementatie gedefinieerd
Geen Globaal/script/lokaal bereik Lokaal bereik Lokaal bereik

Informatie over het bereik van variabelen kan ook worden opgegeven wanneer u de groep cmdlets gebruikt, vermeld in (§3.1.5). Raadpleeg met name de parameter Scopeen de parameters Option Private en Option AllScope voor meer informatie.

De Using: bereikaanpassing wordt gebruikt voor toegang tot variabelen die zijn gedefinieerd in een ander bereik tijdens het uitvoeren van scripts via cmdlets zoals Start-Job, Invoke-Commandof binnen een inlinescript-instructie. Bijvoorbeeld:

$a = 42
Invoke-Command --ComputerName RemoteServer { $Using:a } # returns 42
workflow foo
{
    $b = "Hello"
    inlinescript { $Using:b }
}
foo # returns "Hello"

De scope-werkstroom wordt gebruikt in combinatie met een parallel-instructie of sequentie-instructie voor toegang tot een variabele die is gedefinieerd in de werkstroom.

3.5.4 Functienaambereik

Een functienaam kan ook een van de vier verschillende scopes hebben en de zichtbaarheid van die naam is hetzelfde als voor variabelen (§3.5.3).

3.5.5 Puntbron notatie

Wanneer een scriptbestand, scriptblok of functie binnen een ander scriptbestand, scriptblok of functie wordt uitgevoerd, creëert het uitgevoerde scriptbestand een nieuw genest scope. Bijvoorbeeld

Script1.ps1
& "Script1.ps1"
& { ... }
FunctionA

Wanneer echter puntbronnotatie wordt gebruikt, wordt er geen nieuw bereik gemaakt voordat de opdracht wordt uitgevoerd, dus toevoegingen/wijzigingen die het zou hebben aangebracht in een eigen lokaal bereik worden aangebracht in het huidige bereik. Bijvoorbeeld

. Script2.ps1
. "Script2.ps1"
. { ... }
. FunctionA

3.5.6 Modules

Net zoals een scriptbestand op het bovenste niveau zich aan de basis van een hiërarchisch geneste bereikstructuur bevindt, geldt dat ook voor elke module (§3.14). Standaard zijn alleen de namen die door een module worden geëxporteerd, beschikbaar op naam vanuit de importcontext. Met de globale parameter van de cmdlet Import-Module kunnen geëxporteerde namen meer zichtbaarheid hebben.

3.6 Alleen-lezen en constante eigenschappen

Variabelen en aliassen worden beschreven door objecten die een aantal eigenschappen bevatten. Deze eigenschappen worden ingesteld en gemanipuleerd door twee families cmdlets (§3.1.5, §3.1.1). Een dergelijke eigenschap is Opties, die kunnen worden ingesteld op ReadOnly of Constant (met behulp van de parameter Option). Een variabele of alias die als ReadOnly is gemarkeerd, kan worden verwijderd en de eigenschappen ervan kunnen worden gewijzigd op voorwaarde dat de parameter Force is opgegeven. Een variabele of alias die als Constante is gemarkeerd, kan echter niet worden verwijderd, noch kunnen de eigenschappen ervan worden gewijzigd.

3.7 Overbelasting van methoden en oproepresolutie

3.7.1 Inleiding

Zoals vermeld in §1 wordt een externe procedure die beschikbaar wordt gesteld door de uitvoeringsomgeving (en geschreven in een andere taal dan PowerShell) een methodegenoemd.

De naam van een methode, samen met het aantal en de typen parameters, worden gezamenlijk de handtekening van die methodegenoemd. (Houd er rekening mee dat de handtekening geen retourtype van de methode bevat.) In de uitvoeringsomgeving kan een type meerdere methoden met dezelfde naam hebben als die elk een andere handtekening hebben. Wanneer er meerdere versies van een bepaalde methode zijn gedefinieerd, wordt deze methode overbelast. Het type Wiskunde (§4.3.8) bevat bijvoorbeeld een reeks methoden die Absworden genoemd, waarmee de absolute waarde van een opgegeven getal wordt berekend, waarbij het opgegeven getal een van een aantal typen kan hebben. De methoden in die set hebben de volgende handtekeningen:

Abs(decimal)
Abs(float)
Abs(double)
Abs(int)
Abs(long)
Abs(SByte)
Abs(Int16)

In dit geval hebben alle methoden hetzelfde aantal argumenten; hun handtekeningen verschillen alleen per argumenttype.

Een ander voorbeeld omvat het type Matrix (§4.3.2), dat een reeks methoden bevat met de naam Kopiëren waarmee een bereik van elementen van de ene matrix naar de andere wordt gekopieerd, beginnend bij het begin van elke matrix (standaard) of op een bepaald element. De methoden in die set hebben de volgende handtekeningen:

Copy(Array, Array, int)
Copy(Array, Array, long)
Copy(Array, int, Array, int, int)
Copy(Array, long, Array, long, long)

In dit geval verschillen de handtekeningen per argumenttype en in sommige gevallen ook op argumentnummer.

In de meeste aanroepen naar overbelaste methoden komt het aantal en het type van de argumenten exact overeen met een van de overbelastingen en is de geselecteerde methode duidelijk. Als dat echter niet het geval is, moet er een manier zijn om op te lossen welke overbelaste versie moet worden aangeroepen, indien van toepassing. Bijvoorbeeld

[Math]::Abs([byte]10) # no overload takes type byte
[array]::Copy($source, 3, $dest, 5L, 4) # both int and long indexes

Andere voorbeelden zijn het type tekenreeks (d.w.w.v. System.String), met tal van overbelaste methoden.

Hoewel PowerShell regels bevat voor het oplossen van methodeaanroepen die niet exact overeenkomen met een overbelaste handtekening, biedt PowerShell zelf geen manier om overbelaste methoden te definiëren.

Notitie

Opmerking van editor: PowerShell 5.0 heeft de mogelijkheid toegevoegd om klassen op basis van scripts te definiëren. Deze klassen kunnen overbelaste methoden bevatten.

3.7.2 Methode overbelastingsresolutie

Gezien een methode-aanroep (§7.1.3) met een lijst met argumentexpressies en een set kandidaatmethodes (d.w.z. methoden die kunnen worden aangeroepen), wordt het mechanisme voor het selecteren van de beste methode genoemd overbelastingsresolutie.

Gezien de set toepasselijke kandidaatmethoden (§3.7.3), wordt de beste methode in die set geselecteerd. Als de set slechts één methode bevat, is die methode de beste methode. Anders is de beste methode de ene methode die beter is dan alle andere methoden met betrekking tot de opgegeven argumentenlijst met behulp van de regels die worden weergegeven in §3.7.4. Als er niet precies één methode is die beter is dan alle andere methoden, is de aanroep van de methode dubbelzinnig en wordt er een fout gerapporteerd.

De beste methode moet toegankelijk zijn in de context waarin deze wordt aangeroepen. Een PowerShell-script kan bijvoorbeeld geen methode aanroepen die privé of beveiligd is.

De beste methode voor een aanroep naar een statische methode moet een statische methode zijn en de beste methode voor een aanroep naar een instantiemethode moet een instantiemethode zijn.

3.7.3 Toepasselijke methode

Een methode wordt geacht van toepassing te zijn met betrekking tot een argumentenlijst A wanneer een van de volgende waar is:

  • Het aantal argumenten in A is identiek aan het aantal parameters dat door de methode wordt geaccepteerd.
  • De methode heeft vereiste M-parameters en optionele N-parameters en het aantal argumenten in A is groter dan of gelijk aan M, maar kleiner dan N.
  • De methode accepteert een variabel aantal argumenten en het aantal argumenten in A is groter dan het aantal parameters dat de methode accepteert.

Naast het juiste aantal argumenten moet elk argument in A overeenkomen met de parameterdoorgiftemodus van het argument en moet het argumenttype overeenkomen met het parametertype, of moet er een conversie zijn van het argumenttype naar het parametertype.

Als het argumenttype verw is (§4.3.6), moet de bijbehorende parameter ook verw zijn en het argumenttype voor conversiedoeleinden is het type eigenschapswaarde uit het argument verw.

Als het argumenttype is ref, kan de bijbehorende parameter worden out in plaats van ref.

Als de methode een variabel aantal argumenten accepteert, kan de methode in normale vorm of uitgebreide vormvan toepassing zijn. Als het aantal argumenten in A identiek is aan het aantal parameters dat de methode accepteert en de laatste parameter een matrix is, is het formulier afhankelijk van de rang van een van de twee mogelijke conversies:

  • De rang van de conversie van het type van het laatste argument in A naar het arraytype voor de laatste parameter.
  • De rangorde van de conversie van het type van het laatste argument in A naar het elementtype van het matrixtype voor de laatste parameter.

Als de eerste conversie (naar het matrixtype) beter is dan de tweede conversie (naar het elementtype van de matrix), is de methode in normale vorm van toepassing, anders is deze in uitgevouwen vorm van toepassing.

Als er meer argumenten dan parameters zijn, kan de methode alleen van toepassing zijn in uitgevouwen vorm. Als u dit in uitgevouwen vorm wilt toepassen, moet de laatste parameter een matrixtype hebben. De methode wordt vervangen door een equivalente methode waarbij de laatste parameter is vervangen door voldoende parameters om rekening te houden met elk niet-overeenkomend argument in A. Elk extra parametertype is het elementtype van het matrixtype voor de laatste parameter in de oorspronkelijke methode. De bovenstaande regels voor een toepasselijke methode worden toegepast op deze nieuwe methode en argumentlijst A.

3.7.4 Betere methode

Gezien een argumentenlijst A met een set argumentexpressies { E~1~, E~2~, ..., E~N~ } en twee toepassingsmethoden M~P~ en M~Q~ met parametertypen { P~1~, P~2~, ..., P~N~ } en { Q~1~, Q~2~, ..., Q~N~ }, wordt M~P~ gedefinieerd als een betere methode dan M~Q~ als de cumulatieve classificatie van conversies voor M~P~ beter is dan voor M~Q~.

De cumulatieve rangschikking van conversies wordt als volgt berekend. Elke conversie is een andere waarde waard, afhankelijk van het aantal parameters, met de conversie van E~1~ waarde N, E~2~ waarde N-1, tot E~N~ de waarde 1. Als de conversie van E~X~ naar P~X~ beter is dan die van E~X~ naar Q~X~, verzamelt de M~P~ N-X+1; anders verzamelt M~Q~ N-X+1. Als M~P~ en M~Q~ dezelfde waarde hebben, worden de volgende tie-breakregels, in volgorde toegepast:

  • De cumulatieve rangschikking van conversies tussen parametertypen (argumenttypen negeren) wordt berekend op een manier die vergelijkbaar is met de vorige rangschikking, dus P~1~ wordt vergeleken met Q~1~, P~2~ ten opzichte van Q~2~, ...en P~N~ ten opzichte van Q~N~. De vergelijking wordt overgeslagen als het argument is $nullof als de parametertypen geen numerieke typen zijn. De vergelijking wordt ook overgeslagen als de argumentconversie E~X~ informatie verliest wanneer deze wordt geconverteerd naar P~X~, maar geen informatie verliest wanneer deze wordt geconverteerd naar Q~X~of omgekeerd. Als de parameterconversietypen worden vergeleken, dan als de conversie van P~X~ naar Q~X~ beter is dan die van Q~X~ tot P~X~, verzamelt de M~P~ N-X+1; anders verzamelt M~Q~ N-X+1. Deze regel voor het verbreken van ties is bedoeld om de voorkeur te geven aan de meest specifieke methode (de methode met parameters met de kleinste gegevenstypen) als er geen informatie verloren gaat in conversies of de voorkeur geeft aan de meest algemene methode (de methode met de parameters met de grootste gegevenstypen) als conversies leiden tot verlies van informatie.
  • Als beide methoden hun uitgevouwen vorm gebruiken, is de methode met meer parameters de betere methode.
  • Als de ene methode het uitgevouwen formulier gebruikt en de andere normale vorm gebruikt, is de methode met normale vorm de betere methode.

3.7.5 Betere conversie

De onderstaande tekst die als volgt is gemarkeerd, is specifiek voor Windows PowerShell.

Conversies worden op de volgende manier gerangschikt, van laag naar hoog:

  • T~1~[] aan T~2~[] wanneer er geen toewijsbare conversie tussen T~1~ en T~2~ bestaat
  • T naar tekenreeks waarbij T een willekeurig type is
  • T~1~ naar T~2~ waarin T~1~ of T~2~ een aangepaste conversie op een implementatie-gedefinieerde manier definieert
  • T~1~ naar T~2~ waar T~1~ IConvertible implementeert
  • T~1~ naar T~2~ waar T~1~ of T~2~ de methode T~2~ op_Implicit(T1) uitvoert
  • T~1~ naar T~2~ waar T~1~ of T~2~ de methode T~2~ op_Explicit(T1) uitvoert
  • T~1~ naar T~2~ waar T~2~ een constructor heeft die één argument van het type T~1~ aanneemt
  • Een van de volgende conversies:
    • tekenreeks naar T waar T een statische methode implementeert T Parse(string) of T Parse(string, IFormatProvider)
    • T~1~ naar T~2~ waar T~2~ een opsomming is en T~1~ een tekenreeks of een verzameling objecten is die naar een tekenreeks kan worden geconverteerd
  • T naar PSObject waarbij T een willekeurig type is
  • Een van de volgende conversies: Language
    • T naar bool waarbij T een numeriek type is
    • tekenreeks naar T waarin T is regex, wmisearcher, wmi, wmiclass, adsi, adsisearcher, of type
    • T tot bool
    • T~1~ naar Nullable[T~2~] waar een conversie van T~1~ naar T~2~ bestaat
    • T om ongeldig te maken
    • T~1~[] naar T~2~[] waar een toewijsbare conversie tussen T~1~ en T~2~ bestaat
    • T~1~ T~2~[] waar T~1~ een verzameling is
    • IDictionary tot Hashtable
    • T tot ref
    • T tot xml
    • scriptblock tot delegate
    • T~1~ tot T~2~ waarin T~1~ een geheel getal is en T~2~ een opsomming is
  • $null tot T, waar T elke waardetype kan zijn
  • $null naar T waar T een verwijzingstype is
  • Een van de volgende conversies:
    • byte naar T waar T is SByte

    • UInt16 T waar T is SByte, byte of Int16

    • Int16 naar T waar TSByte of byte is

    • UInt32 naar T waar T is SByte, byte, Int16, UInt16of int

    • int naar T waar TSByte, byte, Int16of UInt16 is

    • UInt64 tot T waar T is SByte, byte, Int16, UInt16, int, UInt32of long

    • long naar T waar T is SByte, byte, Int16, UInt16, intof UInt32

    • float naar T waar T een geheel getal of decimal

    • double naar T waar T een geheel getal of decimal

    • decimal naar T waar T een geheel getal is

  • Een van de volgende conversies:
    • SByte naar T waar Tbyte, uint6, UInt32of UInt64 is
    • Int16 T waar T is UInt16, UInt32 of UInt64
    • int naar T waar TUInt32 of UInt64 is
    • long tot UInt64
    • decimal naar T waar Tfloat of double is
  • Een van de volgende conversies:
    • T naar string waar T een numeriek type is
    • T naar char waar T een numeriek type is
    • string naar T waar T een numeriek type is
  • Een van de volgende conversies, deze conversies worden beschouwd als toewijsbare conversies:
    • byte naar T waar T is Int16, UInt16, int, UInt32, long, UInt64, single, double of decimal
    • SByte naar T waar T is Int16, UInt16, int, UInt32, long, UInt64, single, double of decimal
    • UInt16 naar T waar T is int, UInt32, longof UInt64, single, doubleof decimal
    • Int16 naar T waar T is int, UInt32, longof UInt64, single, doubleof decimal
    • UInt32 naar T waar T is long, of UInt64, single, double, of decimal
    • int naar T waar T is long, UInt64, single, doubleof decimal
    • single tot double
  • T~1~ T~2~ waar T~2~ een basisklasse of interface van T~1~is. Deze conversie wordt beschouwd als een toewijsbare conversie.
  • string tot char[]
  • T naar T. Deze conversie wordt beschouwd als een toewijsbare conversie.

Voor elke conversie van het formulier T~1~ naar T~2~[] waarbij T~1~ geen matrix is en er geen andere conversie van toepassing is, als er een conversie is van T~1~ naar T~2~, is de positie van de conversie slechter dan de conversie van T~1~ naar T~2~, maar beter dan elke conversie die lager is dan de conversie van T~1~ naar T~2~

3.8 Naam opzoeken

Het is mogelijk dat opdrachten van verschillende soorten allemaal dezelfde naam hebben. De volgorde waarin naamzoekacties in een dergelijk geval worden uitgevoerd, is alias, functie, cmdlet en externe opdracht.

3.9 Type naam opzoeken

§7.1.10 bevat de uitspraak "Een type-letter wordt weergegeven in een implementatie door een niet-opgegeven onderliggend type. Als gevolg hiervan is een typenaam een synoniem voor het onderliggende type. Voorbeelden van typen zijn int, double, long[]en Hashtable.

Typenamen komen als volgt overeen: Vergelijk een bepaalde typenaam met de lijst met ingebouwde typeversnellers, zoals int, long, double. Als er een overeenkomst wordt gevonden, is dat het type. Neem anders aan dat de typenaam volledig gekwalificeerd is en kijk of een dergelijk type op het hostsysteem bestaat. Als er een overeenkomst wordt gevonden, is dat het type. Voeg anders het naamruimtevoorvoegsel System.toe. Als er een overeenkomst wordt gevonden, is dat het type. Anders is de typeaanduiding fout. Dit algoritme wordt toegepast voor elk typeargument voor algemene typen. Het is echter niet nodig om de ariteit op te geven (het aantal argumenten of operanden dat door een functie of operator wordt genomen).

3.10 Automatisch geheugenbeheer

Verschillende operators en cmdlets resulteren in de toewijzing van geheugen voor objecten van het verwijzingstype, zoals tekenreeksen en matrices. De toewijzing en het vrijmaken van dit geheugen wordt beheerd door het PowerShell-runtimesysteem. Dat wil zeggen, PowerShell biedt automatische vuilnisophaling.

3.11 Uitvoeringsvolgorde

Een neveneffect is een wijziging in de status van de uitvoeringsomgeving van een opdracht. Een wijziging in de waarde van een variabele (via de toewijzingsoperatoren of de operators vóór en na het verhogen en verlagen) is een neveneffect, net als een wijziging in de inhoud van een bestand.

Tenzij anders opgegeven, worden instructies uitgevoerd in lexicale volgorde.

Behalve zoals opgegeven voor sommige operators, zijn de volgorde van de evaluatie van termen in een expressie en de volgorde waarin bijwerkingen plaatsvinden, beide niet opgegeven.

Een expressie die een opdracht aanroept, omvat de expressie die de opdracht aanwijst en nul of meer expressies die de argumenten aanwijzen waarvan de waarden moeten worden doorgegeven aan die opdracht. De volgorde waarin deze expressies worden geëvalueerd ten opzichte van elkaar, is niet opgegeven.

3.12 Foutafhandeling

Wanneer een opdracht mislukt, wordt dit beschouwd als een fout, en informatie over die fout wordt vastgelegd in een foutrecord, waarvan het type niet is opgegeven (§4.5.15); Dit type ondersteunt echter subscripting.

Een fout valt in een van twee categorieën. Hiermee wordt de bewerking beëindigd (een afsluitfout) of niet (een niet-afsluitfout). Met een terminerende fout wordt de fout vastgelegd en stopt de bewerking. Met een niet-beëindigende fout wordt de fout geregistreerd en gaat de bewerking door.

Niet-beëindigende fouten worden naar de foutstroom geschreven. Hoewel deze informatie naar een bestand kan worden omgeleid, worden de foutobjecten eerst geconverteerd naar tekenreeksen en worden belangrijke informatie in die objecten niet vastgelegd, waardoor diagnose moeilijk wordt als dat niet onmogelijk is. In plaats daarvan kan de fouttekst worden omgeleid (§7.12), en kan het foutobject in een variabele worden opgeslagen, zoals in $Error1 = command 2>&1.

De automatische variabele $Error bevat een verzameling foutrecords die recente fouten vertegenwoordigen en de meest recente fout zich in $Error[0]bevindt. Deze verzameling wordt onderhouden in een buffer, zodat oude records worden verwijderd wanneer er nieuwe records worden toegevoegd. De automatische variabele $MaximumErrorCount bepaalt het aantal records dat kan worden opgeslagen.

$Error bevat alle fouten van alle opdrachten die in één verzameling zijn gemengd. Als u de fouten van een specifieke opdracht wilt verzamelen, gebruikt u de algemene parameter ErrorVariable, waarmee een door de gebruiker gedefinieerde variabele kan worden opgegeven voor het opslaan van de verzameling.

3.13 Pijplijnen

Een pijplijn is een reeks van een of meer opdrachten, elk gescheiden door de pijpoperator | (U+007C). Elke opdracht ontvangt invoer van de voorafgaande opdracht en schrijft uitvoer naar de opvolgende opdracht. Tenzij de uitvoer aan het einde van de pijplijn wordt verwijderd of omgeleid naar een bestand, wordt deze verzonden naar de hostomgeving, die ervoor kan kiezen deze naar de standaarduitvoer te schrijven. Opdrachten in een pijplijn ontvangen mogelijk ook invoer van argumenten. Denk bijvoorbeeld aan het volgende gebruik van opdrachten Get-ChildItem, Sort-Objecten Process-File, waarmee een lijst met bestandsnamen wordt gemaakt in een bepaalde bestandssysteemmap, een set tekstrecords sorteert en een aantal bewerkingen uitvoert op een tekstrecord, respectievelijk:

Get-ChildItem
Get-ChildItem E:*.txt | Sort-Object -CaseSensitive | Process-File >results.txt

In het eerste geval maakt Get-ChildItem een verzameling namen van de bestanden in de huidige/standaardmap. Deze verzameling wordt verzonden naar de hostomgeving, die standaard de waarde van elk element naar de standaarduitvoer schrijft.

In het tweede geval maakt Get-ChildItem een verzameling namen van de bestanden in de opgegeven map met behulp van het argument E:*.txt. Deze verzameling wordt geschreven naar de opdracht Sort-Object, die ze standaard in oplopende volgorde sorteert, gevoelig voor hoofdletters (vanwege het argument CaseSensitive). De resulterende verzameling wordt vervolgens geschreven naar opdracht Process-File, waarmee een (onbekende) verwerking wordt uitgevoerd. De uitvoer van die opdracht wordt vervolgens omgeleid naar het bestand results.txt.

Als een commando één object schrijft, ontvangt de opvolger dat object en beëindigt vervolgens na het schrijven van zijn eigen object(en) naar de opvolger. Als een opdracht echter meerdere objecten schrijft, worden deze één voor één geleverd aan de opvolgende opdracht, die eenmaal per object wordt uitgevoerd. Dit gedrag wordt streaminggenoemd. In de stroomverwerking worden objecten langs de pijplijn geschreven zodra ze beschikbaar zijn, niet wanneer de hele verzameling is geproduceerd.

Bij het verwerken van een verzameling kan een opdracht zodanig worden geschreven dat deze speciale verwerking kan uitvoeren vóór het eerste element en na het laatste element.

3.14 Modulen

Een module is een op zichzelf staande herbruikbare eenheid waarmee PowerShell-code kan worden gepartitioneerd, georganiseerd en geabstraheerd. Een module kan opdrachten (zoals cmdlets en functies) en items (zoals variabelen en aliassen) bevatten die als één eenheid kunnen worden gebruikt.

Zodra een module is gemaakt, moet deze worden geïmporteerd in een sessie voordat de opdrachten en items erin kunnen worden gebruikt. Na het importeren gedragen opdrachten en items zich alsof ze lokaal zijn gedefinieerd. Een module wordt expliciet geïmporteerd met de opdracht Import-Module. Een module kan ook automatisch worden geïmporteerd zoals bepaald op een door de implementatie gedefinieerde manier.

Het type object dat een module vertegenwoordigt, wordt beschreven in §4.5.12.

Modules worden uitvoerig besproken in §11.

3.15 Expressies met jokertekens

Een jokertekenuitdrukking kan nul of meer van de volgende elementen bevatten:

Element Beschrijving
Ander teken dan *, ?, of [ Komt overeen met dat ene teken
* Komt overeen met nul of meer tekens. Als u een *-teken wilt vergelijken, gebruikt u [*].
? Komt overeen met elk willekeurig teken. Om overeen te komen met een ? teken, gebruik [?].
[instellen]

Komt overeen met één teken uit set, die niet leeg mogen zijn.

Als begint met ], wordt die rechte vierkante haak beschouwd als onderdeel van set en wordt de set beëindigd door de volgende vierkante haak rechts; anders beëindigt de eerste vierkante haak rechts de set.

Als begint of eindigt met een koppelteken, wordt deze koppelteken-min als onderdeel van setbeschouwd; anders duidt het op een reeks opeenvolgende Unicode-codepunten waarbij de tekens aan beide zijden van de koppelteken-min als de inclusieve scheidingstekens voor het bereik fungeren. A-Z geeft bijvoorbeeld de 26 hoofdletters Engels aan en 0-9 geeft de tien decimale cijfers aan.

Notitie

Meer informatie vindt u in The Open Group Base Specifications: Pattern Matching", IEEE Std 1003.1, 2004 Edition.. In PowerShell is het escape-teken een backtick en geen backslash.

3.16 Reguliere expressies

Een reguliere expressie kan nul of meer van de volgende elementen bevatten:

Element Beschrijving
Ander teken dan ., [, ^, *, $of \ Komt overeen met dat ene teken
. Komt overeen met elk willekeurig teken. Om te voldoen aan een . teken, gebruik \..
[instellen]
[^stel]

Het formulier [set] komt overeen met één teken uit set. Het formulier [^] komt niet overeen met enige tekens uit de verzameling. instellen mag niet leeg zijn.

Als begint met ] of ^], wordt die vierkante haak rechts beschouwd als onderdeel van set en wordt de set beëindigd door de volgende vierkante haak rechts; anders beëindigt de eerste vierkante haak rechts de set.

Als de set begint met - of ^-, of eindigt met -, geldt dat koppelteken als onderdeel van set. Anders wordt een bereik van opeenvolgende Unicode-codepunten aangegeven, waarbij de tekens aan beide zijden van het koppelteken de inclusief bereiken-afbakeningen zijn. A-Z geeft bijvoorbeeld de 26 hoofdletters Engels aan en 0-9 geeft de tien decimale cijfers aan.

* Komt overeen met nul of meer voorkomens van het voorgaande element.
+ Komt overeen met een van meer exemplaren van het voorgaande element.
? Komt overeen met nul of één keer van het voorgaande element.
^ Matcht aan de start van de tekenreeks. Gebruik \^ om een ^-teken te matchen.
$ Komt overeen met het einde van de tekenreeks. Om een $-teken te matchen, gebruikt u $.
\ c Escapes teken c, zodat het niet wordt herkend als een reguliere expressie-element.

Windows PowerShell: tekenklassen die beschikbaar zijn in reguliere expressies van Microsoft .NET Framework worden als volgt ondersteund:

Element Beschrijving
\p{name} Komt overeen met een willekeurig teken in de benoemde tekenklasse die is opgegeven door naam. Ondersteunde namen zijn Unicode-groepen en blokbereiken zoals Ll, Nd, Z, IsGreek en IsBoxDrawing.
\P{name} Komt overeen met tekst die niet is opgenomen in de groepen en blokbereiken die zijn opgegeven in naam.
\w Komt overeen met elk woordteken. Equivalent aan de Unicode-tekencategorieën [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]. Als ecmascript-compatibel gedrag is opgegeven met de ECMAScript-optie, \w is gelijk aan [a-zA-Z_0-9].
\W Komt overeen met een niet-woordteken. Equivalent aan de Unicode-categorieën [\^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}].
\s Komt overeen met een witruimteteken. Equivalent aan de Unicode-tekencategorieën [\f\n\r\t\v\x85\p{Z}].
\S Komt overeen met elk niet-spatieteken. Equivalent aan de Unicode-tekencategorieën [\^\f\n\r\t\v\x85\p{Z}].
\d Komt overeen met een decimaal getal. Gelijk aan \p{Nd} voor Unicode en [0-9] voor niet-Unicode-gedrag.
\D Komt overeen met een niet-getal. Gelijk aan \P{Nd} voor Unicode en [\^0-9] voor niet-Unicode-gedrag.

Kwantificatoren die beschikbaar zijn in reguliere expressies van Microsoft .NET Framework worden als volgt ondersteund:

Element Beschrijving
* Geeft nul of meer overeenkomsten aan; bijvoorbeeld \w* of (abc)*., gelijk aan {0,}.
+ Komt overeen met herhalingen van de voorgaande tekens.
? Geeft nul of één overeenkomst weer; bijvoorbeeld \w? of (abc)?. Gelijk aan {0,1}.
{n} Geeft exact en matches aan; bijvoorbeeld (pizza){2}.
{n,} Geeft aan dat er ten minste en overeenkomsten zijn; bijvoorbeeld (abc){2,}.
{n,m} Specificeert ten minste n, maar hoogstens m, overeenkomsten.