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
コメント