在过去的几个月里,我一直在涉足Powershell(2.0),并且很乐意使用它来实现工作中的一些流程的现代化和标准化 - 主要是基于DOS的流程。 由于工作的性质,可能会同时执行大约100次相同的脚本执行。

首先 - Powershell以这种方式“安全”使用吗? 我已经看到-STA作为执行选项 - 是在同时执行大量相同脚本时使用Powershell的首选方法,还是仅在绝对必要时才使用的东西? 在我的搜索中,我还没有真正想出“我什么时候应该使用公寓状态?”的答案。 相信大多数(如果不是全部)我打算做的脚本都不会被线程化。

在此先感谢任何能够了解Powershell公寓状态的人!

===============>>#1 票数:12 已采纳

在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书。 不幸的是,它没有说明原因。 它只是说有一些COM对象需要STA,如果你的脚本不起作用,请尝试重新运行它作为STA。

  ask by Barb translate from so

未解决问题?本站智能推荐: