3. Basisconcepten

3.1 Providers and drives

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

De gegevens die een provider beschikbaar maakt, worden weergegeven op een station en de gegevens worden 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 gegevensopslag:

Provider Naam van station Beschrijving Ref.
Alias Alias: PowerShell-aliassen ;3.1.1
Omgeving Env: Omgevingsvariabelen ;3.1.2
Bestandssysteem A:, B:, C:, ... Schijfstations, mappen en bestanden ;3.1.3
Functie Functie: PowerShell-functies ;3.1.4
Variabele Variabele: PowerShell-variabelen ;3.1.5

Windows PowerShell:

Provider Naam van station Beschrijving
Certificaat Cert: x509-certificaten voor digitale handtekeningen
Register HKLM: (HKEY_LOCAL_MACHINE), HKCU: (HKEY_CURRENT_USER) Windows register
WSMan WSMan: WS-Management configureren

De volgende cmdlets hebben te maken met providers en stations:

Het type object dat een provider vertegenwoordigt, wordt beschreven in :4.5.1. Het type van een object 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.

Sommige aliassen zijn ingebouwd in PowerShell.

De volgende cmdlets hebben te maken met aliassen:

  • New-Alias: hiermee maakt u een alias
  • Set-Alias: maakt of wijzigt een of meer aliassen
  • Get-Alias: haalt informatie op over een of meer aliassen
  • Export-Alias: Exporteert een of meer aliassen naar een bestand

Wanneer een alias wordt gemaakt voor een opdracht met New-Aliasbehulp van , 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 eenvoudig om een functie te maken die alleen de aanroep van die opdracht met alle gewenste parameters bevat en om een alias aan die functie toe te wijzen.

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

Aliasobjecten worden opgeslagen op het station Alias: (3.1).

3.1.2 Omgevingsvariabelen

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

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

De naam van een omgevingsvariabele mag niet het gelijkteken () 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 het station Env: (3.1).

3.1.3 Bestandssysteem

Met de PowerShell-bestandssysteemprovider 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 als A:, B:, C:, etc.(3.1). Mappen en bestanden zijn toegankelijk via pad-notatie (3.4).

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

