about_Remote_Variables

Rövid leírás

Ismerteti, hogyan használhat helyi és távoli változókat távoli parancsokban.

Hosszú leírás

A távoli számítógépeken futtatott parancsokban változókat használhat. Rendeljen hozzá egy értéket a változóhoz, majd használja a változót az érték helyett.

Alapértelmezés szerint a távoli parancsok változói a parancsot futtató munkamenetben lesznek definiálva. A helyi munkamenetben definiált változókat helyi változóként kell azonosítani a parancsban.

Távoli változók használata

A PowerShell feltételezi, hogy a távoli parancsokban használt változók abban a munkamenetben vannak definiálva, amelyben a parancs fut.

Ebben a példában a $ps változó abban az ideiglenes munkamenetben van definiálva, amelyben a Get-WinEvent parancs fut.

Invoke-Command -ComputerName S1 -ScriptBlock {
  $ps = "*PowerShell*"; Get-WinEvent -LogName $ps
}

Ha a parancs egy állandó munkamenetben , PSSession-ben fut, a távoli változót ebben a munkamenetben kell meghatározni.

$s = New-PSSession -ComputerName S1
Invoke-Command -Session $s -ScriptBlock {$ps = "*PowerShell*"}
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $ps}

Helyi változók használata

A helyi változókat távoli parancsokban is használhatja, de a változót a helyi munkamenetben kell definiálni.

A PowerShell 3.0-tól kezdve a Using hatókör-módosítóval azonosíthat egy helyi változót egy távoli parancsban.

A szintaxis Using a következő:

$Using:<VariableName>

Az alábbi példában a $ps változó a helyi munkamenetben jön létre, de abban a munkamenetben használatos, amelyben a parancs fut. A Using hatókör-módosító helyi változóként azonosítja $ps .

$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
  Get-WinEvent -LogName $Using:ps
}

A Using hatókör-módosító pssession-ben is használható.

$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $Using:ps}

Egy változóhivatkozás, például $using:var a hívó környezetéből kiterjeszti a változó $var értékét. Nem fér hozzá a hívó változóobjektumához. A Using hatókör-módosító nem használható helyi változó módosítására a PSSessionon belül. A következő kód például nem működik:

$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {$Using:ps = 'Cannot assign new value'}

További információ: Usingabout_Scopes

Splatting használata

A PowerShell-splatting paraméternevek és -értékek gyűjteményét továbbítja egy parancsnak. További információ: about_Splatting.

Ebben a példában a splatting változó egy kivonattábla, $Splat amely a helyi számítógépen van beállítva. A Invoke-Command rendszer távoli számítógép-munkamenethez csatlakozik. A ScriptBlock a Using hatókör módosítóját használja az At (@) szimbólummal a splatted változó megjelenítéséhez.

$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }

Egyéb helyzetek, amikor a "Használat" hatókör-módosítóra van szükség

Minden olyan szkripthez vagy parancshoz, amely munkameneten kívül fut, a hatókör-módosítónak szüksége van a Using változóértékek beágyazásához a hívási munkamenet hatóköréből, hogy a munkameneten kívüli kód hozzáférhessen hozzájuk. A Using hatókör-módosító a következő környezetekben támogatott:

  • Távolról végrehajtott parancsok, a ComputerName, a HostName, az SSH Csatlakozás ion vagy a Munkamenet paraméterek (távoli munkamenet) használatával kezdődtekInvoke-Command.
  • Háttérfeladatok, első lépések Start-Job (folyamaton kívüli munkamenet)
  • Szálfeladatok, elindítva Start-ThreadJob vagy ForEach-Object -Parallel (külön szál munkamenettel)

A környezettől függően a beágyazott változóértékek vagy a hívó hatókörében lévő adatok független másolatai, vagy azokra mutató hivatkozások. A távoli és a folyamaton kívüli munkamenetekben ezek mindig független másolatok. A szál-munkamenetekben a rendszer hivatkozással továbbítja azokat.

Változóértékek szerializálása

A távolról végrehajtott parancsok és háttérfeladatok folyamaton kívül futnak. A folyamaton kívüli munkamenetek XML-alapú szerializálással és deszerializálással teszik elérhetővé a változók értékeit a folyamathatárok között. A szerializálási folyamat olyan PSObject-objektummá alakítja az objektumokat, amely az eredeti objektumtulajdonságokat tartalmazza, a metódusait azonban nem.

Korlátozott típusok esetén a deszerializálás visszahidratálja az objektumokat az eredeti típusra. A rehidratált objektum az eredeti objektumpéldány másolata. Típustulajdonságokkal és metódusokkal rendelkezik. Az egyszerű típusok, például a System.Version esetében a másolat pontos. Összetett típusok esetén a másolat nem tökéletes. A rehidratált tanúsítványobjektumok például nem tartalmazzák a titkos kulcsot.

Az összes többi típus példányai a PSObject-példányok . A PSTypeNames tulajdonság az eredeti típusnevet tartalmazza deszerializált előtaggal, például Deserialized.System.Data.DataTable

Helyi változók használata az ArgumentList paraméterrel

A távoli parancsokban helyi változókat használhat a távoli parancs paramétereinek meghatározásával , a parancsmag Argumentumlista paraméterével Invoke-Command pedig paraméterértékként megadhatja a helyi változót.

  • Használja a kulcsszót param a távoli parancs paramétereinek meghatározásához. A paraméternevek olyan helyőrzők, amelyeknek nem kell egyeznie a helyi változó nevével.

  • Használja a parancsban a param kulcsszó által definiált paramétereket.

  • A parancsmag Argumentumlista paraméterével Invoke-Command adja meg a helyi változót paraméterértékként.

A következő parancsok például meghatározzák a változót $ps a helyi munkamenetben, majd egy távoli parancsban használják. A parancs paraméternévként és helyi változóként $pshasználja $log annak értékét.

$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
  param($log)
  Get-WinEvent -LogName $log
} -ArgumentList $ps

Lásd még