- ベストアンサー
[PowerShell] クラスのメソッド内からAdd-Typeで追加したクラスを呼び出す方法
- Win10、PowerShellでアプリの作成を行っています。Add-Typeで追加したクラスを使用することが出来ず困っています。クラスのメソッドからAdd-Typeで追加したクラスを呼び出す方法を教えてください。
- メソッドの中からAdd-Typeで追加したクラスを呼び出すにはどうすればよいでしょうか。グローバルなファンクションを別途用意せずに、メソッド内から直接呼び出す方法を教えてください。
- PowerShellのメソッド内からAdd-Typeで追加したクラスを呼び出す方法がわかりません。応用できる方法を教えていただけないでしょうか。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
当方でも確認できました。 問題は、add-typeによる読み込みより先に、クラス定義がなされてしまうことにあるようです。ですので、スクリプト名が test.ps1だとすれば <コマンドプロンプト(実行ポリシーは設定されているものとします)> powershell -command "add-type -assembly system.windows.forms; test.ps1" とやれば、正常に表示されます(スクリプト側でのadd-typeは不要)。 しかし、add-typeを先に実行しようとして add-type -assembly system.windows.forms sleep 1 class~以下略 とやっても無意味です。ps1ファイルの読み込みと同時にクラス定義されてしまうようです。 ですが、スクリプトを Add-Type -Assembly System.Windows.Forms invoke-expression @" class ClsTest { exec() { [System.Windows.Forms.MessageBox]::Show("めっせーじ!") } } "@ $obj = New-Object ClsTest $obj.exec() とすればさすがに読み込み時にクラス定義されないのでうまくいきます。
その他の回答 (1)
- ballville
- ベストアンサー率47% (233/487)
失敗例とありますが貼り付けたら通常通りメッセージボックスが出力されましたよ。 動作環境を詳しく提示したほうがいいと思います。 正常動作した当方の環境は $psversiontable.psversion Major Minor Build Revision ----- ----- ----- -------- 5 1 18362 145 windows 10 pro 1903
お礼
回答ありがとうございます 情報が足りず申し訳ありません。 psバージョンは5.1.17763.592でwin10pro1809になります。 Windows powershell ISE を使用してデバッグ実行するとうまく行くのですが、 コマンドプロンプトから powershell -ExcutionPolisy RemoteSigned -File Ps1ファイル と言う形で呼び出すとエラーになってしまいます。 ※スマホからの打ち込みのため、細かい誤字等があったら見逃してください……
お礼
回答ありがとうございます。 > 問題は、add-typeによる読み込みより先に、クラス定義がなされてしまうことにあるようです。 そう言う事でしたか……/(^o^)\ナンテコッタイ 先述の通りfunctionなら動作したので、classをfunctionで包んでみたらワンチャン……とも思ったんですが、しっかりガードされました。 どうもスクリプト全体からクラス定義を先行してパースしてるくさいですね。なんでこんな造りになっているんだろう…… ご提案頂いた手法、両方とも選択を戸惑う類のものでしたが、無い袖は振れないので前者のアプローチを採用いたしました。 アセンブリ追加&インスタンス生成部分とクラス定義部分にファイルを分けて、前者から後者を読み込むようにしてようやっとクリア。 大変助かりました。 ご協力、どうもありがとうございました!