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