Sdílet prostřednictvím


o_Vzdálených_Proměnných

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 předpokládá, že proměnné ve vzdáleném příkazu jsou definované 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 je proměnná $ps definována v dočasné relaci, ve které běží příkaz Get-WinEvent.

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

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

$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 oboru Using: 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 se v místní relaci vytvoří proměnná $ps, ale používá se v relaci, ve které se příkaz spouští. Modifikátor oboru Using: identifikuje $ps jako místní proměnnou.

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

Modifikátor oboru Using: 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 je $Using:var, se z kontextu volajícího rozšíří na hodnotu proměnné $var. Nemáte přístup k objektu proměnné volajícího. Modifikátor oboru Using: nelze použít k úpravě místní proměnné v 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 Using:naleznete v části about_Scopes.

Použití splattingu

V PowerShellu se pomocí splattingu předává kolekce názvů parametrů a jejich hodnot příkazu. Další informace najdete v about_Splatting.

V tomto příkladu je proměnná splattingu $Splat tabulkou hash, která je nastavena na místním počítači. Invoke-Command se připojuje k relaci na vzdáleném počítači. ScriptBlock používá modifikátor oboru Using: se symbolem At (@) pro reprezentaci rozložené 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 každý skript nebo příkaz, který se spustí mimo relaci, potřebujete modifikátor oboru Using: pro vložení hodnot proměnných z oboru volající relace, aby k nim byl přístup mimo kód relace. Modifikátor oboru Using: je podporován v následujících kontextech:

  • Vzdáleně spuštěné příkazy, iniciované pomocí Invoke-Command s parametry ComputerName, HostName, SSHConnection nebo Session (vzdálená relace)
  • Úlohy na pozadí, spuštěné se Start-Job (mimoprocesové sezení)
  • Úlohy vláken, spuštěné prostřednictvím Start-ThreadJob nebo ForEach-Object -Parallel (samostatná relace vlákna)

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

Serializace hodnot proměnných

Vzdálené vykonávání příkazů a úlohy na pozadí probíhají 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 PSObject, který obsahuje vlastnosti původního objektu, 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á typové vlastnosti a metody. 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 instancemi 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 použitím parametru ArgumentList rutiny Invoke-Command určit místní proměnnou jako hodnotu parametru.

  • Pomocí klíčového slova param 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 používá $Log jako název parametru a místní proměnnou, $ps, jako její hodnotu.

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

Viz také