about_Remote_Variables

Krátký popis

Vysvětluje, jak používat místní a vzdálené proměnné ve vzdálených příkazech.

Dlouhý popis

Proměnné můžete použít v příkazech, které spouštíte na vzdálených počítačích. Přiřaďte proměnné hodnotu a pak místo hodnoty použijte proměnnou.

Ve výchozím nastavení se proměnné ve vzdálených příkazech předpokládají, že se definují v relaci, která příkaz spouští. Proměnné definované v místní relaci musí být v příkazu identifikovány jako místní proměnné.

Použití vzdálených proměnných

PowerShell předpokládá, že proměnné použité ve vzdálených příkazech jsou definovány v relaci, ve které se příkaz spouští.

V tomto příkladu $ps je proměnná definována v dočasné relaci, ve které se Get-WinEvent příkaz spouští.

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

Pokud příkaz běží v trvalé relaci, PSSession, musí být vzdálená proměnná definována v této relaci.

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

Použití místních proměnných

Místní proměnné můžete použít ve vzdálených příkazech, ale proměnná musí být definována v místní relaci.

Počínaje PowerShellem 3.0 můžete pomocí modifikátoru Using oboru identifikovat místní proměnnou ve vzdáleném příkazu.

Syntaxe Using je následující:

$Using:<VariableName>

V následujícím příkladu $ps se proměnná vytvoří v místní relaci, ale používá se v relaci, ve které se příkaz spouští. Using Modifikátor oboru identifikuje $ps jako místní proměnnou.

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

Using Modifikátor oboru lze použít v psSession.

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

Odkaz na proměnnou, jako $using:var je například rozbalení hodnoty proměnné $var z kontextu volajícího. Nemáte přístup k objektu proměnné volajícího. Using Modifikátor oboru nelze použít k úpravě místní proměnné v rámci psSession. Například následující kód nefunguje:

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

Další informace najdete v Usingtématu about_Scopes

Použití splattingu

V PowerShellu se předá kolekce názvů parametrů a hodnot příkazu. Další informace najdete v tématu about_Splatting.

V tomto příkladu je splattingová proměnná tabulka hash, $Splat která je nastavená na místním počítači. Připojení Invoke-Command k relaci vzdáleného počítače. ScriptBlock používá Using modifikátor oboru se symbolem At (@) k reprezentaci splatted proměnné.

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

Další situace, kdy je zapotřebí modifikátor oboru Using

Pro každý skript nebo příkaz, který se spustí mimo relaci, potřebujete Using modifikátor oboru pro vložení hodnot proměnných z oboru volající relace, aby k nim mohl přistupovat kód mimo relaci. Using Modifikátor oboru je podporován v následujících kontextech:

  • Vzdáleně spouštěné příkazy, které byly spuštěny Invoke-Command pomocí parametrů ComputerName, HostName, SSH Připojení ion nebo Session (vzdálená relace)
  • Úlohy na pozadí, spuštěné s Start-Job (mimo procesovou relací)
  • Úlohy vláken, spuštěné prostřednictvím Start-ThreadJob nebo ForEach-Object -Parallel (samostatná relace vlákna)

V závislosti na kontextu jsou vložené hodnoty proměnných buď nezávislé kopie dat v oboru volajícího, nebo odkazy na ni. Ve vzdálených a zastaralých relacích jsou vždy nezávislé kopie. V relacích vláken se předávají odkazem.

Serializace hodnot proměnných

Vzdálené spouštění příkazů a úloh na pozadí dochází mimo proces. Relace mimo proces používají serializaci a deserializaci založenou na jazyce XML, aby byly hodnoty proměnných dostupné napříč hranicemi procesu. Proces serializace převede objekty na OBJEKT PSObject , který obsahuje původní objekty vlastnosti, ale ne jeho metody.

Pro omezenou sadu typů deserializace rehydruje objekty zpět do původního typu. Rehydrovaný objekt je kopie původní instance objektu. Má vlastnosti a metody typu. U jednoduchých typů, například System.Version, je kopie přesná. U složitých typů je kopie neúplná. Například rehydrované objekty certifikátu nezahrnují privátní klíč.

Instance všech ostatních typů jsou instance PSObject . Vlastnost PSTypeNames obsahuje původní název typu s předponou Deserialized, například Deserialized.System.Data.DataTable

Použití místních proměnných s parametrem ArgumentList

Místní proměnné můžete použít ve vzdáleném příkazu definováním parametrů pro vzdálený příkaz a pomocí parametru ArgumentList rutiny Invoke-Command určit místní proměnnou jako hodnotu parametru.

  • Pomocí klíčového param slova definujte parametry pro vzdálený příkaz. Názvy parametrů jsou zástupné symboly, které nemusí odpovídat názvu místní proměnné.

  • Použijte parametry definované klíčovým slovem param v příkazu.

  • Pomocí parametru ArgumentList rutiny Invoke-Command zadejte místní proměnnou jako hodnotu parametru.

Například následující příkazy definují $ps proměnnou v místní relaci a pak ji používají ve vzdáleném příkazu. Příkaz se používá $log jako název parametru a místní proměnná , $psjako jeho hodnota.

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

Viz také