过去几个月我一直在使用Powershell(2.0),并且很乐意使用它来实现工作中的一些流程的现代化和标准化 - 主要是基于DOS的流程。由于工作的性质,可能会同时执行大约100次相同的脚本执行。
首先 - Powershell以这种方式“安全”使用吗?我已经看到-STA作为执行选项 - 是在同时执行大量相同脚本时使用Powershell的首选方法,还是仅在绝对必要时才使用的东西?在我的搜索中,我还没有真正想出“我什么时候应该使用公寓状态?”的答案。我相信大多数,如果不是我打算做的所有脚本都不会被线程化。
提前感谢任何可以了解Powershell公寓状态的人!
答案 0 :(得分:11)
在PSv2中,控制台主机作为MTA运行,ISE作为STA运行。在PSv3中,控制台defaults to 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一书。不幸的是,它没有说明原因。它只是说有一些COM对象需要STA,如果你的脚本没有工作,请尝试重新运行它作为STA。