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 では、 スコープ修飾子Usingと At (@) 記号を使用して、スプラッター変数を表します。
$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }
"Using" スコープ修飾子が必要なその他の状況
セッション外で実行 Using されるスクリプトまたはコマンドの場合は、呼び出し元のセッション スコープから変数値を埋め込むスコープ修飾子が必要です。そのため、セッション外のコードから変数値にアクセスできます。 スコープ Using 修飾子は、次のコンテキストでサポートされています。
- ComputerName、
Invoke-CommandHostName、SSHConnection、またはセッション パラメーター (リモート セッション) を使用して開始されたリモート実行コマンド - バックグラウンド ジョブ(アウト
Start-Jobプロセス セッション) で開始 - スレッド ジョブ、または (個別の
Start-ThreadJobスレッドForEach-Object -Parallelセッション) を使用して開始
コンテキストに応じて、埋め込み変数の値は、呼び出し元のスコープ内のデータの独立したコピーまたは呼び出し元への参照のいずれかです。 リモート セッションとアウトプロセス セッションでは、それらは常に独立したコピーです。 スレッド セッションでは、参照渡しされます。
変数値のシリアル化
リモートで実行されたコマンドとバックグラウンド ジョブは、アウトプロセスで実行されます。 アウトプロセス セッションでは、XML ベースのシリアル化と逆シリアル化を使用して、プロセスの境界を越えて変数の値を使用できます。 シリアル化プロセスは、元のオブジェクトプロパティを含む PSObject にオブジェクトを変換しますが、そのメソッドは変換しません。
型のセットが限られている場合は、逆シリアル化によってオブジェクトが元の型にリレートされます。 リヒドされたオブジェクトは、元のオブジェクト インスタンスのコピーです。 型プロパティとメソッドがあります。 System.Version などの単純型 の場合、 コピーは正確です。 複合型の場合、コピーは不完全です。 たとえば、リ水分化された証明書オブジェクトには、プライベート キーは含め "されません"。
他のすべての型のインスタンスは PSObject インスタンスです。 PSTypeNames プロパティには、Deserialized.System.Data.DataTable など、プレフィックスが逆シリアル化された元の型名が含まれている
ArgumentList パラメーターでのローカル 変数の 使用
リモート コマンドでローカル変数を使用するには、リモート コマンドのパラメーターを定義し、コマンドレットの ArgumentList Invoke-Command パラメーターを使用して、ローカル変数をパラメーター値として指定します。
キーワードを使用
paramして、リモート コマンドのパラメーターを定義します。 パラメーター名は、ローカル変数の名前と一致する必要はないプレースホルダーです。コマンドで キーワードによって定義された
paramパラメーターを使用します。パラメーター値 としてローカル 変数を
Invoke-Command指定するには、コマンドレットの ArgumentList パラメーターを使用します。
たとえば、次のコマンドでは、ローカル $ps セッションで変数を定義し、リモート コマンドで使用します。 このコマンドは、 $log パラメーター名として を使用し、ローカル変数 として $psを値として使用します。
$ps = "*PowerShell*"
Invoke-Command -ComputerName S1 -ScriptBlock {
param($log)
Get-WinEvent -LogName $log
} -ArgumentList $ps
関連項目
フィードバック
フィードバックの送信と表示