Invoke-commandで変数を扱う場合の書き方

PowerShellのInvoke-commandで変数を使用する場合、少し書き方にくせがあります。

例えば、リモートサーバでCドライブのファイル一覧を確認したいとします。以下は問題なく記述できているように見えますが、実行するとエラーになります。

$drive = "C:\"
Invoke-Command -ComputerName ewindows2019 -ScriptBlock {dir $drive}

[ewindows2019] リモート サーバー ewindows2019 への接続に失敗し、次のエラー メッセージが返されました: アクセスが拒否されました。詳細については、about_Remote_Troubleshooting のヘルプ トピックを参照してください。
    + CategoryInfo          : OpenError: (ewindows2019:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : AccessDenied,PSSessionStateBroken

正しくは以下のとおりです。引数を渡すには、組み込み変数である $args 配列を使う必要があります。

$drive = "C:\"
Invoke-Command -ComputerName ewindows2019 -ScriptBlock {dir $args[0]} -ArgumentList $drive

    ディレクトリ: C:\


Mode                LastWriteTime         Length Name                                                                          PSComputerName
----                -------------         ------ ----                                                                          --------------
d-----       2018/09/15     16:19                PerfLogs                                                                      ewindows2019
d-r---       2020/06/16      5:43                Program Files                                                                 ewindows2019
d-----       2020/07/05     18:59                Program Files (x86)                                                           ewindows2019
d-----       2020/07/05     18:56                temp                                                                          ewindows2019
d-r---       2020/06/16      5:37                Users                                                                         ewindows2019
d-----       2020/06/23     21:54                Windows                                                                       ewindows2019

ただ、これだと変数が増えたときにわかりにくくなるので、型を指定しスクリプトブロック内のコマンドを文字列として書くのがわかりやすいと思います。

$drive = "C:\"
[string]$cmd = "dir " + $drive
[scriptblock]$MyScriptBlock = [scriptblock]::Create($cmd)
Invoke-Command -ComputerName ewindows2019 -ScriptBlock $MyScriptBlock

コメント

タイトルとURLをコピーしました