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를 시뮬레이션하는 더 좋은 방법이 있습니까?
'action' 이외의 다른 이름으로이 문제를 해결할 수 있습니까? 어쩌면'action1'과'action2'. –