none
powershellでのListのstring,int以外の作成方法について RRS feed

  • 質問

  • いつも大変参考にさせていただいております。

    powershellにてジェネリッククラスを使うにあたって、List<string>やList<Int32>等については、

    New-Object 'System.Collections.Generic.List[string]'

    のようにすればよい事は調べた結果わかったのですが、List[string]やList[Int32]以外の、

    例えば外部から読み込んだクラスを持つList型を作成する方法はあるのでしょうか。

    AWSToolsforWindowsPowershellにてRoute53のレコード操作を行うにあたって、System.Collections.Generic.List<Amazon.Route53.Model.ResourceRecord>のようなクラスが必要なのですが、どのようにオブジェクトを作成すればよいかわからず困っています。

    もしわかる方がいらっしゃいましたら、ご教授いただければと思います。よろしくお願いいたします。

    2014年9月3日 1:58

すべての返信

  • 特に違いがあるわけでもないですが。

    New-Object System.Collections.Generic.List[System.Net.Sockets.TcpClient]

    みたいな。

    // PowerShell上では(型指定された)配列でも事足りるんじゃないかな……?

    2014年9月3日 2:43
  • 早速のご返信ありがとうございます。

    New-Object System.Collections.Generic.List[System.Net.Sockets.TcpClient]

    のようにすると、型:System.Collections.Generic.List[System.Net.Sockets.TcpClient]が見つかりません。この型を含むアセンブリが読み込まれている事を確認してください。

    と出てしまいます。

    List[xxxxxxxxx]のxxxxxxxxxに書いたクラスは他の場所できちんとオブジェクト化できているのでその部分が読み込まれていないという事はなさそうですが…。

    また、配列をList型のプロパティに代入しようとすると、

    "ResourceRecords" の設定中に例外が発生しました: ""System.Object[]" の値を "System.Object[]" 型から
    "System.Collections.Generic.List`1[Amazon.Route53.Model.ResourceRecord]" 型に変換できません。"

    となってしまいます。

    折角ご回答いただいたのに申し訳ありません。。

    2014年9月3日 2:55
  • > List[xxxxxxxxx]のxxxxxxxxxに書いたクラスは他の場所できちんとオブジェクト化できているのでその部分が読み込まれていないという事はなさそうですが…。

    とのことですが、標準でないアセンブリの読み込みは以下のように行われます。

    1. Add-Typeコマンドレットで明示的にアセンブリをロードする。

    2. Import-Moduleコマンドレットで対象モジュールをインポートした際、モジュールに含まれるコマンドレット等が利用するアセンブリがロードされる。

    3. まだロードされていないモジュールに含まれるコマンドレットを実行しようとした際、Cmdlet Auto Discoveryによりモジュールが自動インポートされ、アセンブリもロードされる。(PowerShell 3.0以降)

    New-ObjectでジェネリックListを作成する前に、1~3のいずれかを実行していますでしょうか?

    ちなみに当方環境(Win8.1/PS4.0、Sever2003/PS2.0)でテストしたところ、
    New-Object System.Collections.Generic.List[System.Net.Sockets.TcpClient]
    は特に前準備なしで問題なく動作しました。(標準でロードされているアセンブリに含まれるクラスなので)

    あるいは.net - Powershell Generic Collections - Stack Overflow を参照し、完全修飾クラス名を指定してNew-Objectした場合はどうなりますでしょうか。

    完全修飾クラス名は、[クラス名].Assembly.FullName で調べられます。


    2014年9月4日 4:31
    モデレータ