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:

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 重新运行。

于 2013-04-18T01:28:25.777 回答