Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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-Commands 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-ThreadJobneboForEach-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
paramdefinujte 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
paramv příkazu.Pomocí parametru ArgumentList rutiny
Invoke-Commandzadejte 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é
- about_PSSessions
- o_Remote
- about_Scopes
- o_Splattingu
- about_Variables
- Invoke-Command
- ForEach-Object
- Enter-PSSession
- New-PSSession
- Start-ThreadJob