Как создать функцию, которая принимает несколько типов аргументов из конвейера и командной строки?

Я пытаюсь написать функцию, которая принимает несколько аргументов, которые могут поступать либо из командной строки, либо из конвейера. Аргументы могут быть строками или объектами каталога. Идея состоит в том, что любой из следующих вызовов должен работать:

Test-VEnv '.\MyPath', '.\AnotherPath'
Test-VEnv (dir)
'MyPath', 'AnotherPath' | Test-VEnv
dir | Test-VEnv

Следующий код почтиработает:

function Test-VEnv {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true, Position=0,
            ValueFromPipeline=$True,
            ValueFromPipelineByPropertyName=$true)]
        [Alias('FullName')]
        [String[]]$Path
    )

    process {
        foreach ($P in $Path) {
            ...
        }
    }
}

Он обрабатывает строки как из конвейера, так и аргумент команды, а также обрабатывает объекты каталогов из конвейера ( через ValueFromPipelineByPropertyName и псевдоним FullName). Но он не обрабатывает объекты каталога в командной строке, поэтому

dir | Where-Object { Test-VEnv $_ }

не работает, поскольку он преобразует объекты каталога в строки, в которых используется свойство Name, а не FullName, и последующий код завершается ошибкой.

Может ли кто-нибудь сказать мне, как добиться того, чего я хочу?

Я знаю, что даже если я смогу заставить это работать, это может быть не особенно хороший дизайн. Но, насколько я могу судить, именно так работает встроенный Test-Path, поэтому я хочу попробовать следовать стандартному поведению, прежде чем изобретать свое собственное...

11
задан Paul Moore 26 March 2012 в 19:42
поделиться