在过去的几个月里,我一直在涉足Powershell(2.0),并且很乐意使用它来实现工作中的一些流程的现代化和标准化 - 主要是基于DOS的流程.由于工作的性质,可能会同时执行大约100次相同的脚本执行.
首先 - Powershell以这种方式"安全"使用吗?我已经看到-STA作为执行选项 - 是在同时执行大量相同脚本时使用Powershell的首选方法,还是仅在绝对必要时才使用的东西?在我的搜索中,我还没有真正想出"我什么时候应该使用公寓状态?"的答案.我相信大多数(如果不是全部)我打算做的脚本都不会被线程化.
在此先感谢任何能够了解Powershell公寓状态的人!
And*_*ndi 12
在PSv2中,控制台主机作为MTA运行,ISE作为STA运行.在PSv3中,控制台默认为STA.
你可以看到你的公寓状态:
[System.Threading.Thread]::CurrentThread.GetApartmentState()
Run Code Online (Sandbox Code Playgroud)
您需要使用STA的唯一时间是在.NET中使用某些类来处理使用它的COM对象,例如System.Windows.Forms.Clipboard.
我知道有两种方法可以更改为STA:
powershell.exe -Sta -File MyScript.ps1
Run Code Online (Sandbox Code Playgroud)
要么
$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()
Run Code Online (Sandbox Code Playgroud)
所以问题真的是为什么PSv2控制台MTA而不是STA?当我想知道为什么PS团队做出这样的决定时,我通常会参考Bruce Payette的PowerShell in Action书.不幸的是,它没有说明原因.它只是说有一些COM对象需要STA,如果你的脚本不起作用,请尝试重新运行它作为STA.
| 归档时间: |
|
| 查看次数: |
5360 次 |
| 最近记录: |