2013年4月10日水曜日

Invoke-CommandでリモートPCに引数を渡す

PowershellでリモートPCを操作する方法は以下の3つらしい。


  1. <コマンドレット> -ComputerName <リモートPC>
  2. Invoke-Command -ComputerName <リモートPC> -scriptblock{Get-Service}
  3. 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


とりあえず上記を使用すれば目的は達成できそうです。


0 件のコメント:

コメントを投稿