Hatókörök a PowerShellben – CloudSavvy IT

Avatar admin | 2020.12.30. 21 Views 0 Likes 0 Ratings

21 Views 0 Ratings Rate it

Powershell logó

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!


Source link


21 Views 0 Ratings Rate it

  • Minden jog fenntartva 2019-2020. Hogyankészítsek.Hu Impresszum Adatkezelési szabályok