powershellで作成したバッチを右クリックの「powershellで実行」をするとエラーになることがありました。
今回は個人で使うレベルのものだったので良かったのですが、怖すぎるので解決したいと思います!
「powershellで実行」をするとエラーになる
前回powershellでUIの実装方法を書きましたが、そのバッチを右クリックの「powershellから実行]をするとエラーになります。
いろいろ調べた結果、スレッドセーフかどうかが問題なようです。
シングルスレッドじゃないと起動できないものがある
comオブジェクトに中にはスレッドセーフ(STA)でなければいけないものがあり、powershellのデフォルトはMTA(マルチスレッド)なのでエラーになるとのことです。
ただし「powershell v3.0以降」はpowershell実行がデフォルトで「スレッドセーフ」になっているためこの問題はおきないみたいです。
因みに「powershell ISE」はデフォルトで「スレッドセーフ」なので、エラーにはなりません。
しかし、職場などで勝手にバージョンを上げられない場合なんかは使用しているバッチを「STAモード」で起動しなくてはなりません。
どのようにすればいいか下記サイトを参考にさせていただきました。
#起動時にMTAモードの場合STAモードで起動する。 if( ([Threading.Thread]::CurrentThread.GetApartmentState()) -eq "MTA"){ #STAモードで自分自身をよぶ powershell -sta -file $MyInvocation.MyCommand.Path }
起動時にMTAモードの場合STAモードで自分を呼びだしています。
$MyInvocation.MyCommand.Path
これで自分がいるパスを取得できます。
右クリックで実行できないときはホントあせりました(゚Д゚;)
実行はpowersell ISEからのほうがいいみたいですね。
powershellでなくても、UIを使う場合スレッドセーフかどうかは考えなくてはいけないことのようです・・・
まとめ
UIを使う場合はシングルスレッドかマルチスレッドに対応しているか確認が必要!
Excelなどを操作するcomオブジェクトはスレッドセーフでしか起動できません。
今回は勉強になりました・・・。