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 Using
té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, spuštěné pomocí
Invoke-Command
parametru ComputerName 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
(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á , $ps
jako jeho hodnota.
$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
param($log)
Get-WinEvent -LogName $log
} -ArgumentList $ps