First the Easy:
&{param($x,$Y) Write-Host "v1 X: $x Y:$y"; $x+$y} 5 6
v1 X: 5 Y:6
11
This demonstrates params come in as Args:
$script2 = [scriptBlock] { $x = $Args[0]; $y = $Args[1]; Write-Host
"v2 X: $x Y:$y"; $x+$y}
&$script2 9 10
v2 X: 9 Y:10
19
$script2.InvokeReturnAsIs(11,12)
v2 X: 11 Y:12
23
Now with a param statement:
$script3 = [scriptBlock] { param($x,$y); Write-Host "v3 X: $x Y:$y"; $x
+$y}
&$script3 13 14
v3 X: 13 Y:14
27
$script3.InvokeReturnAsIs(15,16)
v3 X: Y:
All works as expected except for the last call.
Is there any fix or work around?
PS > $script3 = [scriptBlock] { param($x,$y); Write-Host "v3 X: $x Y:$y";
$x+$y}
PS > $script3.InvokeReturnAsIs(15,16)
v3 X: 15 Y:16
31
PS > $script3.Invoke(15,16)
v3 X: 15 Y:16
31
-----
Shay Levi
$cript Fanatic
http://scriptolog.blogspot.com
-----
Shay Levi
$cript Fanatic
http://scriptolog.blogspot.com
> Works fine for me :
>
PS>> $script3 = [scriptBlock] { param($x,$y); Write-Host "v3 X: $x
PS>> Y:$y";
PS>>
> $x+$y}
>
PS>> $script3.InvokeReturnAsIs(15,16)
PS>>
> v3 X: 15 Y:16
> 31
PS>> $script3.Invoke(15,16)
PS>>
This is a little disturbing. What OS are you running on? I'm on
Windows 2003 Server.
As to why I'm needing to invoke a script, it's not worth digging into
the problem set. But as I said I get the same problem with
PSScriptMethod
How does this work for you?
$object = new-object Management.Automation.PSObject
$script1 = [scriptBlock] { param($x,$y); Write-Host "Method1 X: $x Y:
$y"; $x+$y}
$script2 = [scriptBlock] { $x = $Args[0]; $y = $Args[1]; Write-Host
"Method2 X: $x Y:$y"; $x+$y}
$member1 = new-object management.automation.PSScriptMethod "Method1",
$script1
$object.psobject.members.Add($member1)
$member2 = new-object management.automation.PSScriptMethod "Method2",
$script2
$object.psobject.members.Add($member2)
$object.Method1(5,6)
Method1 X: Y:
$object.Method2(7,8)
Method2 X: 7 Y:8
15
As for the below, you need to *capture* the new object you created, assign
it to a new variable.
$object = new-object Management.Automation.PSObject
$script1 = [scriptBlock] { param($x,$y); Write-Host "Method1 X: $x Y: $y";
$x+$y}
$script2 = [scriptBlock] { $x = $Args[0]; $y = $Args[1]; Write-Host "Method2
X: $x Y:$y"; $x+$y}
$member1 = new-object management.automation.PSScriptMethod "Method1",$script1
$object.psobject.members.Add($member1)
$member2 = new-object management.automation.PSScriptMethod "Method2",$script2
$object.psobject.members.Add($member2)
$new = $object
$new.Method1(5,6)
Method1 X: 5 Y: 6
11
$new.Method2(7,8)
Method2 X: 7 Y:8
15
-----
Shay Levi
$cript Fanatic
http://scriptolog.blogspot.com
> On Jan 18, 8:55 am, Shay Levi <n...@addre.ss> wrote:
FYI Shay et al - using named parameters in anonymous functions
(scriptblocks) is *broken* in powershell 1.0. As you can see, it`s
fixed in in 2.0 CTP.
- Oisin
I executed
$new = $object
$new.Method1(5,6)
and got:
Method1 X: Y:
There has to be some explanation. I'm fairly certain I've had the
same behavior on more than one system but they are W3K
Why would I need to "Capture" the object? What happens when you run
the method on $object?
Hey cash,
You may have missed my other post - the explanation is simple. What
you're trying to do won't work in powershell 1.0 - its broken - a bug
- foobared. Shay is using a beta of powershell 2.0 where the problem
has been fixed. You will have to use the $args collection in anonymous
scriptblocks. Named parameters with "param" doesn`t work.
Hope this helps,
- Oisin / x0n
-----
Shay Levi
$cript Fanatic
http://scriptolog.blogspot.com
> On Jan 18, 11:57 am, cashfo...@gmail.com wrote:
Cash