• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:[PowerShell] メソッド内からの呼び出し)

[PowerShell] クラスのメソッド内からAdd-Typeで追加したクラスを呼び出す方法

このQ&Aのポイント
  • Win10、PowerShellでアプリの作成を行っています。Add-Typeで追加したクラスを使用することが出来ず困っています。クラスのメソッドからAdd-Typeで追加したクラスを呼び出す方法を教えてください。
  • メソッドの中からAdd-Typeで追加したクラスを呼び出すにはどうすればよいでしょうか。グローバルなファンクションを別途用意せずに、メソッド内から直接呼び出す方法を教えてください。
  • PowerShellのメソッド内からAdd-Typeで追加したクラスを呼び出す方法がわかりません。応用できる方法を教えていただけないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • ballville
  • ベストアンサー率47% (233/487)
回答No.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() とすればさすがに読み込み時にクラス定義されないのでうまくいきます。

sasaki1985
質問者

お礼

回答ありがとうございます。 > 問題は、add-typeによる読み込みより先に、クラス定義がなされてしまうことにあるようです。 そう言う事でしたか……/(^o^)\ナンテコッタイ 先述の通りfunctionなら動作したので、classをfunctionで包んでみたらワンチャン……とも思ったんですが、しっかりガードされました。 どうもスクリプト全体からクラス定義を先行してパースしてるくさいですね。なんでこんな造りになっているんだろう…… ご提案頂いた手法、両方とも選択を戸惑う類のものでしたが、無い袖は振れないので前者のアプローチを採用いたしました。 アセンブリ追加&インスタンス生成部分とクラス定義部分にファイルを分けて、前者から後者を読み込むようにしてようやっとクリア。 大変助かりました。 ご協力、どうもありがとうございました!

その他の回答 (1)

  • ballville
  • ベストアンサー率47% (233/487)
回答No.1

失敗例とありますが貼り付けたら通常通りメッセージボックスが出力されましたよ。 動作環境を詳しく提示したほうがいいと思います。 正常動作した当方の環境は $psversiontable.psversion Major Minor Build Revision ----- ----- ----- -------- 5 1 18362 145 windows 10 pro 1903

sasaki1985
質問者

お礼

回答ありがとうございます 情報が足りず申し訳ありません。 psバージョンは5.1.17763.592でwin10pro1809になります。 Windows powershell ISE を使用してデバッグ実行するとうまく行くのですが、 コマンドプロンプトから powershell -ExcutionPolisy RemoteSigned -File Ps1ファイル と言う形で呼び出すとエラーになってしまいます。 ※スマホからの打ち込みのため、細かい誤字等があったら見逃してください……

関連するQ&A