3.1.4 Functions

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 station Functie: (;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 te maken met variabelen:

Aangezien een variabele een item (3.3) is, 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 schijfvariabele: (3.1).

3.2 Werklocaties

De huidige werklocatie is de standaardlocatie waar opdrachten naar wijzen. Dit is de locatie die wordt gebruikt als er geen expliciet pad (3.4) wordt opgegeven wanneer een opdracht wordt aangeroepen. Deze locatie bevat het huidige station.

Een PowerShell-host kan meerdere stations hebben. In dat geval heeft elk station een eigen huidige locatie.

Wanneer een stationnaam is opgegeven zonder een map, wordt de huidige locatie voor dat station geïmpliceerd.

De huidige werklocatie kan worden opgeslagen op een stack en vervolgens worden ingesteld op een nieuwe locatie. Later kan die opgeslagen locatie vanuit die stack worden hersteld en de huidige werklocatie worden gemaakt. Er zijn twee soorten locatiestacks: de standaard werklocatiestack en nul of meer door de gebruiker gedefinieerde benoemde werklocatiestacks. Wanneer een sessie begint, is de standaard werklocatiestack ook de huidige werklocatiestack. Elke benoemde werklocatiestack kan echter worden gemaakt van de huidige werklocatiestack.

De volgende cmdlets hebben te maken met locaties:

  • Set-Location: Bepaalt de huidige werklocatie
  • Get-Location: bepaalt de huidige werklocatie voor de opgegeven station(en) of de werklocaties voor de opgegeven stack(s)
  • Pushlocatie: slaat de huidige werklocatie op boven op een opgegeven stack met locaties
  • Pop-locatie: herstelt de huidige werklocatie vanaf de bovenkant van een opgegeven stack met locaties

De objecttypen die een werklocatie en een stack met werklocaties vertegenwoordigen, worden beschreven in :4.5.5.

3.3 Items

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 te maken met items:

  • New-Item: Hiermee maakt u 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: haalt de items en onderliggende items op de opgegeven locatie op
  • Copy-Item: kopieert een of meer items van de ene locatie naar de andere
  • Move-Item: Hiermee worden een of meer items van de ene locatie naar de andere verplaatst
  • Rename-Item: hiermee wijzigt u de naam van een item
  • Invoke-Item: voert de standaardactie uit op een of meer items
  • Clear-Item: hiermee verwijdert u de inhoud van een of meer items, maar worden de items niet verwijderd (zie
  • Remove-Item: hiermee verwijdert u de opgegeven items

De volgende cmdlets hebben te maken met 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 gegevensopslag die toegankelijk zijn via een PowerShell-provider, kunnen uniek worden geïdentificeerd door hun padnamen. Een padnaam is een combinatie van de itemnaam, de container en subcontainers waarin het item zich bevindt en het PowerShell-station waarmee de containers worden gebruikt.

Padnamen zijn onderverdeeld in een van de twee typen: volledig gekwalificeerd en relatief. Een volledig gekwalificeerde padnaam bestaat uit alle elementen waar een pad uit 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 het gegevensopslag wordt gebruikt.

station verwijst naar het PowerShell-station dat wordt ondersteund door een bepaalde PowerShell-provider.

Een container kan andere containers bevatten, die andere containers kunnen bevatten, en de uiteindelijke container met een item. Containers moeten worden opgegeven in de hiërarchische volgorde waarin ze bestaan in het gegevensopslag.

Hier is 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 gewoon element.

In sommige gevallen is geen volledig gekwalificeerde padnaam nodig; de naam van een relatief pad volstaat. De naam van een relatief pad 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. De naam van een relatief pad omvat het gebruik van een aantal speciale tekens. De volgende tabel beschrijft elk van deze tekens en bevat voorbeelden 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 gekwalificeerde pad
. Huidige werklocatie .\System C:\Windows\System
.. Bovenliggend van de huidige werklocatie ..\Program Files C:\Program Files
\ De hoofdmap van de huidige werklocatie bepalen \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 te maken met paden:

  • Convert-Path: converteert een pad van een PowerShell-pad naar een Pad naar een PowerShell-provider
  • Join-Path: Combineert een pad en een onderliggend pad in één pad
  • Resolve-Path: de jokertekens in een pad worden opgelost
  • Gesplitst pad: 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 het gebruik Copy-Item van bestandsfilters. 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 bewerkt als tekenreeksen.

3.5 Scopes

3.5.1 Inleiding

Een naam kan een variabele, een functie, een alias, een omgevingsvariabele of een station duiden. Dezelfde naam kan verschillende items op verschillende plaatsen in een script duiden. Voor elk ander item dat door een naam wordt aangeduid, is die naam alleen zichtbaar binnen het gebied van scripttekst dat het bereik wordt genoemd. Verschillende items die met dezelfde naam worden aangeduid, hebben verschillende scopes of hebben verschillende naamruimten.

Scopes kunnen nesten. In dat geval wordt een buitenste bereik aangeduid als een bovenliggend bereik en zijn geneste scopes onderliggende scopes van dat bovenliggende bereik. Het bereik van een naam is het bereik waarin deze is gedefinieerd en alle onderliggende scopes, tenzij deze privé wordt gemaakt. Binnen een onderliggend bereik worden alle items die met dezelfde naam zijn gedefinieerd, verborgen in bovenliggende scopes.

Tenzij puntbron notatie (3.5.5) wordt gebruikt, maakt elk van de volgende punten een nieuw bereik:

  • Een scriptbestand
  • Een scriptblok
  • Een functie of filter

Kijk eens naar 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 en $x gemaakt $y in het script 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, verschillen deze variabelen van de variabelen 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 als dit gebeurt, wordt er nog een genest bereik gemaakt, elk met eigen variabelen $x en $y.

Hier ziet u een complexer voorbeeld, waarin ook geneste scopes worden weer geven 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 -nummers

PowerShell ondersteunt de volgende scopes:

  • Globaal: dit is het bereik op het hoogste niveau. Alle automatische en voorkeursvariabelen worden in dit bereik gedefinieerd. Het globale bereik is het bovenliggende bereik van alle andere scopes en alle andere scopes zijn onderliggende scopes van het globale bereik.

  • Lokaal: Dit is het huidige bereik op elk uitvoeringspunt binnen een script, scriptblok of functie. Elk bereik kan het lokale bereik zijn.

  • Script: dit bereik bestaat voor elk scriptbestand dat wordt uitgevoerd. Het scriptbereik is het bovenliggende bereik van alle scopes die vanuit het bereik zijn gemaakt. Een scriptblok heeft geen eigen scriptbereik; In plaats daarvan is het scriptbereik dat van het dichtstbijzijnde overerfde scriptbestand. Hoewel modulebereik niet bestaat, biedt scriptbereik het equivalent.

Namen kunnen privé worden gedeclareerd. In dat geval zijn ze niet zichtbaar buiten het bovenliggende bereik, zelfs niet voor onderliggende scopes. Het concept privé is geen afzonderlijk bereik; het is een alias voor het lokale bereik met de toevoeging van het verbergen van de naam als deze wordt gebruikt als een beschrijfbare locatie.

Naar scopes kan worden verwezen door een getal, waarmee de relatieve positie van het ene bereik ten opzichte van het andere wordt beschreven. Bereik 0 geeft het lokale bereik aan, bereik 1 geeft een 1-generatie buitenruimtebereik aan, bereik 2 geeft een bereik van twee generatie aan, en meer. (Bereiknummers worden gebruikt door cmdlets waarmee variabelen worden bewerkt.)

3.5.3 Bereik van variabelenaam

Zoals u in de volgende productie ziet, 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 ervan in alle mogelijke contexten. U ziet ook het bereik wanneer er expliciet geen bereik is opgegeven:

Bereikmodifier Binnen een scriptbestand Binnen een scriptblok Binnen een functie
Globale Globaal bereik Globaal bereik Globaal bereik
script Bereik van dichtstbijzijnde overerfde scriptbestand of Globaal als er geen dichtstbijzijnde overerfde scriptbestand is Bereik van dichtstbijzijnde overerfde scriptbestand of Globaal als er geen dichtstbijzijnde overerfde scriptbestand is Bereik van dichtstbijzijnde overerfde scriptbestand of Globaal als er geen dichtstbijzijnde overerfde 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
werkstroom Implementatie gedefinieerd Implementatie gedefinieerd Implementatie gedefinieerd
geen Globaal/script/lokaal bereik Lokaal bereik Lokaal bereik

Informatie over variabelebereiken kan ook worden opgegeven wanneer u de familie van cmdlets gebruikt die worden vermeld in (3.1.5). Raadpleeg met name de parameter Scope, en de parameters en Option Private voor Option AllScope meer informatie.

Het bereik wordt using gebruikt voor toegang tot variabelen die zijn gedefinieerd in een ander bereik tijdens het uitvoeren van scripts via cmdlets Start-Jobzoals , 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 werkstroom bereik wordt gebruikt met een parallelle instructie of sequence-statement voor toegang tot een variabele die is gedefinieerd in de werkstroom.

3.5.4 Bereik functienaam

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 wordt uitgevoerd vanuit een ander scriptbestand, scriptblok of functie, maakt het uitgevoerde scriptbestand een nieuw genest bereik. Bijvoorbeeld:

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

Als er echter een puntbron-notatie wordt gebruikt, wordt er geen nieuw bereik gemaakt voordat de opdracht wordt uitgevoerd. In plaats daarvan worden toevoegingen/wijzigingen aangebracht aan het eigen lokale bereik in het huidige bereik. Bijvoorbeeld:

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

3.5.6 Modules

Net als een scriptbestand op het hoogste niveau zich in de hoofdmap van een hiërarchische geneste bereikstructuur, is ook elke module (3,14) hetzelfde. Standaard zijn echter alleen de namen die door een module worden geëxporteerd, op naam beschikbaar vanuit de importcontext. Met de parameter Global van de cmdlet Import-Module kunnen geëxporteerde namen beter zichtbaar zijn.

3.6 Alleen-lezen en constante eigenschappen

Variabelen en aliassen worden beschreven door objecten die een aantal eigenschappen bevatten. Deze eigenschappen worden ingesteld en bewerkt door twee families van cmdlets (3.1.5, [].3.1.1]§3.1.1). Een van deze eigenschappen is Opties, die kan worden ingesteld op ReadOnly of Constant (met behulp van de parameter Option). Een variabele of alias met de naam ReadOnly kan worden verwijderd en de eigenschappen ervan kunnen worden gewijzigd als de parameter Force is opgegeven. Een variabele of alias met de naam Constant kan echter niet worden verwijderd en de eigenschappen ervan kunnen niet worden gewijzigd.

3.7 Methode overloads and call resolution

Inleiding tot 3.7.1

Zoals vermeld in .1, wordt een externe procedure die beschikbaar is gesteld door de uitvoeringsomgeving (en geschreven in een andere taal dan PowerShell) een methode genoemd.

De naam van een methode samen met het aantal en de typen van de parameters worden gezamenlijk de handtekening van die methode genoemd. (Houd er rekening mee dat de handtekening niet het retourtype van de methode bevat.) In de uitvoeringsomgeving kan een type meerdere methoden met dezelfde naam hebben, mits elke methode een andere handtekening heeft. Wanneer er meerdere versies van een methode worden gedefinieerd, wordt gezegd dat deze methode overbelast is. Het type Math (*4.3.8) bevat bijvoorbeeld een set Absmethoden met de naam , waarmee de absolute waarde van een opgegeven getal wordt berekend, waarbij het opgegeven getal een van een aantal typen kan bevatten. 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 betreft het type Matrix (4.3.2), dat een set 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 komen het aantal en type van de doorgegeven argumenten exact overeen met een van de overloads. De geselecteerde methode is duidelijk. Als dat echter niet het geval is, moet er een manier zijn om op te lossen welke overbelaste versie moet worden aanroepen, indien van u dat wel doet. 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 (dat wil zeggen; System.String), dat talloze overbelaste methoden heeft.

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

Notitie

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

3.7.2 Oplossing van overbelasting van methode

Gezien een methode-aanroep (7.1.3) met een lijst met argumentexpressie en een set kandidaatmethoden (dat wil zeggen de methoden die kunnen worden aangeroepen), wordt het mechanisme voor het selecteren van de beste methode overbelastingsoplossing genoemd.

Op basis van de set geschikte 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 enige 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 methode-aanroep ambigu 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 van een statische methode moet een statische methode zijn en de beste methode voor een aanroep van een instantiemethode moet een instantiemethode zijn.

3.7.3 Toepasselijke methode

Er wordt gezegd dat een methode van toepassing is met betrekking tot een argumentlijst A wanneer een van de volgende voorwaarden waar is:

  • Het aantal argumenten in A is identiek aan het aantal parameters dat de methode accepteert.
  • De methode heeft M vereiste parameters en N optionele 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 parameter-passing modus van het argument en moet het argumenttype overeenkomen met het parametertype, of moet er een conversie van het argumenttype naar het parametertype zijn.

Als het argumenttype ref (4.3.6) is, moet de bijbehorende parameter ook ref zijn en is het argumenttype voor conversiedoeleinden het type van de eigenschap Waarde van het ref-argument.

Als het argumenttype is, kan refde bijbehorende parameter zijn in out plaats van ref.

Als de methode een variabel aantal argumenten accepteert, kan de methode van toepassing zijn in de normale vorm of in een uitgebreide vorm. 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 rangschikking van een van twee mogelijke conversies:

  • De rangschikking van de conversie van het type van het laatste argument in A naar het matrixtype voor de laatste parameter.
  • De rangschikking 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 van toepassing in uitgebreide vorm.

Als er meer argumenten dan parameters zijn, is de methode mogelijk alleen van toepassing in uitgebreide vorm. De laatste parameter moet een matrixtype hebben om in uitgebreide vorm van toepassing te zijn. 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.

Methode 3.7.4 Better

Op basis van een argumentlijst A met een set argumentexpressie en twee toepassingsmethoden en met parametertypen { P~1~, P~2~, ..., P~N~ } { Q~1~, Q~2~, ..., Q~N~ }en wordt M~P~ M~Q~ gedefinieerd als een betere methode dan als de cumulatieve rangschikking van conversies M~P~ M~P~ { E~1~, E~2~, ..., E~N~ } M~Q~ voor beter is M~Q~dan die voor .

De cumulatieve rangschikking van conversies wordt als volgt berekend. Elke conversie is een andere waarde waard, afhankelijk van het aantal parameters, E~1~ met de conversie van N, E~2~ ter waarde van N-1, E~N~ tot 1. Als de conversie van E~X~ naar P~X~ beter is E~X~ Q~X~dan die van naar , M~P~ wordt N-X+1 verzameld. M~Q~ Anders wordt N-X+1 verzameld. Als M~P~ en M~Q~ dezelfde waarde hebben, worden de volgende regels voor het verbreken van de gelijken gebruikt, op volgorde toegepast:

  • De cumulatieve rangschikking van conversies tussen parametertypen (waarbij argumenttypen worden genegeerd) wordt berekend op een manier die vergelijkbaar is Q~1~met de vorige rangschikking, P~1~ dus wordt vergeleken met , P~2~ Q~2~ten opzichte van , ... en P~N~ op .Q~N~ De vergelijking wordt overgeslagen als het argument is $null, of als de parametertypen geen numerieke typen zijn. De vergelijking wordt ook overgeslagen als de argumentconversie E~X~ P~X~ Q~X~informatie verliest wanneer deze wordt geconverteerd naar , maar er geen informatie verloren gaat wanneer deze wordt geconverteerd naar , of vice versa. Als de typen parameterconversies worden vergeleken, P~X~ Q~X~ wordt N-X+1 M~Q~ verzameld als de conversie van naar beter is M~P~ Q~X~ P~X~dan die van naar . Deze regel voor het verbreken van een tie is bedoeld om de voorkeur te geven aan de meest specifieke methode (dat wil zeggen, de methode met parameters met de kleinste gegevenstypen) als er geen informatie verloren gaat in conversies, of om de voorkeur te geven aan de meest algemene methode (dat wil zeggen, de methode met de parameters met de grootste gegevenstypen) als conversies leiden tot verlies van informatie.
  • Als beide methoden gebruikmaken van hun uitgebreide vorm, is de methode met meer parameters de betere methode.
  • Als de ene methode gebruikmaakt van het uit uitgebreide formulier en de andere de normale vorm, is de methode met normale vorm de betere methode.

3.7.5 Betere conversie

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

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

  • T~1~[] naar T~2~[] waar geen toewijsbare conversie tussen T~1~ en T~2~ bestaat
  • T naar tekenreeks waarbij T een type is
  • T~1~ naar T~2~ waar T~1~ of T~2~ definieer een aangepaste conversie op een door de implementatie gedefinieerde manier
  • T~1~ naar T~2~ waar T~1~ IConvertible implementeert
  • T~1~ naar T~2~ waar T~1~ of T~2~ implementeert u de methode T~2~ op_Implicit(T1)
  • T~1~ naar T~2~ waar T~1~ of T~2~ implementeert u de methode T~2~ op_Explicit(T1)
  • T~1~ to T~2~ where implementeert T~2~ een constructor waarbij één argument van het type wordt gebruikt T~1~
  • Een van de volgende conversies:
    • tekenreeks waarin T T een statische methode implementeert T Parse(string) of T Parse(string, IFormatProvider)
    • T~1~ naar T~2~ waar T~2~ een enum is en T~1~ een tekenreeks of een verzameling objecten is die kan worden geconverteerd naar tekenreeks
  • T naar PSObject, waarbij T elk type is
  • Een van de volgende conversies: Language
    • T naar bool waarbij T een numeriek type is
    • tekenreeks T naar waar T , wmisearcher, wmi, , adsi``wmiclass, adsisearcher, of is regex``type
    • T Aan bool
    • ~1~ naar waar Nullable[T~2~] een conversie van naar T~1~ T~2~ bestaat
    • T om ongeldig te worden
    • T~1~[] naar T~2~[] waar een toewijsbare conversie tussen T~1~ en T~2~ bestaat
    • T~1~ naar T~2~[] waar T~1~ een verzameling is
    • IDictionary Aan Hashtable
    • T Aan ref
    • T Aan xml
    • scriptblock Aan delegate
    • T~1~ naar T~2~ waarbij T~1~ een geheel getal is en T~2~ een enum is
  • $null naar T waar T een waardetype is
  • $null naar T waar T een verwijzingstype is
  • Een van de volgende conversies:
    • byte naar T waar T is SByte

    • UInt16naar T waar T , byteof is SByte``Int16

    • Int16 naar T waar T is SByte of byte

    • UInt32naar T waar T , byte, Int16, , UInt16of is SByte``int

    • intnaar T waar T , byte, Int16, of is SByte``UInt16

    • UInt64naar T waar T , byte, Int16, , UInt16, int, UInt32of is SByte``long

    • longnaar T waar T , byte, Int16, , UInt16, intof is SByte``UInt32

    • float naar T waar T een geheel getal is of decimal

    • double naar T waar T een geheel getal is of decimal

    • decimal to T where T is any integer type

  • Een van de volgende conversies:
    • SBytenaar T waar T , uint6, UInt32, of is byte``UInt64
    • Int16naar T waar T , UInt32of is UInt16``UInt64
    • int naar T waar T is UInt32 of UInt64
    • long Aan UInt64
    • decimal naar T waar T is float of double
  • 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 een toewijsbare conversie:
    • bytenaar T waar T , UInt16, int, , UInt32, long, UInt64, single, , double, of is Int16``decimal
    • SBytenaar T waar T , UInt16, int, , UInt32, long, UInt64, single, , double, of is Int16``decimal
    • UInt16naar T waar T , UInt32, longof , UInt64``single, double, of is int``decimal
    • Int16naar T waar T , UInt32, longof , UInt64``single, double, of is int``decimal
    • UInt32naar T waar T , of UInt64, single, doubleof is long``decimal
    • intnaar T waar T , UInt64, single, , doubleof is long``decimal
    • single Aan double
  • T~1~ naar T~2~ waarbij T~2~ een basisklasse of interface van is T~1~. Deze conversie wordt beschouwd als een toewijsbare conversie.
  • string Aan char[]
  • T naar T : deze conversie wordt beschouwd als een toewijsbare conversie.

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

3.8 Naam opzoekactie

Het is mogelijk om opdrachten van verschillende soorten te hebben die allemaal dezelfde naam hebben. De volgorde waarin de naamzoekopdracht in een dergelijk geval wordt uitgevoerd, is alias, functie, cmdlet en externe opdracht.

3.9 Opzoektypenaam

!7.1.10 bevat de instructie 'Een type-literal wordt in een implementatie vertegenwoordigd door een niet-gespecificeerd onderliggend type. Als gevolg hiervan is een typenaam een synoniem voor het onderliggende type. Voorbeeld van typen zijn int, double, long[]en Hashtable.

Typenamen worden als volgt vergeleken: Vergelijk een bepaalde typenaam met de lijst met ingebouwde typeversnellers, zoals int, long, double. Als er een overeenkomst wordt gevonden, is dat het type. Ga anders ervan uit dat de typenaam volledig gekwalificeerd is en kijk of een dergelijk type bestaat op het hostsysteem. Als er een overeenkomst wordt gevonden, is dat het type. Voeg anders het voorvoegsel van de naamruimte toe System.. Als er een overeenkomst wordt gevonden, is dat het type. Anders is de typenaam 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 wordt gebruikt door een functie of operator).

