2014-12-09 2 views
2

RAII- 스타일 리소스를 PowerShell에서 구현하려고합니다. 좋은 아이디어로 try-block에서 리소스를 얻은 다음 finally-block에서 다시 릴리스하는 것이 었습니다 (finally-block이 실행 됨이 보장되므로). 가끔 내 리소스가 서로 의존하므로 중첩 된 방식을 사용합니다.중첩 된 스크립트 블록 범위 지정 및 try ... finally

내 자원 (1)과 같이 획득

합니다 (lenghty 코드 죄송합니다, 그것은을 단축 할 수있는 방법을 찾을 수 없습니다) : 다음과 같이 윤곽은 2 일에 따라 달라

function withResource1 { 
    param([Parameter(Mandatory=$true)][scriptblock]$action) 

    try { 
     write-host "acquire resource1" 

     <# ... compute resource 1... #> 
     $resource1 = "<this is the resource>" 

     invoke-command -scriptBlock $action -args $resource1 
    } finally { 
     write-host "release resource1" 
     <# ... #> 
    } 
} 

자원을, 그래서 나는 취득 그것은이 좋아 :

지금
function withResource2 { 
    param([Parameter(Mandatory=$true)][scriptblock]$action) 

    withResource1 { param($res1) 
     try { 
      write-host "acquire resource2" 

      <# ... compute resource2, using resource1 ... #> 
      $resource2 = "<and this is the other resource>" 

      invoke-command -scriptBlock $action -args $resource2 
     } finally { 
      write-host "release resource2" 
      <# ... #> 
     } 
    } 
} 

는 (적어도 나는 생각했다), I는 다음과 같이 자원 2를 사용할 수 있습니다

withResource2 { param($res2) 
    write-host "I'm happy to have '$res2', which depends on resource 1" 
} 

출력이 예상 됨

acquire resource1 
acquire resource2 
I'm happy to have '<and this is the other resource>', which depends on resource 1 
release resource2 
release resource1 

그러나 실제로 발생한 일은 무한 루프였습니다. 문제는 어떤 종류의 범위 지정 문제 인 것 같습니다. action의 이름을 , withResource2으로 변경하면 모든 것이 예상대로 작동하기 때문에 문제가되는 것 같습니다.

내가 원하는 것을 어떻게 얻을 수 있습니까? PowerShell에서 RAII를 시뮬레이션하는 더 좋은 방법이 있습니까?

답변

0

좋아요, 알았습니다. withResource2 내의 try - 블록 내부

은 범위 0에서 어떤 변수 $action 없다 즉

get-variable -name action -scope 0 

action라는 변수를 찾을 수 없다. 따라서 부모 범위 (withResource1의 범위)이고 $actionscope 1은 내가 withResource1에 제공하는 스크립트 블록과 정확하게 관련되어 있습니다. 그것을 호출하면 무한 루프가 발생합니다. 실제로 withResource2try - 블록에 전화를하고 싶었 무엇

2 범위 이상입니다 withResource2에있는 $action입니다. 그래서

invoke-command -scriptBlock (get-variable -name action -scope 2).Value -args $resource2 

withResource2에서 invoke-command - 라인을 변경하면 트릭을 수행합니다.

+0

'action' 이외의 다른 이름으로이 문제를 해결할 수 있습니까? 어쩌면'action1'과'action2'. –