PowerShell での変数スコープ $Using

Rohan Timalsina 2024年2月16日
PowerShell での変数スコープ $Using

PowerShell でリモートコマンドを操作する場合、リモートセッションでローカル変数を使用したい場合があります。ただし、リモートコマンドでローカル変数を使用すると、変数がリモートセッションで作成されないため、エラーが返されます。

デフォルトでは、PowerShell は、リモートコマンドの変数が、コマンドが実行されるリモートセッションで定義されていることを想定しています。Using は、リモートコマンドでローカル変数を使用できるようにする特別なスコープ修飾子です。

Using スコープ修飾子は、ローカルセッションで定義された変数をリモートコマンドのローカル変数として識別します。PowerShell 3.0 で導入されました。

このチュートリアルでは、PowerShell の Using を使用してリモートコマンドでローカル変数を使用する方法を説明します。

PowerShell で Using スコープ修飾子を使用する

Using スコープ修飾子の構文は次のとおりです。

$Using:VariableName

Using スコープ修飾子は、ComputerNameHostNameSSHConnection、または Session パラメーターを使用する Invoke-Command で始まる、リモートで実行されるコマンドでサポートされます。

次のスクリプトは、$test 変数がローカルコンピューターで定義され、リモートセッションで使用されていることを示しています。

$test = "C:\New\complex"
Invoke-Command -ComputerName remotePC -ScriptBlock {
  Get-ChildItem $Using:test
}

最初のコマンドは、ディレクトリ C:\New\complex のパスをローカルコンピュータの $test 変数に格納します。2 番目のコマンドは、リモートコンピューターでローカル変数 $test を使用して Get-ChildItem コマンドを実行します。

その結果、リモートコンピュータのディレクトリ C:\New\complex にあるアイテムが出力されます。

出力:

Directory: C:\New\complex
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        20-12-2021     19:31         112125 architecture of aqps.png
-a----        20-12-2021     21:32          33148 formula.png
-a----        20-12-2021     21:30          55621 modules.png
-a----        20-12-2021     16:35         190485 output paper.png

PSSessionUsing スコープ修飾子を使用することもできます。

次の例では、2つの変数 $a$b がローカルセッションで作成され、リモートセッションで使用されます。 $result 変数はリモートセッションで定義され、$a$b の値の乗算を格納します。

$ps = New-PSSession -ComputerName remotePC
$a=5
$b=6
Invoke-Command -Session $ps -ScriptBlock {
$result = $Using:a*$Using:b
Write-Host The result is $result
}

出力:

The result is 30

このチュートリアルが、リモートコマンドのローカル変数に Using スコープ修飾子を使用する方法を理解するのに役立つことを願っています。詳細については、about_Remote_Variables をお読みください。

著者: Rohan Timalsina
Rohan Timalsina avatar Rohan Timalsina avatar

Rohan is a learner, problem solver, and web developer. He loves to write and share his understanding.

LinkedIn Website