about_Remote_Variables
簡単な説明
リモート コマンドのローカル変数とリモート変数の使用方法について説明します。
詳細な説明
リモート コンピューターで実行するコマンドで変数を使用できます。 変数に値を割り当て、値の代わりに変数を使用します。
既定では、リモート コマンドの変数は、コマンドを実行するセッションで定義されているものと見なされます。 ローカル セッションで定義されている変数は、コマンドでローカル変数として識別する必要があります。
リモート変数の使用
PowerShell では、リモート コマンドで使用される変数は、コマンドが実行されるセッションで定義されていることを前提としています。
この例では、 $ps
変数は、 Get-WinEvent
コマンドが実行される一時セッションで定義されています。
Invoke-Command -ComputerName S1 -ScriptBlock {
$ps = "*PowerShell*"; Get-WinEvent -LogName $ps
}
コマンドが永続的なセッション ( PSSession で実行される場合は、そのセッションでリモート変数を定義する必要があります。
$s = New-PSSession -ComputerName S1
Invoke-Command -Session $s -ScriptBlock {$ps = "*PowerShell*"}
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $ps}
ローカル変数の使用
リモート コマンドではローカル変数を使用できますが、ローカル セッションで変数を定義する必要があります。
PowerShell 3.0 以降では、 Using
スコープ修飾子を使用して、リモート コマンドでローカル変数を識別できます。
Using
の構文は次のとおりです。
$Using:<VariableName>
次の例では、 $ps
変数はローカル セッションで作成されますが、コマンドが実行されるセッションで使用されます。 Using
スコープ修飾子は、$ps
をローカル変数として識別します。
$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
Get-WinEvent -LogName $Using:ps
}
Using
スコープ修飾子は、PSSessionで使用できます。
$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {Get-WinEvent -LogName $Using:ps}
$using:var
などの変数参照は、呼び出し元のコンテキストから$var
変数の値に拡張されます。 呼び出し元の変数オブジェクトにアクセスすることはできません。
Using
スコープ修飾子を使用して、PSSession内のローカル変数を変更することはできません。 たとえば、次のコードは機能しません。
$s = New-PSSession -ComputerName S1
$ps = "*PowerShell*"
Invoke-Command -Session $s -ScriptBlock {$Using:ps = 'Cannot assign new value'}
Using
の詳細については、about_Scopesを参照してください。
スプラッティングの使用
PowerShell スプラッティングでは、パラメーター名と値のコレクションがコマンドに渡されます。 詳細については、「 about_Splatting」を参照してください。
この例では、スプラッティング変数 $Splat
は、ローカル コンピューターに設定されているハッシュ テーブルです。 Invoke-Command
はリモート コンピューター セッションに接続します。 ScriptBlock は、at (@
) 記号を持つUsing
スコープ修飾子を使用して、スプラッティングされた変数を表します。
$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }
'Using' スコープ修飾子が必要なその他の状況
セッション外で実行されるスクリプトまたはコマンドの場合は、呼び出し元のセッション スコープから変数値を埋め込むために、 Using
スコープ修飾子が必要です。そのため、セッション外のコードがそれらにアクセスできます。 Using
スコープ修飾子は、次のコンテキストでサポートされています。
- ComputerName または Session パラメーター (リモート セッション) を使用して
Invoke-Command
で開始されたリモート実行コマンド Start-Job
で開始されたバックグラウンド ジョブ (アウトプロセス セッション)Start-ThreadJob
経由で開始されたスレッド ジョブ (個別のスレッド セッション)
コンテキストに応じて、埋め込み変数の値は、呼び出し元のスコープ内のデータの独立したコピーか、それに対する参照のいずれかになります。 リモート セッションとアウトプロセス セッションでは、常に独立したコピーです。 スレッド セッションでは、参照渡しされます。
変数値のシリアル化
リモートで実行されたコマンドとバックグラウンド ジョブは、アウトプロセスで実行されます。 アウトプロセス セッションでは、XML ベースのシリアル化と逆シリアル化を使用して、プロセス境界を越えて変数の値を使用できるようにします。 シリアル化プロセスは、元のオブジェクトプロパティを含むがメソッドを含まない PSObject にオブジェクトを変換します。
型のセットが制限されている場合、逆シリアル化はオブジェクトを元の型にリハイドレートします。 リハイドレートされたオブジェクトは、元のオブジェクト インスタンスのコピーです。 型のプロパティとメソッドがあります。 System.Version などの単純型の場合、コピーは正確です。 複合型の場合、コピーは不完全です。 たとえば、リハイドレートされた証明書オブジェクトには秘密キーは含まれません。
他のすべての型のインスタンスは、 PSObject インスタンスです。 PSTypeNames プロパティには、Deserialized (たとえば、Deserialized.System.Data.DataTable) でプレフィックスが付いた元の型名が含まれています
ArgumentList パラメーターでのローカル変数の使用
リモート コマンドでローカル変数を使用するには、リモート コマンドのパラメーターを定義し、Invoke-Command
コマンドレットの ArgumentList パラメーターを使用して、ローカル変数をパラメーター値として指定します。
param
キーワードを使用して、リモート コマンドのパラメーターを定義します。 パラメーター名は、ローカル変数の名前と一致する必要のないプレースホルダーです。コマンドの
param
キーワードで定義されているパラメーターを使用します。Invoke-Command
コマンドレットの ArgumentList パラメーターを使用して、ローカル変数をパラメーター値として指定します。
たとえば、次のコマンドは、ローカル セッションで $ps
変数を定義し、リモート コマンドで使用します。 このコマンドでは、パラメーター名として $log
を使用し、ローカル変数 $ps
を値として使用します。
$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
param($log)
Get-WinEvent -LogName $log
} -ArgumentList $ps
関連項目
PowerShell