2013-04-17 3 views
6

私は過去数ヶ月間PowerShell(2.0)を手に入れていましたが、これは主にDOSベースのプロセスで作業の一部を近代化して標準化するのに使いたいと思っています。仕事の性質のため、同じスクリプトを一度に約100回実行することができます。Powershell -sta(アパートの状態)は優先されますか?

まず、Powershellはこのように使用するのが安全ですか?私は実行オプションとして-STAを見てきました。これは、同じスクリプトを同時に実行するときにPowershellを使用する方が望ましい方法ですか、それとも絶対に必要なときにのみ使用するものなのですか?私の探しているところでは、「アパートの状態をいつ使うべきか」という答えは出ていません。私はと信じていますが、私がしようとしているすべてのスクリプトがスレッド化されているとは限りません。

Powershellアパートの状態を明かすことができる人のために事前に感謝!

+1

私が知る限り、-STAはGUIの/ Formsを使用するPowerShellコードやIEにアクセスする際に使用する必要がありますが、それ以上に便利です。 – Barb

答えて

9

PSv2では、コンソールホストはMTAとして実行され、ISEはSTAとして実行されます。 PSv3のコンソールdefaults to STA

あなたのアパートの状態はこれであるかを見ることができます。

[System.Threading.Thread]::CurrentThread.GetApartmentState() 

例えばそれを使用するCOMオブジェクトを扱う.NETで特定のクラスを使用するときにSTAを使用する必要がある唯一の時間ですSystem.Windows.Forms.Clipboard

STAに変更するには、私の知っている2つの方法があります。

powershell.exe -Sta -File MyScript.ps1 

または

$ps = [PowerShell]::Create() 
$rs = [RunSpaceFactory]::CreateRunspace() 
$rs.ApartmentState = "STA" 
$rs.ThreadOptions = "ReuseThread" 
$rs.Open() 
$ps.Runspace = $rs 
$ps.AddScript({ ([System.Threading.Thread]::CurrentThread.GetApartmentState()) }).Invoke() 

そこで質問が本当にある理由の代わりにSTAのPSV2コンソールMTAはありますか? PSチームがこのような決断を下した理由を知りたいとき、私は通常Bruce PayetteのPowerShell in Actionの本を参照します。残念ながら、それは理由を言わなかった。 STAを必要とするCOMオブジェクトがいくつかあり、スクリプトが動作しない場合は、STAとして再実行してみてください。

+0

「STAを使用する必要があるのは、.NETで使用するCOMオブジェクトを扱う特定のクラスを使用するときだけです。」 - 私はそれが私が最終的に求めていた答えだと思います。ありがとう。 – Barb

関連する問題