Windows Vista Forums
Vista Forums Home Join Vista Forums Windows 7 Forum Vista Tutorials Tags
Welcome to Windows Vista Forums. Our forum is dedicated to helping you find solutions with any problems, errors or issues you are experiencing with Windows Vista. The Vista forum also covers news and updates and has an extensive Windows Vista tutorial section that covers a wide range of tips and tricks.


Go Back   Vista Forums > Misc Newsgroups > PowerShell

RB

Vista - Using param with InvokeReturnAsIs

Reply
 
01-18-2008   #1
cashfoley


 
 

Using param with InvokeReturnAsIs

I can't seem to use param when invoking a scriptblock using
InvokeReturnAsIs. Also, the same problem occurs when using a
PSScriptMethod. Here are some examples of what works and does not
work.

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?

My System SpecsSystem Spec
01-18-2008   #2
Shay Levi


 
 

Re: Using param with InvokeReturnAsIs

Works fine for me :

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
Quote:

> I can't seem to use param when invoking a scriptblock using
> InvokeReturnAsIs. Also, the same problem occurs when using a
> PSScriptMethod. Here are some examples of what works and does not
> work.
>
> 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?
>

My System SpecsSystem Spec
01-18-2008   #3
Shay Levi


 
 

Re: Using param with InvokeReturnAsIs

BTW, why not writing it as a function?

-----
Shay Levi
$cript Fanatic
http://scriptolog.blogspot.com
Quote:

> Works fine for me :
>
PS>> $script3 = [scriptBlock] { param($x,$y); Write-Host "v3 X: $x
PS>> Y:$y";
PS>>
Quote:

> $x+$y}
>
PS>> $script3.InvokeReturnAsIs(15,16)
PS>>
Quote:

> v3 X: 15 Y:16
> 31
PS>> $script3.Invoke(15,16)
PS>>
Quote:

> v3 X: 15 Y:16
> 31
> -----
> Shay Levi
> $cript Fanatic
> http://scriptolog.blogspot.com
Quote:

>> I can't seem to use param when invoking a scriptblock using
>> InvokeReturnAsIs. Also, the same problem occurs when using a
>> PSScriptMethod. Here are some examples of what works and does not
>> work.
>>
>> 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?
>>

My System SpecsSystem Spec
01-18-2008   #4
cashfoley


 
 

Re: Using param with InvokeReturnAsIs

On Jan 18, 8:55*am, Shay Levi <n...@xxxxxx> wrote:
Quote:

> Works fine for me :
>
> 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 Fanatichttp://scriptolog.blogspot.com
>
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



My System SpecsSystem Spec
01-18-2008   #5
Shay Levi


 
 

Re: Using param with InvokeReturnAsIs

I'm runing PowerShell CTP on WinXP SP2. I checked
the commands on a W3K SP1 box and it works.

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
Quote:

> On Jan 18, 8:55 am, Shay Levi <n...@xxxxxx> wrote:
>
Quote:

>> Works fine for me :
>>
>> 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 Fanatichttp://scriptolog.blogspot.com
> 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

My System SpecsSystem Spec
01-18-2008   #6
Oisin Grehan [MVP]


 
 

Re: Using param with InvokeReturnAsIs

On Jan 18, 11:21*am, Shay Levi <n...@xxxxxx> wrote:
Quote:

> I'm runing PowerShell CTP on WinXP SP2. I checked
> the commands on a W3K SP1 box and it works.
>
> 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 Fanatichttp://scriptolog.blogspot.com
>
>
>
Quote:

> > On Jan 18, 8:55 am, Shay Levi <n...@xxxxxx> wrote:
>
Quote:
Quote:

> >> Works fine for me :
>
Quote:
Quote:

> >> 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 Fanatichttp://scriptolog.blogspot.com
> > This is a little disturbing. *What OS are you running on? *I'm on
> > Windows 2003 Server.
>
Quote:

> > 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
>
Quote:

> > $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)
>
Quote:

> > Method2 X: 7 Y:8
> > 15- Hide quoted text -
>
> - Show quoted text -
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
My System SpecsSystem Spec
01-18-2008   #7
cashfoley


 
 

Re: Using param with InvokeReturnAsIs

On Jan 18, 10:21*am, Shay Levi <n...@xxxxxx> wrote:
Quote:

> I'm runing PowerShell CTP on WinXP SP2. I checked
> the commands on a W3K SP1 box and it works.
>
> 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 Fanatichttp://scriptolog.blogspot.com
>
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?

My System SpecsSystem Spec
01-18-2008   #8
Oisin Grehan [MVP]


 
 

Re: Using param with InvokeReturnAsIs

On Jan 18, 11:57*am, cashfo...@xxxxxx wrote:
Quote:

> On Jan 18, 10:21*am, Shay Levi <n...@xxxxxx> wrote:
>
>
>
>
>
Quote:

> > I'm runing PowerShell CTP on WinXP SP2. I checked
> > the commands on a W3K SP1 box and it works.
>
Quote:

> > As for the below, you need to *capture* the new object you created, assign
> > it to a new variable.
>
Quote:

> > $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}
>
Quote:

> > $member1 = new-object management.automation.PSScriptMethod "Method1",$script1
> > $object.psobject.members.Add($member1)
>
Quote:

> > $member2 = new-object management.automation.PSScriptMethod "Method2",$script2
> > $object.psobject.members.Add($member2)
>
Quote:

> > $new = $object
> > $new.Method1(5,6)
> > Method1 X: 5 Y: 6
> > 11
>
Quote:

> > $new.Method2(7,8)
> > Method2 X: 7 Y:8
> > 15
>
Quote:

> > -----
> > Shay Levi
> > $cript Fanatichttp://scriptolog.blogspot.com
>
> 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?- Hide quoted text -
>
> - Show quoted text -
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
My System SpecsSystem Spec
01-18-2008   #9
Shay Levi


 
 

Re: Using param with InvokeReturnAsIs

Thanks.

-----
Shay Levi
$cript Fanatic
http://scriptolog.blogspot.com
Quote:

> On Jan 18, 11:57 am, cashfo...@xxxxxx wrote:
>
Quote:

>> On Jan 18, 10:21 am, Shay Levi <n...@xxxxxx> wrote:
>>
Quote:

>>> I'm runing PowerShell CTP on WinXP SP2. I checked
>>> the commands on a W3K SP1 box and it works.
>>> 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 Fanatichttp://scriptolog.blogspot.com
>> 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?- Hide quoted text -
>>
>> - Show quoted text -
>>
> 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
>

My System SpecsSystem Spec
01-18-2008   #10
cashfoley


 
 

Re: Using param with InvokeReturnAsIs

Thanks everyone. This is less disturbing than an OS difference.

Cash
My System SpecsSystem Spec
Reply

RB


Thread Tools


Similar Threads for: Using param with InvokeReturnAsIs
Thread Forum
PowerShell param array PowerShell
What expressions can you specify in the -filter param for dir PowerShell
param VS dotsourcing PowerShell
Invoke-Item with param. PowerShell
Info: Param vs $args PowerShell


Vista Forums is an independent web site and has not been authorized,
sponsored, or otherwise approved by Microsoft Corporation.
"Windows Vista", the Start Orb, and related materials are trademarks of Microsoft Corp.
© Designer Media Ltd