リモート変数について
簡単な説明
リモート コマンドのローカル変数とリモート変数の使用方法について説明します。
長い説明
リモート コンピューターで実行するコマンドで変数を使用できます。 変数に値を代入し、値の代わりに 変数を使用します。
既定では、リモート コマンドの変数は、コマンドを実行するセッションで定義されているものと見なされます。 ローカル セッションで定義されている変数は、 コマンドでローカル変数として識別する必要があります。
リモート変数の使用
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}
スプラッティングの使用
PowerShell スプラッティングは、パラメーター名と値のコレクションをコマンドに渡します。 詳細については、「 about_Splatting」を参照してください。
この例では、スプラッティング変数 は、 $Splat
ローカル コンピューターに設定されているハッシュ テーブルです。 は Invoke-Command
リモート コンピューター セッションに接続します。 ScriptBlock では、Using
スコープ修飾子と At (@
) 記号を使用して、スプラッティングされた変数を表します。
$Splat = @{ Name = "Win*"; Include = "WinRM" }
Invoke-Command -Session $s -ScriptBlock { Get-Service @Using:Splat }
PowerShell 2.0 でのローカル変数の使用
リモート コマンドのパラメーターを定義し、コマンドレットの ArgumentList パラメーター Invoke-Command
を使用してローカル変数をパラメーター値として指定することで、リモート コマンドでローカル変数を使用できます。
PowerShell 2.0 以降のバージョンでは、次のコマンド形式が有効です。
キーワード (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