在 PSv2 中,控制台主机作为 MTA 运行,ISE 作为 STA 运行。在 PSv3 中,控制台默认为 STA。
您可以通过以下方式查看您的公寓状态:
[System.Threading.Thread]::CurrentThread.GetApartmentState()
唯一需要使用 STA 的时候是在 .NET 中使用某些类来处理使用它的 COM 对象,例如System.Windows.Forms.Clipboard
.
我知道有两种方法可以更改为 STA:
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 控制台 MTA 而不是 STA?当我想知道为什么 PS 团队会做出这样的决定时,我通常会参考 Bruce Payette 的 PowerShell in Action 一书。不幸的是,它没有说明原因。它只是说有一些需要 STA 的 COM 对象,如果您的脚本不起作用,请尝试将其作为 STA 重新运行。