Изменяет ли Select-Object входные данные? - PullRequest
1 голос
/ 21 марта 2012

После этого вопроса кажется, что Select-Object устанавливает в качестве входных данных значение null как часть своей обработки. Это кажется мне неправильным. Вот что я пытаюсь сделать:

$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. После небольшого исследования выясняется, что $input устанавливается на $null после первого запуска Select-Object. Например, вставка $input | Get-Member между двумя строками Select-Object приводит к ошибке, в которой говорится, что «для командлета get-member не указан объект».

Что здесь происходит?

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Тип $ input в этом случае - [System.Management.Automation.Runspaces.PipelineReader`1+GetReadEnumerator>d__0[[System.Object]]]. Выполнение $inputParameters = $input | Select-Object для считывания объекта из конвейера и его скрытия имеет желаемый эффект: $inputParameters имеет тип PSCustomObject и может несколько раз протолкнуться через вызовы Select-Object.

0 голосов
/ 22 марта 2012

Это работает? указать $ 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
}
...