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 k proměnné hodnotu a pak použijte proměnnou místo hodnoty.

Ve výchozím nastavení se proměnné ve vzdálených příkazech předpokládají, že jsou definovány 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žívané ve vzdálených příkazech jsou definovány v relaci, ve které příkaz běží.

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

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

Když 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

Ve vzdálených příkazech můžete použít místní proměnné, 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é příkaz běží. Using Modifikátor oboru identifikuje $ps jako místní proměnnou.

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

Modifikátor Using 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, například $using:var rozbalí hodnotu 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 o Usingnástroji about_Scopes

Použití splattingu

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

V tomto příkladu je proměnná $Splat splatting tabulka hash, 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 splattované proměnné.

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

Další situace, kdy je potřeba modifikátor oboru Using

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

  • Vzdáleně spouštěné příkazy, které se spustily Invoke-Command pomocí parametrů ComputerName, HostName, SSHConnection nebo Relace (vzdálená relace)
  • Úlohy na pozadí, zahájené ( Start-Job mimo procesovou relaci)
  • Ú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 na něj odkazy. 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žené na JAZYCE XML k zpřístupnění hodnot proměnných 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 k původnímu typu. Rehydrovaný objekt je kopie původní instance objektu. Má vlastnosti a metody typu. U jednoduchých typů, jako je System.Version, je kopie přesná. U složitých typů je kopie nedostupná. 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 předponu Deserialized, například Deserialized.System.Data.DataTable

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

Pomocí místních proměnných ve vzdáleném příkazu můžete definovat parametry pro vzdálený příkaz a pomocí parametru Invoke-CommandArgumentList rutiny zadat místní proměnnou jako hodnotu parametru parametru.

  • Pomocí klíčového param slova můžete definovat 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 Invoke-CommandArgumentList rutiny 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 používá $log jako název parametru a místní proměnnou $psjako jeho hodnotu.

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

Viz také