Számos programozási nyelvben létezik a hatókör fogalma. Meghatározva, hogy milyen változók és függvények milyen kontextusban érhetők el. Példa erre, ha egy változó minden PowerShell-parancsfájl függvényében elérhető, vagy csak egyetlen meghatározott függvény. PowerShell hatókörök több különböző alkalmazható hatókört foglal magában, mint például a Globális, a Helyi vagy a Script hatóköröket.
Mik a PowerShell hatókörök?
Amint a bevezetőben említettük, számos elsődleges hatókör létezik. Ezek globális, helyi és szkriptek, és megmondják a PowerShellnek, hogy milyen változók és függvények milyen kontextusban érhetők el. A hatókörök hivatkozásakor általában hatókör előtagokat használ az aktuális, helyi hatókörön kívüli változók eléréséhez. Ezt a legkönnyebb példákkal megérteni.
Globális hatály
A globális hatókör azt jelenti, hogy egy változó minden függvényhez és parancshoz elérhető lesz, helytől függetlenül, például $MyVar = $True
vagy $Global:MyVar = $True
. A PowerShell elindításakor az összes kezdeti változó globális hatókörbe tartozik. Ha nincs gyermek hatókör, akkor a globális megegyezik a helyi és a szkript hatókörével, amíg a gyermek hatókörök nem léteznek.
# This is in the Global scope
$MyVar = $True
Function Test-VariableScope {
# When a variable is not found in the current scope, look up till it is found
Write-Host "Global Scope: $MyVar"
# Redefine the variable in the Local scope
$MyVar = $False
Write-Host "Local Scope: $MyVar"
Write-Host "Global Scope: $($Global:MyVar)"
}
Test-VariableScope
# Since the Locally scoped variable does not exist anymore, return the Global scope
Write-Host "Global Scope: $MyVar"
Helyi hatókör
A jelenlegi hatókör mindig helyi, ezért az alapértelmezett hatókör is. Ha egy változónál nem alkalmaznak hatókör-módosítót, akkor a hatókör lokális, például $MyVar = $True
. A helyi hatókört nehéz megérteni, mivel ez a hatókör az aktuális helyhez viszonyul, és egy helyi változó egyszerre különböző hatókörökben lehet.
# This is in the Local scope (and Global scope since at root of script)
$MyVar = $True
Write-Host "Local Scope: $MyVar"
Write-Host "Local Scope Explicit: $($Local:MyVar)"
Function Test-VariableScope {
# This variable is in the Local scope relative to Test-VariableScope
$MyVar = $False
Write-Host "Local Scope: $MyVar"
Write-Host "Local Scope (Explicit): $($Local:MyVar)"
}
Test-VariableScope
# This variable is back to the local scope initially defined
Write-Host "Local Scope: $MyVar"
Write-Host "Local Scope Explicit: $($Local:MyVar)"
Amikor pontforrást ad egy szkriptről, például
. my-script.ps1
, hozzáadja a szkript teljes kimenetét a helyi hatókörhöz!
Script Scope
Végül a szkript hatóköre egy kicsit bonyolultabb. Vagy a legközelebbi előd szkriptfájl hatóköre, vagy globális hatókör, ha nem egy olyan szkriptfájlban fut, mint például $script:var = $true
. A globális, a szkript és a helyi hatókör megegyezik a $MyVar = $True
változó, ha egyetlen szkriptben, sőt függvényekben is használják.
# This is in the Script scope including Script and Local scope
$MyVar = $True
Write-Host "Script Scope: $($Script:MyVar)"
Function Test-VariableScope {
# This variable is in the Local scope relative to Test-VariableScope
$MyVar = $False
# The Script scope references the same as $MyVar variable initially defined
Write-Host "Script Scope: $($Script:MyVar)"
}
Test-VariableScope
# This variable is back to the Script scope initially defined
Write-Host "Script Scope: $($Script:MyVar)"
Ellentétben a szkript pontforrásával, amely mindent hozzáad a helyi hatókörhöz, a &
A call operator futtatja a szkriptet, de mindent a szkript hatókörében hagy, ami magához a szkripthez viszonyul.
Mi a Privát, a Használat, a Munkafolyamat és az AllScope beállítás?
Az általános hatókörökkel együtt számos lehetőség módosíthatja a változók láthatóságát vagy elérhetőségét. Tehát mik ezek a különböző lehetőségek a hatókörökkel?
A magánkör módosítója
Ha egy változót vagy álnevet privátként határoz meg, akkor a változó vagy álnév csak az adott kontextuson belül látható és módosítható. Amint az alábbi példából látható, a
Remove-Variable TestVar
Remove-Variable TestVar2
Remove-Variable TestVar3
# Two ways to create a private variable, note that this is an Option and not a Scope (applied to a scoped variable)
New-Variable -Name 'TestVar' -Value $True -Scope 'Global' -Option 'Private'
$Private:TestVar2 = $True
Write-Host "Global Scope (TestVar): $TestVar"
Write-Host "Global Scope (TestVar2): $TestVar"
$TestVar3 = $True
Function Test-Function {
# Since the first two variables are private they are not seen
Write-Host "Local Scope (TestVar): $TestVar"
Write-Host "Local Scope (TestVar2): $TestVar2"
# TestVar3 does not exist locally so PowerShell looks up and finds a non-Private variable in Global
Write-Host "Local Scope (TestVar3): $TestVar3"
}
Test-Function
Mi a módosító használata?
Ez egy speciális változó, amelyet a parancsmagok és a konstrukciók használnak Invoke-Command
, Start-Job
, Start-ThreadJob
, vagy ForEach-Object -Parallel
. Ez csak akkor működik Invoke-Command
amikor távoli számítógépen fut, például a ComputerName
paraméter.
# Normally the LocalCSVData variable will not be available to the scriptblock running on the remote computer without the Using modifier.
$LocalCSVData = Import-CSV -Path 'mydata.csv'
Invoke-Command -ComputerName 'RemoteComputer' -ScriptBlock {
$Using:LocalCSVData | ForEach-Object {
...do something...
}
}
Munkafolyamat és az AllScope
Bár sokkal kevésbé használják, van két további módosító. A Workflow
módosítóval a PowerShell munkafolyamatban szereplő változók hivatkozhatók (a PowerShell Core / 7 rendszerben nem érhető el). A AllScope
A módosító minden változóban elérhetővé teszi a változót. Ez azt is jelenti, hogy ha a változó gyermekkörben módosul, akkor a gyökérkörökben is tükröződik. Ez az egyik módja annak, hogy elkerüljük a változó előtaggal való elhelyezését globálissal, amikor megpróbáljuk a gyermekkörökben hivatkozni rá.
Következtetés
A hatókörök hasznosak a változók, függvények és álnevek láthatóságának és elérhetőségének korlátozásában. A hatókörök akkor is problémásak lehetnek, ha nem világos, hogy egy változó milyen hatókörű. Remélhetőleg ez a cikk rávilágít arra, hogyan használják a hatóköröket a PowerShellben, és mit tehet velük!