web-dev-qa-db-ja.com

ローカル変数をリモートの「Invoke-Command」に渡すにはどうすればよいですか?

Invoke-Commandを使用してリモートサーバーにあるファイルのハッシュを取得しようとしています。以下のようにフルパスを指定すると、正常に機能します。

Invoke-Command -ComputerName winserver -ScriptBlock { 
    Get-FileHash -Path E:\test\testfile.Zip -Algorithm SHA1 
}

しかし、私は以下のように変数を介してファイル名を渡す必要があります:

Invoke-Command -ComputerName winserver -ScriptBlock { 
    Get-FileHash -Path "E:\test\$dest.Zip" -Algorithm SHA1 
}

リモートセッションのscriptblockでこの変数にアクセスするにはどうすればよいですか?

9
Bose

PowerShell 4(実際には3+)では、最も簡単な方法は Usingスコープ修飾子 を使用することです。

Invoke-Command -ComputerName winserver -ScriptBlock { 
    Get-FileHash E:\test\$Using:dest.Zip -Algorithm SHA1 
}

すべてのバージョンで機能するソリューションの場合:

Invoke-Command -ComputerName winserver -ScriptBlock {
    param($myDest)

    Get-FileHash E:\test\$myDest.Zip -Algorithm SHA1 
} -ArgumentList $dest
19
briantist

Tocomplementbriantistの役立つ回答

Invoke-Commandに渡されたスクリプトブロックは、リモートマシンの変数を使用して、リモートマシンで(意図したとおりに)実行されます。デフォルトでは。

したがって、local変数(値)を使用するには、追加の手順が必要です(別の言い方をすれば、リモートで実行されるスクリプトブロック内では、$dest)のように、通常のようにローカル変数を参照することはできません。

  • PSv3 +using:スコープ修飾子スクリプトブロック内のローカル変数の直接使用-briantistの最初のコマンドを参照してください。

    • using:は、Invoke-Commandが実際にリモートマシンをターゲットにしている場合にのみ機能することに注意してください。
  • 以前のバージョンでも機能する唯一のオプションは、ローカル変数をパラメーターとしてスクリプトブロックに渡すことです。-briantistの2番目のコマンドを参照してください。

詳細については、Get-Help about_Remote_Variablesまたは オンラインドキュメント を参照してください。

8
mklement0