如何在PowerShell中使用可执行的scriptblock和ApartmentState参数设置线程?

时间:2017-01-08 06:24:49

标签: powershell clipboard apartments

如何设置线程并使用ApartmentState = "STA"的某些可执行代码启动它?我只是找到了这种方法,但我不知道如何将脚本块传递给它。

$r = [RunspaceFactory]::CreateRunspace()
$r.ApartmentState = 'STA'
$r.Open()

我需要在这个帖子中获取剪贴板文本,如下所示:

$getclipboardtext = [System.Windows.Clipboard]::GetText()
$getclipboardtext | Out-File c:\examplepath

我也试过Start-Job

1 个答案:

答案 0 :(得分:1)

您需要将运行空间放在PowerShell实例中(请参阅here):

$ps = [PowerShell]::Create()
$ps.Runspace = $r
[void]$ps.AddScript($sb)
$ps.Invoke()
$ps.Dispose()

其中$r是您打开的运行空间,$sb是您要执行的脚本块。

您的scriptblock中也有错误。 Clipboard类是System.Windows.Forms命名空间的一部分,因此它是System.Windows.Forms.Clipboard,而不是System.Windows.Clipboard。另外,您需要先加载相应的组件。

完整示例:

$sb = {
  Add-Type -Assembly 'System.Windows.Forms'
  [Windows.Forms.Clipboard]::GetText() | Out-File 'C:\path\to\output.txt'
}

$ps = [PowerShell]::Create()
$ps.Runspace = [RunspaceFactory]::CreateRunspace()
$ps.Runspace.ApartmentState = 'STA'
$ps.Runspace.Open()
[void]$ps.AddScript($sb)
$ps.Invoke()
$ps.Dispose()