2012-03-21 52 views
1

跟在this question之后,看起来Select-Object将其输入设置为null作为其处理的一部分。这对我来说似乎是错误的。这里就是我想要做的事:Select-Object是否修改输入?

$sessionInput = new-object -TypeName System.Object 
$sessionInput | Add-Member -MemberType NoteProperty -Name Foo -Value $foo 
$sessionInput | Add-Member -MemberType NoteProperty -Name Bar -Value $bar 
Invoke-Command -Session $session -InputObject $sessionInput { 
    $foo = $input | Select-Object -ExpandProperty Foo 
    $bar = $input | Select-Object -ExpandProperty Bar 

    # Expected: $foo, $bar inside the session = $foo, $bar outside the session 
} 

实际发生的是,只有$foo有其预期值,并且$bar总是$null。经过一些调查,结果发现第一个Select-Object运行后$input设置为$null。例如,在两个Select-Object行之间插入$input | Get-Member会引发一个错误,指出“没有对象已被指定给get-member cmdlet”。

这是怎么回事?

回答

2

在这种情况下$ input的类型是[System.Management.Automation.Runspaces.PipelineReader`1+GetReadEnumerator>d__0[[System.Object]]]。做$inputParameters = $input | Select-Object读取管道中的物体并将其存储起来会产生所需的效果:$inputParameters的型号为PSCustomObject,并且可以通过调用Select-Object多次戳入。

+0

另外,Select-Object会创建新的对象,并复制您请求的属性的值。 – JasonMArcher 2012-05-03 19:22:54

0

这是行不通的吗?指定$ SomeVar = $ Input,然后调用它?

$sessionInput = new-object -TypeName System.Object 
$sessionInput | Add-Member -MemberType NoteProperty -Name Foo -Value $foo 
$sessionInput | Add-Member -MemberType NoteProperty -Name Bar -Value $bar 
Invoke-Command -Session $session -InputObject $sessionInput { 
    $TempInput = $input 
    $foo = $TempInput | Select-Object -ExpandProperty Foo 
    $bar = $TempInput | Select-Object -ExpandProperty Bar 

    # Expected: $foo, $bar inside the session = $foo, $bar outside the session 
} 
+0

不,同样的问题。 – alastairs 2012-03-22 10:23:11