Share via


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
}

スコープ修飾子は UsingPSSession で使用できます。

$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」を参照してください。

この例では、splatting 変数は、 $Splat ローカル コンピューターに設定されているハッシュ テーブルです。 は Invoke-Command リモート コンピューター セッションに接続します。 ScriptBlock では、Usingスコープ修飾子と At (@) 記号を使用して、スプラッティングされた変数を表します。

$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }

'Using' スコープ修飾子が必要なその他の状況

セッション外で実行されるスクリプトまたはコマンドの場合は、呼び出し元のセッション スコープから変数値を埋め込むためにスコープ修飾子が必要 Using です。そのため、セッション外のコードからそれらにアクセスできます。 Usingスコープ修飾子は、次のコンテキストでサポートされています。

  • ComputerNameHostNameSSHConnection、または Session パラメーター (リモート セッション) の使用でInvoke-Command開始されたリモートで実行されたコマンド
  • バックグラウンド ジョブ(プロセス外セッション) で Start-Job 開始
  • または を使用して Start-ThreadJobForEach-Object -Parallel 開始されたスレッド ジョブ (個別のスレッド セッション)

コンテキストに応じて、埋め込み変数の値は、呼び出し元のスコープ内のデータの独立したコピー、またはそのデータへの参照のいずれかになります。 リモート セッションとアウトプロセス セッションでは、それらは常に独立したコピーです。 スレッド セッションでは、参照渡しされます。

変数値のシリアル化

リモートで実行されたコマンドとバックグラウンド ジョブは、アウトプロセスで実行されます。 アウトプロセス セッションでは、XML ベースのシリアル化と逆シリアル化を使用して、プロセスの境界を越えて変数の値を使用できるようにします。 シリアル化プロセスは、元のオブジェクト プロパティを含むが、そのメソッドは含まない PSObject にオブジェクトを変換します。

型のセットが制限されている場合、逆シリアル化によってオブジェクトが元の型にリハイドレートされます。 リハイドレートされたオブジェクトは、元のオブジェクト インスタンスのコピーです。 型のプロパティとメソッドがあります。 System.Version などの単純型の場合、コピーは正確です。 複合型の場合、コピーは不完全です。 たとえば、リハイドレートされた証明書オブジェクトには秘密キーは含まれません。

その他のすべての型のインスタンスは PSObject インスタンスです。 PSTypeNames プロパティには、逆シリアル化されたプレフィックスが付いた元の型名 (Deserialized.System.Data.DataTable など) が含まれています

ArgumentList パラメーターでローカル変数を使用する

リモート コマンドでローカル変数を使用するには、リモート コマンドのパラメーターを定義し、コマンドレットの ArgumentList パラメーターを Invoke-Command 使用してローカル変数をパラメーター値として指定します。

  • キーワード (keyword)をparam使用して、リモート コマンドのパラメーターを定義します。 パラメーター名は、ローカル変数の名前と一致する必要のないプレースホルダーです。

  • コマンドでキーワード (keyword)によって定義されたparamパラメーターを使用します。

  • パラメーター値としてローカル変数を指定するには、Invoke-Commandコマンドレットの ArgumentList パラメーターを使用します。

たとえば、次のコマンドはローカル セッションで変数を定義 $ps し、リモート コマンドで使用します。 コマンドでは、パラメーター名として を使用し、$psローカル変数 の 値として を使用$logします。

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

こちらもご覧ください