3.10 Automatisch geheugenbeheer

Verschillende operators en cmdlets resulteren in de toewijzing van geheugen voor verwijzingstypeobjecten, zoals tekenreeksen en matrices. De toewijzing en het vrij maken van dit geheugen wordt beheerd door het PowerShell-runtimesysteem. Dat wil zeggen dat PowerShell automatische garbageverzameling biedt.

3.11 Uitvoeringsorder

Een neveneffect is een wijziging in de status van de uitvoeringsomgeving van een opdracht. Een wijziging in de waarde van een variabele (via de toewijzingsoperators of de operators pre- en post-increment en decrement) is een neveneffect, net als een wijziging in de inhoud van een bestand.

Tenzij anders aangegeven, worden instructies in lexicale volgorde uitgevoerd.

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

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

3.12 Foutafhandeling

Wanneer een opdracht mislukt, wordt dit beschouwd als een fout en wordt informatie over die fout vastgelegd in een foutrecord waarvan het type niet is gespecificeerd (";4.5.15); Dit type biedt echter ondersteuning voor subscripting.

Een fout valt in een van de twee categorieën. De bewerking (een beëindigingsfout) wordt beëindigd of niet (een niet-beëindigingsfout). Met een eindfout wordt de fout vastgelegd en wordt de bewerking gestopt. Bij een niet-beëindigingsfout wordt de fout vastgelegd en wordt de bewerking voortgezet.

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

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

$Error bevat alle fouten uit alle opdrachten die zijn gecombineerd in één verzameling. 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 bevatten van de verzameling.

3.13 Pijplijnen

Een pijplijn is een reeks van een of meer opdrachten die worden gescheiden door de pijpoperator | (U+007C). Elke opdracht ontvangt invoer van zijn voorganger en schrijft uitvoer naar de opvolger. 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 om deze naar de standaarduitvoer te schrijven. Opdrachten in een pijplijn kunnen ook invoer ontvangen van argumenten. Get-ChildItemDenk bijvoorbeeld aan het volgende gebruik van opdrachten , Sort-Objecten Process-File, waarmee een lijst met bestandsnamen in een bepaalde bestandssysteemmap wordt gemaakt, een set tekstrecords wordt gesorteerd en een aantal verwerkingen op respectievelijk een tekstrecord wordt gemaakt:

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

In het eerste geval maakt een Get-ChildItem verzameling met 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 een Get-ChildItem verzameling met namen van de bestanden in de opgegeven map met behulp van het argument e:*.txt. Deze verzameling wordt geschreven Sort-Objectnaar de opdracht , die ze standaard in oplopende volgorde sorteert, gevoelig voor case (op basis van het argument CaseSensitive ). De resulterende verzameling wordt vervolgens naar de opdracht geschreven Process-File, waarmee een (onbekende) verwerking wordt uitgevoerd. De uitvoer van die opdracht wordt vervolgens omgeleid naar het bestand results.txt.

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

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

3.14 Modules

Een module is een zelfstandige, herbruikbare eenheid waarmee PowerShell-code kan worden gepart partitioneerd, geordend 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 in de module kunnen worden gebruikt. Na het importeren gedragen opdrachten en items zich alsof ze lokaal zijn gedefinieerd. Een module wordt expliciet geïmporteerd met de Import-Module opdracht . Een module kan ook automatisch worden geïmporteerd volgens een door de implementatie gedefinieerde manier.

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

Modules worden in detail besproken in :11.

3.15 Expressies met jokertekens

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

Element Beschrijving
Een ander teken dan *, ?, of [ Komt overeen met dat ene teken
* Komt overeen met nul of meer tekens. Gebruik [*] om overeen te komen met een * teken.
? Komt overeen met één teken. Om overeen te komen met een ? teken, gebruik [?].
[set]

Komt overeen met één teken uit de set, dat niet leeg mag zijn.

Als set begint met ], wordt dat vierkante haakje rechts beschouwd als onderdeel van de set en wordt de volgende vierkante haak rechts de set beëindigd; Anders wordt de set door het eerste vierkante haakje rechts beëindigd.

Als instellen begint of eindigt met -, wordt dat koppelteken beschouwd als onderdeel van de set; Anders wordt een bereik van opeenvolgende Unicode-codepunten aangegeven met de tekens aan beide zijden van het koppelteken min de scheidingstekens voor het inclusieve bereik. A-Z geeft bijvoorbeeld de 26 Nederlandse hoofdletters aan en 0-9 de 10 decimale cijfers.

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 echter backtick, niet backslash.

3.16 Reguliere expressies

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

Element Beschrijving
Een ander teken dan ., [, ^, *, $, of \ Komt overeen met dat ene teken
. Komt overeen met één teken. Om overeen te komen met een . teken, gebruik \..
[set]
[^set]

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

Als de set begint met ] of ^], wordt dat vierkante haakje rechts beschouwd als onderdeel van de set en wordt de volgende vierkante haak rechts de set beëindigd; Anders wordt de set door het eerste vierkante haakje rechts beëindigd.

