VB.NETやC#からPowerShellのコマンドレットを使用する その2
今回紹介する例は Creating a Console Application that Runs a Specified Script を参考にしたものです。
(というか使用しているコマンドレットを変更し、自分なりの解説をしてみただけ…です)
VB.NETやC#からコマンドレットを実行するには、invokeメソッドを使用することについて説明したわけですが、このメソッドは3つのオーバーロードメソッドがあります。
このオーバーロードメソッドの中に引数が3つあるタイプのもを使用すると、実行するスクリプトへ値を渡したり、エラーを受け取ったりすることが可能です。
今回実験するコードは
VB.NETやC#からGet-Serviceコマンドレットを使用して、サービス名が"WMI","Messenger","HIRO"というデータを取得するというものです。
このときサービス名が"HIRO"というものは存在せずエラーが発生することを想定しています。
まずは、Get-Serviceでサービス名が"WMI","Messenger","HIRO"のデータを取り出す方法ですが、PowerShellでは
PS > $SrvNames = "WMI","Messenger","HIRO"PS > $SrvNames | Get-Service -Name { $_ }
のように記述します。
VB.NETやC#で実現するには、前回説明したように事前に参照設定に System.Windows.Management 追加し、Imports(VB.NET)やUsing(C#)で名前空間を追加してから行ってください。
ではコードの説明です。
(1)Get-Serviceコマンドレットで取得するサービス名をString型の配列で事前準備しておきます。
(2)実行するスクリプトを準備します
(3)スクリプト実行用のinvokerを準備します
(4)スクリプト実行時に発生するエラーを格納する変数を準備します
(5)For Eachでinvokeメソッドで取り出した結果を処理します。(この辺の説明は前回を参照)
ここで使用しているinvokeメソッドですが、第1引数に実行するスクリプト、第2引数にスクリプトへ渡す値、第3引数にエラーを受け取る変数 をそれぞれ指定しています。
第2引数に渡した値は、変数 script の$SrvNamesに渡されます。
(6)受け取ったエラーをFor Eachで出力します。
VB.NET
Imports System.Management.Automation
Module Module1
Sub Main()
Dim serviceNames As String() = {"WMI", "Messenger", "HIRO"}・・・・・(1)
Dim script As String = "$input | Get-Service -name {$_}"・・・・・(2)
Dim invoker As New RunspaceInvoke・・・・・(3)
Dim errors As System.Collections.IList = Nothing・・・・・(4)
For Each result As PSObject In invoker.Invoke(script, serviceNames, errors)
Console.WriteLine("{0,-15}{1}", _・・・・・(5)
result.Members("Status").Value, _
result.Members("Name").Value)
Next
For Each er In errors・・・・・(6)
Console.WriteLine(er.ToString())
Next
Console.ReadLine()
End Sub
End Module
C#
using System.Management.Automation;
namespace Sample2
{
class Program
{
static void Main(string[] args)
{
string[] serviceNames = new string[] {"WMI", "Messenger", "HIRO" };・・・・・(1)
string script = "$input | Get-Service -name {$_}";・・・・・(2)
RunspaceInvoke invoker = new RunspaceInvoke();・・・・・(3)
System.Collections.IList errors = null;・・・・・(4)
foreach (PSObject result in invoker.Invoke(script, serviceNames, out errors))・・・・・(5)
{
Console.WriteLine("{0,-15}{1}",
result.Members["Status"].Value,
result.Members["Name"].Value);
}
foreach (PSObject err in errors)・・・・・(6)
{
System.Console.WriteLine(" error: {0}", err.ToString());
}
Console.ReadLine();
}
}
}
コメント