Как я могу получить исходный объект конвейера при использовании ValueFromPipelineByPropertyName?

Я создаю командлет на С#.

При связывании параметров с использованием ValueFromPipelineByPropertyName=true мне часто хотелось бы передать исходный объект конвейера, из которого были связаны свойства, обратно в конвейер. Как я могу получить ссылку на этот исходный объект?

Итак, если это мой командлет

[Cmdlet(VerbsLifecycle.Start, "Foo")]
public class StartFooCommand : PSCmdlet
{
    [Parameter(Position = 0, Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
    public String Name { get; set; }

    protected override void ProcessRecord()
    {
        // Perform various Foo-related activities...

        Object pipelineObject = GetTheObjectPassedInFromThePipeline();

        WriteObject(pipelineObject);
    }
}

Я хотел бы иметь это в своем сценарии

# $foo would be some return value from another cmdlet
$foo = New-Object PSObject -prop @{ Name = "Frank"; Bar = "Baz" }
$foo | Get-Foo | Use-Foo
#    ^         ^ Here I want to pass the original $foo object to the next cmdlet
#    L Name gets bound from my object to my property

person Chad Schouggins    schedule 08.01.2018    source источник
comment
Опубликуйте соответствующий код, демонстрирующий ваше требование.   -  person Andy G    schedule 08.01.2018


Ответы (1)


Вам просто нужно включить еще один параметр с атрибутом ValueFromPipeline=$true.

person Mike Shepard    schedule 08.01.2018
comment
Великолепно! Мне даже в голову не приходило, что сам объект конвейера будет привязываться к одному параметру в дополнение к привязке его свойств к другим параметрам. - person Chad Schouggins; 08.01.2018
comment
Обычно я так не делаю, но это работает. :-) - person Mike Shepard; 08.01.2018
comment
Сомневаюсь, что у многих так. Я уверен, что все это ужасная идея, но я недостаточно опытен с PS, чтобы понять, что меня наверняка укусит позже;) - person Chad Schouggins; 08.01.2018
comment
Я не думаю, что это ужасная идея, но мне никогда не приходилось этим заниматься. Несколько встроенных команд позволяют выводить исходный объект с помощью переключателя -Passthru, но сделать это только с ValueFromPipelineByPropertyName было бы очень сложно. - person Mike Shepard; 09.01.2018