Я начинающий Powershell, хотя и не программирование n00b. Я пытаюсь создать IDisposable/RAII стиль безотказного шаблон, вроде как в:Powershell параметр namespace collision
http://www.sbrickey.com/Tech/Blog/Post/IDisposable_in_PowerShell
Так у меня есть:
Function global:FailSafeGuard
{
param (
[parameter(Mandatory=$true)] [ScriptBlock] $execute,
[parameter(Mandatory=$true)] [ScriptBlock] $cleanup
)
Try { &$execute }
Finally { &$cleanup }
}
Я пытаюсь использовать его, чтобы выполнить множество задач в другом каталоге, используя Push-Location на пути и поп-местоположение на выходе. Поэтому у меня есть:
Function global:Push-Location-FailSafe
{
param (
$location,
[ScriptBlock] $execute
)
FailSafeGuard {
Push-Location $location;
&$execute
} { Pop-Location }
}
Я считаю, что $ выполнить параметры в Push-Location-FailSafe сталкивается с $ выполнения параметров в FailSafe функции.
Push-Location-FailSafe "C:\" {dir}
The expression after '&' in a pipeline element produced an invalid object. It must result in a command name, script block or CommandInfo object.
At C:\TEMP\b807445c-1738-49ff-8109-18db972ab9e4.ps1:line:20 char:10
+ &$ <<<< execute
Причина, я думаю, что это имя столкновения, что если переименовать $ выполнить до $ execute2 в Push-Location-FailSafe, он отлично работает:
Push-Location-FailSafe "C:\" {dir}
Directory: C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2011-08-18 21:34 cygwin
d---- 2011-08-17 01:46 Dell
[snip]
Что плохого в моем понимании параметры?