プログラミング

【Powershell】シングルスレッドとマルチスレッド対応による実行時のエラーについて

powershellで作成したバッチを右クリックの「powershellで実行」をするとエラーになることがありました。

今回は個人で使うレベルのものだったので良かったのですが、怖すぎるので解決したいと思います!

「powershellで実行」をするとエラーになる

前回powershellでUIの実装方法を書きましたが、そのバッチを右クリックの「powershellから実行]をするとエラーになります。

いろいろ調べた結果、スレッドセーフかどうかが問題なようです。

シングルスレッドじゃないと起動できないものがある

comオブジェクトに中にはスレッドセーフ(STA)でなければいけないものがあり、powershellのデフォルトはMTA(マルチスレッド)なのでエラーになるとのことです。

ただし「powershell v3.0以降」はpowershell実行がデフォルトで「スレッドセーフ」になっているためこの問題はおきないみたいです。

因みに「powershell ISE」はデフォルトで「スレッドセーフ」なので、エラーにはなりません。

しかし、職場などで勝手にバージョンを上げられない場合なんかは使用しているバッチを「STAモード」で起動しなくてはなりません。
どのようにすればいいか下記サイトを参考にさせていただきました。

sevenb.jp

#起動時に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オブジェクトはスレッドセーフでしか起動できません。

今回は勉強になりました・・・。

RECOMMEND

1

新卒で入社したけど『もう仕事を辞めたい』『我慢できない』という方に向けて。新卒入社でカフェのフロアスタッフとしてして働いたけれど、約1年で退職した私からアドバイスです。心がだめになるまで続ける必要なんてありません。

2

女性はライフステージによって休職や転職しなければいけないときがありますよね。
そこでこの記事では女性の転職に有利な資格をまとめてみました。
一生職に困らない、転職に有利な資格とはなにかご覧ください。

3

「今日は会社に行く気がしない・・。」「たまには会社をさぼりたい・・。」なんてことありませんか?本記事では、実際に私の周りで使われていた欠勤理由をご紹介します。今から使える欠勤理由です。本当に仕事に行きたくないときなど活用できると思うので、ぜひ読んでみてください。

-プログラミング

Copyright© Job search info , 2020 All Rights Reserved.