9

私は過去数か月間、Powershell (2.0) に手を出しており、それを使用して、作業中のプロセスの一部 (主に DOS ベースのプロセス) を最新化および標準化したいと考えています。作業の性質上、同じスクリプトが一度に約 100 回実行される可能性があります。

まず、Powershell はこの方法で使用しても「安全」ですか? -STA を実行オプションとして見たことがありますが、同じスクリプトを多数同時に実行するときに Powershell を使用するのに適した方法ですか、それとも絶対に必要な場合にのみ使用される方法ですか? 調べてみても、「いつマンションステイトを使えばいいの?」という答えがなかなか出てきません。私が行おうとしているスクリプトのすべてではないにしても、ほとんどはスレッド化されないと思います

Powershell のアパートの状態を明らかにできる方、よろしくお願いします。

4

1 に答える 1

13

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

これでアパートの状態を確認できます:

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

STA を使用する必要があるのは、.NET で、それを使用する COM オブジェクトを処理する特定のクラスを使用する場合のみです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()

問題は、なぜ PSv2 コンソールが STA ではなく MTA なのかということです。PS チームがこのような決定を下した理由を知りたいときは、通常、Bruce Payette の PowerShell in Action ブックを参照します。残念ながらその理由は語られていません。STA を必要とする COM オブジェクトがいくつかあり、スクリプトが機能しない場合は、STA として再実行してみてください。

于 2013-04-18T01:28:25.777 に答える