VB.NETやC#からPowerShellのコマンドレットを使用する その2

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();
        }
    }
}


コメント

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