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