【问题标题】:Is Powershell -sta (apartment state) preferred?Powershell -sta(公寓状态)是首选吗?
【发布时间】:2013-04-10 22:10:17
【问题描述】:

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

首先——以这种方式使用 Powershell “安全”吗?我已经将 -STA 视为一个执行选项 - 在同时执行大量相同脚本时,这是使用 Powershell 的首选方法,还是仅在绝对必要时才使用这种方法?在我的搜索中,我还没有真正想出“我什么时候应该使用公寓状态?”的答案。我相信我打算编写的大部分脚本都不会被线程化。

提前感谢任何可以了解 Powershell 公寓状态的人!

【问题讨论】:

  • 据我所知,-STA 需要在使用 GUI/Forms 的 powershell 代码中使用,或者在访问 IE 时使用,但除此之外,它有用吗?

标签: powershell sta


【解决方案1】:

在 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 身份重新运行它。

【讨论】:

  • “您需要使用 STA 的唯一情况是在 .NET 中使用某些类来处理使用它的 COM 对象”——我认为这就是我最终寻求的答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多