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