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:
- Get-PSProvider: haalt informatie op over een of meer providers
- Get-PSDrive: haalt informatie op over een of meer 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:
- New-Variable: Hiermee maakt u een variabele
- Set-Variable: maakt of wijzigt de kenmerken van een of meer variabelen
- Get-Variable: haalt informatie op over een of meer variabelen
- Clear-Variable: hiermee verwijdert u de waarde van een of meer variabelen
- Remove-Variable: Hiermee verwijdert u een of meer 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:
- Get-Content: haalt de inhoud van het item op
- Inhoud toevoegen: inhoud toevoegen aan de opgegeven items
- Set-Content: schrijft of vervangt de inhoud in een item
- Clear-Content: hiermee verwijdert u de inhoud van een item
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 , ... enP~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 argumentconversieE~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+1M~Q~verzameld als de conversie van naar beter isM~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~[]naarT~2~[]waar geen toewijsbare conversie tussenT~1~enT~2~bestaat- T naar tekenreeks waarbij T een type is
T~1~naarT~2~waarT~1~ofT~2~definieer een aangepaste conversie op een door de implementatie gedefinieerde manierT~1~naarT~2~waarT~1~IConvertible implementeertT~1~naarT~2~waarT~1~ofT~2~implementeert u de methodeT~2~ op_Implicit(T1)T~1~naarT~2~waarT~1~ofT~2~implementeert u de methodeT~2~ op_Explicit(T1)T~1~toT~2~where implementeertT~2~een constructor waarbij één argument van het type wordt gebruiktT~1~- Een van de volgende conversies:
- tekenreeks waarin
TTeen statische methode implementeertT Parse(string)ofT Parse(string, IFormatProvider) T~1~naarT~2~waarT~2~een enum is enT~1~een tekenreeks of een verzameling objecten is die kan worden geconverteerd naar tekenreeks
- tekenreeks waarin
Tnaar PSObject, waarbijTelk type is- Een van de volgende conversies:
Language- T naar bool waarbij
Teen numeriek type is - tekenreeks
Tnaar waarT,wmisearcher,wmi, ,adsi``wmiclass,adsisearcher, of isregex``type TAanbool- ~1~ naar waar
Nullable[T~2~]een conversie van naarT~1~T~2~bestaat Tom ongeldig te wordenT~1~[]naarT~2~[]waar een toewijsbare conversie tussenT~1~enT~2~bestaatT~1~naarT~2~[]waarT~1~een verzameling isIDictionaryAanHashtableTAanrefTAanxmlscriptblockAandelegateT~1~naarT~2~waarbijT~1~een geheel getal is enT~2~een enum is
- T naar bool waarbij
$nullnaarTwaarTeen waardetype is$nullnaarTwaarTeen verwijzingstype is- Een van de volgende conversies:
byte naar
TwaarTisSByteUInt16naarTwaarT,byteof isSByte``Int16Int16naarTwaarTisSByteofbyteUInt32naarTwaarT,byte,Int16, ,UInt16of isSByte``intintnaarTwaarT,byte,Int16, of isSByte``UInt16UInt64naarTwaarT,byte,Int16, ,UInt16,int,UInt32of isSByte``longlongnaarTwaarT,byte,Int16, ,UInt16,intof isSByte``UInt32floatnaarTwaarTeen geheel getal is ofdecimaldoublenaarTwaarTeen geheel getal is ofdecimaldecimaltoTwhereTis any integer type
- Een van de volgende conversies:
SBytenaarTwaarT,uint6,UInt32, of isbyte``UInt64Int16naarTwaarT,UInt32of isUInt16``UInt64intnaarTwaarTisUInt32ofUInt64longAanUInt64decimalnaarTwaarTisfloatofdouble
- Een van de volgende conversies:
TnaarstringwaarTeen numeriek type isTnaarcharwaarTeen numeriek type isstringnaarTwaarTeen numeriek type is
- Een van de volgende conversies, deze conversies worden beschouwd als een toewijsbare conversie:
bytenaarTwaarT,UInt16,int, ,UInt32,long,UInt64,single, ,double, of isInt16``decimalSBytenaarTwaarT,UInt16,int, ,UInt32,long,UInt64,single, ,double, of isInt16``decimalUInt16naarTwaarT,UInt32,longof ,UInt64``single,double, of isint``decimalInt16naarTwaarT,UInt32,longof ,UInt64``single,double, of isint``decimalUInt32naarTwaarT, ofUInt64,single,doubleof islong``decimalintnaarTwaarT,UInt64,single, ,doubleof islong``decimalsingleAandouble
T~1~naarT~2~waarbijT~2~een basisklasse of interface van isT~1~. Deze conversie wordt beschouwd als een toewijsbare conversie.stringAanchar[]TnaarT: 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. |
Notitie
Meer informatie vindt u in The Open Group Base Specifications: Regular Expressions, IEEE Std 1003.1, 2004 Edition..
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. |
Feedback
Feedback verzenden en weergeven voor