Als de set begint met - of ^-, of eindigt met - , wordt dat koppelteken min beschouwd als onderdeel van de set; Anders wordt een bereik van opeenvolgende Unicode-codepunten aangegeven met de tekens aan beide zijden van het koppelteken min de scheidingstekens voor het inclusieve bereik. A-Z geeft bijvoorbeeld de 26 Nederlandse hoofdletters aan en 0-9 de 10 decimale cijfers.

* Komt overeen met nul meer exemplaren van het voorgaande element.
+ Komt overeen met een van de meer exemplaren van het voorgaande element.
? Komt overeen met nul van één exemplaar van het voorgaande element.
^ Komt overeen met aan het begin van de tekenreeks. Gebruik om overeen te komen met een ^-teken \^.
$ Komt overeen met aan het einde van de tekenreeks. Gebruik $om overeen te komen met een $-teken.
\C Escapet teken c, zodat deze niet wordt herkend als een reguliere expressie element.

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

Element Beschrijving
\p{name} Komt overeen met een teken in de benoemde tekenklasse opgegeven door de 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 de naam.
\w Komt overeen met een woordteken. Komt overeen met de Unicode-tekencategorieën [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]. Als ECMAScript-compatibel gedrag is opgegeven met de optie ECMAScript, \w is gelijk aan [a-zA-Z_0-9].
\W Komt overeen met een niet-woordteken. Komt overeen met de Unicode-categorieën [\^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}].
\s Komt overeen met een witruimteteken. Komt overeen met de Unicode-tekencategorieën [\f\n\r\t\v\x85\p{Z}].
\S Komt overeen met een niet-witruimteteken. Komt overeen met de Unicode-tekencategorieën [\^\f\n\r\t\v\x85\p{Z}].
\d Komt overeen met een decimaal cijfer. Gelijk aan \p{Nd} voor Unicode en voor [0-9] niet-Unicode-gedrag.
\D Komt overeen met een niet-cijfer. Gelijk aan \P{Nd} voor Unicode en voor [\^0-9] niet-Unicode-gedrag.

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

Element Beschrijving
* Hiermee geeft u nul of meer overeenkomsten; bijvoorbeeld of \w* Equivalent (abc)*. aan {0,}.
+ Komt overeen met herhaalde exemplaren van de voorgaande tekens.
? Hiermee geeft u nul of één overeenkomsten; bijvoorbeeld of \w? (abc)?. Gelijk aan {0,1}.
{n} Hiermee geeft u exact n overeenkomsten; (pizza){2}bijvoorbeeld .
{n,} Hiermee geeft u ten minste n overeenkomsten; (abc){2,}bijvoorbeeld .
{n,m} Hiermee geeft u ten minste n, maar niet meer dan m, komt overeen.