2017-01-08 8 views
2

스레드를 설정하고 ApartmentState = "STA"과 함께 일부 실행 코드로 시작할 수있는 방법은 무엇입니까? 이 방법을 찾았지만 스크립트 블록을 전달할 수있는 방법을 모르겠습니다.실행 가능한 scriptblock 및 ApartmentState 인수로 PowerShell에서 스레드를 어떻게 설정할 수 있습니까?

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

나는 이런 식으로,이 스레드에서 클립 보드의 텍스트를 얻을 필요가 :

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

는 또한 Start-Job을 시도했다.

$ps = [PowerShell]::Create() 
$ps.Runspace = $r 
[void]$ps.AddScript($sb) 
$ps.Invoke() 
$ps.Dispose() 
$r이 실행 영역이 열립니다

$sb 당신이 실행하려는 스크립트 블록입니다 :

답변

1

당신은 (here 참조) PowerShell을 인스턴스에서 실행 영역을 넣어해야합니다.

또한 스크립트 블록에 오류가 있습니다. Clipboard 클래스는 System.Windows.Forms 네임 스페이스의 일부이므로 System.Windows.Clipboard이 아닌 System.Windows.Forms.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() 
+0

tnks. 그리고이 스레드를 닫고 중지 또는 이와 같은 스 니스처럼 옴을 내게 말해 줄 수있어. –

+0

제 대답에 링크 된 Scripting Guy 블로그를 참조하십시오. 도움이되지 않는 경우 새로운 질문을 게시하십시오. –