- <コマンドレット> -ComputerName <リモートPC>
- Invoke-Command -ComputerName <リモートPC> -scriptblock{Get-Service}
- Enter-PSSession -ComputerName <リモートPC>
1は、コマンドレットに「-ComputerName」があればそのまま使用できるタイプ。
「PowerShellでイベントログを取得する」で使用した「Get-Eventlog」とかとか。
当然だが、全てのコマンドレットにあるわけではない。スコープはサーバ側。
2は、「-scriptblock{}」をリモートPCで実行できるコマンドレット。
スコープはクライアント側。
3は、対話モードでリモートPCに接続するコマンドレット。
リモートPCにログインするような形で接続してゴニョゴニョできる。当然スコープはクライアント側。
で、やっぱり1だけではリモートPCの管理を全てスクリプト化することは難しいので、2を使用することになるんだけど、ここで問題になったのがよくあるスコープの話。
例を書くと、
$hostname = "192.168.1.2" Invoke-Command -Computername $hostname -Scriptblock{Test-Path C:\Windows}
True
リモートPC側に「C:\Windows」ってフォルダはあるんだけど
$hostname = "192.168.1.2" $a = "C:\Windows" Invoke-Command -Computername $hostname -Scriptblock{Test-Path $a}
引数が null であるため、パラメーター 'Path' にバインドできません。 + CategoryInfo : InvalidData: (:) [Test-Path]、ParameterBindingVal idationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,M icrosoft.PowerShell.Commands.TestPathCommand + PSComputerName : 192.168.1.2
引数として書いてしまうとそんな変数なんも値ないよと。。
ということで、Invoke-Commandのヘルプとにらめっこ。
すること数分。
あやしいのを発見|д゚)チラッ
-ArgumentList <Object[]>
コマンドのローカル変数の値を指定します。コマンドの変数は、リモート コン
ピューターでのコマンドの実行前にこれらの値で置換されます。値をコンマ区切
り一覧で入力します。値は、一覧されている順に変数に関連付けられます。Argu
mentList のエイリアスは "Args" です。
ArgumentList の値は、"1024" などの実際の値にすることも、"$max" などのロ
ーカル変数の参照にすることもできます。
コマンドでローカル変数を使用するには、次のコマンド形式を使用します。
{param($<名前 1>[, $<名前 2>]...)<ローカル変数を持つコマンド>} -Argument
List <値 | $ローカル変数>
"param" キーワードには、コマンドで使用するローカル変数を列挙します。Argu
mentList パラメーターには、変数を列挙した順にその値を指定します。
さっそく実行。配列で渡るということなので
$hostname = "192.168.1.2" $a = "C:\Windows" $b = "C:\Program Files" Invoke-Command -Computername $hostname -Scriptblock{Test-Path $args[0];Test-Path $args[1]} -ArgumentList $a,$b
True True
とりあえず上記を使用すれば目的は達成できそうです。